From 156a08a953eaebaeae8efbf84217da2d0a8a21b5 Mon Sep 17 00:00:00 2001 From: robin92 Date: Fri, 15 May 2020 16:32:09 +0200 Subject: [PATCH 01/62] first work for multi channel grabber. Added AddInAbstractGrabber and AddInMultiChannelGrabber --- AddInManager/pluginModel.cpp | 2 +- CMakeLists.txt | 3 +- Qitom/widgets/AIManagerWidget.cpp | 4 +- common/addInGrabber.h | 86 ++++-- common/sources/addInGrabber.cpp | 481 +++++++++++++++++++++--------- 5 files changed, 405 insertions(+), 171 deletions(-) diff --git a/AddInManager/pluginModel.cpp b/AddInManager/pluginModel.cpp index 896ae509a..a8b8216eb 100644 --- a/AddInManager/pluginModel.cpp +++ b/AddInManager/pluginModel.cpp @@ -1454,7 +1454,7 @@ bool PlugInModel::getIsGrabberInstance(tItemType &itemType, size_t &internalData if(itemType == PlugInModel::itemInstance) //internalData can be casted to AddInBase { ito::AddInBase *aib = (ito::AddInBase*)(internalData); - if(aib->inherits("ito::AddInGrabber")) + if(aib->inherits("ito::AddInAbstractGrabber")) { return true; } diff --git a/CMakeLists.txt b/CMakeLists.txt index b31c3b8f3..5738e7653 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,9 +19,8 @@ # along with itom. If not, see . cmake_minimum_required(VERSION 3.1) - project(itom) - + message(STATUS "--------------- PROJECT itom -----------------") include(cmake/ItomBuildMacros.cmake) diff --git a/Qitom/widgets/AIManagerWidget.cpp b/Qitom/widgets/AIManagerWidget.cpp index 92f4f732f..2c8ce4899 100644 --- a/Qitom/widgets/AIManagerWidget.cpp +++ b/Qitom/widgets/AIManagerWidget.cpp @@ -926,7 +926,7 @@ void AIManagerWidget::mnuShowLiveImage() if (index.isValid()) { ito::AddInBase *ais = (ito::AddInBase *)index.internalPointer(); - if (ais && ais->inherits("ito::AddInGrabber")) + if (ais && ais->inherits("ito::AddInAbstractGrabber")) { UiOrganizer *uiOrg = (UiOrganizer*)AppManagement::getUiOrganizer(); QString defaultPlotClassName; @@ -973,7 +973,7 @@ void AIManagerWidget::mnuSnapDialog() if (index.isValid()) { ito::AddInBase *ais = (ito::AddInBase *)index.internalPointer(); - if (ais && ais->inherits("ito::AddInGrabber")) + if (ais && ais->inherits("ito::AddInAbstractGrabber")) { ito::RetVal retval = ito::retOk; QPointer aisPointer((ito::AddInDataIO*)ais); diff --git a/common/addInGrabber.h b/common/addInGrabber.h index 4067d9c6f..fc05a573f 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -38,9 +38,11 @@ namespace ito { - class AddInGrabberPrivate; + class AddInAbstractGrabberPrivate; + class AddInGrabberPrivate; + class AddInMultiChannelGrabberPrivate; - class ITOMCOMMONQT_EXPORT AddInGrabber : public ito::AddInDataIO + class ITOMCOMMONQT_EXPORT AddInAbstractGrabber : public ito::AddInDataIO { Q_OBJECT @@ -54,22 +56,12 @@ namespace ito */ int m_started; - AddInGrabberPrivate *dd; + AddInAbstractGrabberPrivate *dd; protected: void timerEvent (QTimerEvent *event); /*!< this method is called every time when the auto-grabbing-timer is fired. Usually you don't have to overwrite this method. */ - //! implement this method in order to check if m_image should be (re)allocated with respect to the current sizex, sizey, bpp... - /*! - Call this method if the size or bitdepth of your camera has changed (e.g. in your constructor, too). In this method, compare if the new size - is equal to the old one. If this is not the case, use the following example to set m_image to a newly allocated dataObject. The old dataObject - is deleted automatically with respect to its internal reference counter: - - m_image = ito::DataObject(futureHeight,futureWidth,futureType); - \see m_image - */ - virtual ito::RetVal checkData(ito::DataObject *externalDataObject = NULL); //! implement this method in your camera plugin. In this method the image is grabbed and stored in the m_image variable. /*! @@ -81,7 +73,7 @@ namespace ito */ virtual ito::RetVal retrieveData(ito::DataObject *externalDataObject = NULL) = 0; - ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ + virtual ito::RetVal sendDataToListeners(int waitMS) = 0; /*!< sends m_data to all registered listeners. */ inline int grabberStartedCount() { return m_started; } /*!< returns the number of started devices \see m_started */ @@ -112,13 +104,71 @@ namespace ito runStatusChanged( value > 0 ); } - ito::DataObject m_data; /*!< variable for the recently grabbed image */ - public: - AddInGrabber(); - ~AddInGrabber(); + AddInAbstractGrabber(); + ~AddInAbstractGrabber(); }; + + class ITOMCOMMONQT_EXPORT AddInGrabber : public AddInAbstractGrabber + { + Q_OBJECT + private: + + AddInGrabberPrivate *dd; + protected: + ito::DataObject m_data; /*!< variable for the recently grabbed image*/ + + //! implement this method in order to check if m_image should be (re)allocated with respect to the current sizex, sizey, bpp... + /*! + Call this method if the size or bitdepth of your camera has changed (e.g. in your constructor, too). In this method, compare if the new size + is equal to the old one. If this is not the case, use the following example to set m_image to a newly allocated dataObject. The old dataObject + is deleted automatically with respect to its internal reference counter: + + m_image = ito::DataObject(futureHeight,futureWidth,futureType); + + \see m_image + */ + virtual ito::RetVal checkData(ito::DataObject *externalDataObject = NULL); + + virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ + public: + AddInGrabber(); + ~AddInGrabber(); + + }; + + class ITOMCOMMONQT_EXPORT AddInMultiChannelGrabber : public AddInAbstractGrabber + { + Q_OBJECT + private: + AddInMultiChannelGrabberPrivate *dd; + protected: + + struct ChannelContainer + { + ito::DataObject data; + QMap m_channelParam; + ChannelContainer() {}; + ChannelContainer(ito::Param sizex, ito::Param sizey, ito::Param bpp) + { + m_channelParam.insert("sizex",sizex); + m_channelParam.insert("sizey",sizey); + m_channelParam.insert("bpp", bpp); + } + }; + QMap m_data; /*!< Map for recently grabbed images of various channels*/ + virtual ito::RetVal checkData(ito::DataObject *externalDataObject = NULL); + virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ + ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ + void addChannel(QString name, ito::Param sizex, ito::Param sizey, ito::Param bpp); + public: + AddInMultiChannelGrabber(); + ~AddInMultiChannelGrabber(); + }; + + + } //end namespace ito #endif //#if !defined(Q_MOC_RUN) || defined(ITOMCOMMONQT_MOC) diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index f6771dc55..bfddde31c 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -25,22 +25,30 @@ along with itom. If not, see . *********************************************************************** */ -#include "addInGrabber.h" +#include "AddInGrabber.h" #include #include namespace ito { - class AddInGrabberPrivate + class AddInAbstractGrabberPrivate { public: int m_nrLiveImageErrors; //number of consecutive errors when automatically grabbing the next image. If this number becomes bigger than a threshold, auto grabbing will be disabled. }; + class AddInGrabberPrivate + { + + }; + class AddInMultiChannelGrabberPrivate + { + + }; /*! - \class AddInGrabber - \brief Inherit from AddInGrabber if you write a camera/grabber plugin. Please call the constructor of AddInGrabber within your plugin constructor. + \class AddInAbstractGrabber + \brief Inherit from AddInAbstractGrabber if you write a camera/grabber plugin. Please call the constructor of AddInAbstractGrabber within your plugin constructor. This class contains important variables and helper methods which simplify the creation of a camera plugin. Please consider that you should implement the methods checkImage() and retriveImage() (pure virtual in this class) in your own class. @@ -50,87 +58,27 @@ namespace ito //---------------------------------------------------------------------------------------------------------------------------------- //! constructor - AddInGrabber::AddInGrabber() : + AddInAbstractGrabber::AddInAbstractGrabber() : AddInDataIO(), m_started(0) { - dd = new AddInGrabberPrivate(); + dd = new AddInAbstractGrabberPrivate(); dd->m_nrLiveImageErrors = 0; } //---------------------------------------------------------------------------------------------------------------------------------- //! destructor - AddInGrabber::~AddInGrabber() + AddInAbstractGrabber::~AddInAbstractGrabber() { DELETE_AND_SET_NULL(dd); } - - //---------------------------------------------------------------------------------------------------------------------------------- - //! sends m_image to all registered listeners. - /*! - This method is continuously called from timerEvent. Also call this method from your getVal-Method (usually with 0-timeout) - - \param [in] waitMS indicates the time (in ms) that should be waiting until every registered live image source node received m_image. 0: no wait, -1: infinit waiting time, else time in milliseconds - \return retOk if everything was ok, retWarning if live image could not be invoked - */ - ito::RetVal AddInGrabber::sendDataToListeners(int waitMS) - { - QObject *obj; - ito::RetVal retValue = ito::retOk; -// int i=0; - int size = m_autoGrabbingListeners.size(); - - if (waitMS == 0) - { - foreach(obj, m_autoGrabbingListeners) - { - if (!QMetaObject::invokeMethod( obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_data))), Q_ARG(ItomSharedSemaphore*, NULL))) - { - retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); - } - } - } - else if (m_autoGrabbingListeners.size() > 0) - { - ItomSharedSemaphore** waitConds = new ItomSharedSemaphore*[size]; - int i=0; - - foreach(obj, m_autoGrabbingListeners) - { - waitConds[i] = new ItomSharedSemaphore(); - // \todo On Linux a crash occurs here when closing the liveImage ... maybe the same reason why we get an error message on windows? - if (!QMetaObject::invokeMethod( obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) - { - retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); - } - - i++; - } - - for (i = 0; i < size; i++) - { - if (!waitConds[i]->wait(waitMS)) - { - qDebug() << "timeout in number: " << i << "number of items: " << size; - } - waitConds[i]->deleteSemaphore(); - waitConds[i] = NULL; - } - - delete[] waitConds; - waitConds = NULL; - } - - return retValue; - } - //---------------------------------------------------------------------------------------------------------------------------------- //! if any live image has been connected to this camera, this event will be regularly fired. /*! This event is continoulsy fired if auto grabbing is enabled. At first, the image is acquired (method acquire). Then the image is retrieved (retrieveImage) and finally the newly grabbed image is send to all registered listeners (sendImagetoListeners) */ - void AddInGrabber::timerEvent (QTimerEvent * /*event*/) + void AddInAbstractGrabber::timerEvent (QTimerEvent * /*event*/) { QCoreApplication::sendPostedEvents(this,0); ito::RetVal retValue = ito::retOk; @@ -188,85 +136,322 @@ namespace ito } } } + //---------------------------------------------------------------------------------------------------------------------------------- + //! constructor + AddInGrabber::AddInGrabber() : + AddInAbstractGrabber() + { + dd = new AddInGrabberPrivate(); + } + + //---------------------------------------------------------------------------------------------------------------------------------- + //! destructor + AddInGrabber::~AddInGrabber() + { + DELETE_AND_SET_NULL(dd); + } + //---------------------------------------------------------------------------------------------------------------------------------- + ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) + { + int futureHeight = m_params["sizey"].getVal(); + int futureWidth = m_params["sizex"].getVal(); + int futureType; + + int bpp = m_params["bpp"].getVal(); + if (bpp <= 8) + { + futureType = ito::tUInt8; + } + else if (bpp <= 16) + { + futureType = ito::tUInt16; + } + else if (bpp <= 32) + { + futureType = ito::tInt32; + } + else + { + futureType = ito::tFloat64; + } + if (!m_params.contains("sizez")) + { + + if (externalDataObject == NULL) + { + if (m_data.getDims() < 2 || m_data.getSize(0) != (unsigned int)futureHeight || m_data.getSize(1) != (unsigned int)futureWidth || m_data.getType() != futureType) + { + m_data = ito::DataObject(futureHeight, futureWidth, futureType); + } + } + else + { + int dims = externalDataObject->getDims(); + if (externalDataObject->getDims() == 0) + { + *externalDataObject = ito::DataObject(futureHeight, futureWidth, futureType); + } + else if (externalDataObject->calcNumMats() != 1) + { + return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object has more or less than 1 plane. It must be of right size and type or an uninitilized image.").toLatin1().data()); + } + else if (externalDataObject->getSize(dims - 2) != (unsigned int)futureHeight || externalDataObject->getSize(dims - 1) != (unsigned int)futureWidth || externalDataObject->getType() != futureType) + { + return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); + } + } + } + else + { + int numChannel = m_params["sizez"].getVal(); + if (externalDataObject == NULL) + { + if (m_data.getDims() < 3 || m_data.getSize(0) != (unsigned int)numChannel || m_data.getSize(1) != (unsigned int)futureHeight || m_data.getSize(2) != (unsigned int)futureWidth || m_data.getType() != futureType) + { + m_data = ito::DataObject(numChannel, futureHeight, futureWidth, futureType); + } + } + else + { + int dims = externalDataObject->getDims(); + if (externalDataObject->getDims() == 0) + { + *externalDataObject = ito::DataObject(numChannel, futureHeight, futureWidth, futureType); + } + else if (externalDataObject->getSize(dims - 3) != (unsigned int)numChannel || externalDataObject->getSize(dims - 2) != (unsigned int)futureHeight || externalDataObject->getSize(dims - 1) != (unsigned int)futureWidth || externalDataObject->getType() != futureType) + { + return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); + } + } + } + + return ito::retOk; + } + //---------------------------------------------------------------------------------------------------------------------------------- + //! sends m_image to all registered listeners. + /*! + This method is continuously called from timerEvent. Also call this method from your getVal-Method (usually with 0-timeout) + + \param [in] waitMS indicates the time (in ms) that should be waiting until every registered live image source node received m_image. 0: no wait, -1: infinit waiting time, else time in milliseconds + \return retOk if everything was ok, retWarning if live image could not be invoked + */ + ito::RetVal AddInGrabber::sendDataToListeners(int waitMS) + { + QObject *obj; + ito::RetVal retValue = ito::retOk; + // int i=0; + int size = m_autoGrabbingListeners.size(); + + if (waitMS == 0) + { + foreach(obj, m_autoGrabbingListeners) + { + if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_data))), Q_ARG(ItomSharedSemaphore*, NULL))) + { + retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); + } + } + } + else if (m_autoGrabbingListeners.size() > 0) + { + ItomSharedSemaphore** waitConds = new ItomSharedSemaphore*[size]; + int i = 0; + + foreach(obj, m_autoGrabbingListeners) + { + waitConds[i] = new ItomSharedSemaphore(); + // \todo On Linux a crash occurs here when closing the liveImage ... maybe the same reason why we get an error message on windows? + if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) + { + retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); + } + + i++; + } + + for (i = 0; i < size; i++) + { + if (!waitConds[i]->wait(waitMS)) + { + qDebug() << "timeout in number: " << i << "number of items: " << size; + } + waitConds[i]->deleteSemaphore(); + waitConds[i] = NULL; + } + + delete[] waitConds; + waitConds = NULL; + } + + return retValue; + } + + //---------------------------------------------------------------------------------------------------------------------------------- + //! constructor + AddInMultiChannelGrabber::AddInMultiChannelGrabber() : + AddInAbstractGrabber() + { + dd = new AddInMultiChannelGrabberPrivate(); + } + + //---------------------------------------------------------------------------------------------------------------------------------- + //! destructor + AddInMultiChannelGrabber::~AddInMultiChannelGrabber() + { + DELETE_AND_SET_NULL(dd); + } + ////---------------------------------------------------------------------------------------------------------------------------------- + ////! sends m_image to all registered listeners. + ///*! + //This method is continuously called from timerEvent. Also call this method from your getVal-Method (usually with 0-timeout) + + //\param [in] waitMS indicates the time (in ms) that should be waiting until every registered live image source node received m_image. 0: no wait, -1: infinit waiting time, else time in milliseconds + //\return retOk if everything was ok, retWarning if live image could not be invoked + //*/ + ito::RetVal AddInMultiChannelGrabber::sendDataToListeners(int waitMS) + { + QObject *obj; + ito::RetVal retValue = ito::retOk; + // int i=0; + int size = m_autoGrabbingListeners.size(); + char* defChannel = m_params["defaultChannel"].getVal(); + if (m_data.contains(defChannel)) + { + if (waitMS == 0) + { + foreach(obj, m_autoGrabbingListeners) + { + if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_data[defChannel].data))), Q_ARG(ItomSharedSemaphore*, NULL))) + { + retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); + } + } + } + else if (m_autoGrabbingListeners.size() > 0) + { + ItomSharedSemaphore** waitConds = new ItomSharedSemaphore*[size]; + int i = 0; + + foreach(obj, m_autoGrabbingListeners) + { + waitConds[i] = new ItomSharedSemaphore(); + // \todo On Linux a crash occurs here when closing the liveImage ... maybe the same reason why we get an error message on windows? + if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_data[defChannel].data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) + { + retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); + } + + i++; + } + + for (i = 0; i < size; i++) + { + if (!waitConds[i]->wait(waitMS)) + { + qDebug() << "timeout in number: " << i << "number of items: " << size; + } + waitConds[i]->deleteSemaphore(); + waitConds[i] = NULL; + } + + delete[] waitConds; + waitConds = NULL; + } + } + else + { + retValue += ito::RetVal(ito::retError, 1001, tr("channel not found in channel map").toLatin1().data()); + } + + return retValue; + } + + ito::RetVal ito::AddInMultiChannelGrabber::checkData(ito::DataObject *externalDataObject) + { + unsigned int futureType, bpp; + if (!externalDataObject) + { + + QMutableMapIterator i(m_data); + while (i.hasNext()) { + i.next(); + bpp = i.value().m_channelParam["bpp"].getVal(); + if (bpp <= 8) + { + futureType = ito::tUInt8; + } + else if (bpp <= 16) + { + futureType = ito::tUInt16; + } + else if (bpp <= 32) + { + futureType = ito::tInt32; + } + else + { + futureType = ito::tFloat64; + } + if (i.value().data.getDims() < 2 || i.value().data.getSize(0) != (unsigned int)i.value().m_channelParam["sizey"].getVal() || i.value().data.getSize(1) != (unsigned int)i.value().m_channelParam["sizex"].getVal() || i.value().data.getType() != futureType) + { + i.value().data = ito::DataObject(i.value().m_channelParam["sizey"].getVal(), i.value().m_channelParam["sizex"].getVal(), futureType); + } + + } + } + else + { + char* channel = m_params["defaultChannel"].getVal(); + if (m_data.contains(channel)) + { + bpp = m_data[channel].m_channelParam["bpp"].getVal(); + if (bpp <= 8) + { + futureType = ito::tUInt8; + } + else if (bpp <= 16) + { + futureType = ito::tUInt16; + } + else if (bpp <= 32) + { + futureType = ito::tInt32; + } + else + { + futureType = ito::tFloat64; + } + if (externalDataObject->getDims() == 0) + { + *externalDataObject = ito::DataObject(m_data[channel].m_channelParam["sizey"].getVal(), m_data[channel].m_channelParam["sizex"].getVal(), futureType); + } + else if (externalDataObject->calcNumMats() != 1) + { + return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object has more or less than 1 plane. It must be of right size and type or an uninitilized image.").toLatin1().data()); + } + else if (externalDataObject->getSize(externalDataObject->getDims() - 2) != (unsigned int)m_data[channel].m_channelParam["sizey"].getVal() || externalDataObject->getSize(externalDataObject->getDims() - 1) != (unsigned int)m_data[channel].m_channelParam["sizex"].getVal() || externalDataObject->getType() != futureType) + { + return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); + } + } + } + return ito::retOk; + } + + void AddInMultiChannelGrabber::addChannel(QString name, ito::Param sizex, ito::Param sizey, ito::Param bpp) + { + ChannelContainer a(sizex, sizey, bpp); + m_data[name] = a; + + } + ito::RetVal AddInMultiChannelGrabber::adaptDefaultChannelParams() + { + ito::RetVal retVal(ito::retOk); + char* channel = m_params["defaultChannel"].getVal(); + return retVal; + + + } - //---------------------------------------------------------------------------------------------------------------------------------- - // Now functions for multiliveimages - ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) - { - int futureHeight = m_params["sizey"].getVal(); - int futureWidth = m_params["sizex"].getVal(); - int futureType; - - int bpp = m_params["bpp"].getVal(); - if (bpp <= 8) - { - futureType = ito::tUInt8; - } - else if (bpp <= 16) - { - futureType = ito::tUInt16; - } - else if (bpp <= 32) - { - futureType = ito::tInt32; - } - else - { - futureType = ito::tFloat64; - } - if (!m_params.contains("sizez")) - { - - if (externalDataObject == NULL) - { - if (m_data.getDims() < 2 || m_data.getSize(0) != (unsigned int)futureHeight || m_data.getSize(1) != (unsigned int)futureWidth || m_data.getType() != futureType) - { - m_data = ito::DataObject(futureHeight, futureWidth, futureType); - } - } - else - { - int dims = externalDataObject->getDims(); - if (externalDataObject->getDims() == 0) - { - *externalDataObject = ito::DataObject(futureHeight, futureWidth, futureType); - } - else if (externalDataObject->calcNumMats() != 1) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object has more or less than 1 plane. It must be of right size and type or an uninitilized image.").toLatin1().data()); - } - else if (externalDataObject->getSize(dims - 2) != (unsigned int)futureHeight || externalDataObject->getSize(dims - 1) != (unsigned int)futureWidth || externalDataObject->getType() != futureType) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); - } - } - } - else - { - int numChannel = m_params["sizez"].getVal(); - if (externalDataObject == NULL) - { - if (m_data.getDims() < 3 || m_data.getSize(0) != (unsigned int)numChannel || m_data.getSize(1) != (unsigned int)futureHeight || m_data.getSize(2) != (unsigned int)futureWidth || m_data.getType() != futureType) - { - m_data = ito::DataObject(numChannel ,futureHeight, futureWidth, futureType); - } - } - else - { - int dims = externalDataObject->getDims(); - if (externalDataObject->getDims() == 0) - { - *externalDataObject = ito::DataObject(numChannel, futureHeight, futureWidth, futureType); - } - else if (externalDataObject->getSize(dims - 3) != (unsigned int)numChannel || externalDataObject->getSize(dims - 2) != (unsigned int)futureHeight || externalDataObject->getSize(dims - 1) != (unsigned int)futureWidth || externalDataObject->getType() != futureType) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); - } - } - } - - return ito::retOk; - } - - //---------------------------------------------------------------------------------------------------------------------------------- } //end namespace ito + From 8eb7b58f581eb142d05d260f42918f70045b1cc5 Mon Sep 17 00:00:00 2001 From: robin92 Date: Thu, 24 Sep 2020 11:26:10 +0200 Subject: [PATCH 02/62] AddInAbstractGrabber: started implementation of pixel format string --- common/addInGrabber.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/common/addInGrabber.h b/common/addInGrabber.h index fc05a573f..eac66d2db 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -59,6 +59,14 @@ namespace ito AddInAbstractGrabberPrivate *dd; protected: + enum pixelFormat + { + mono8 = ito::tUInt8, + mono10 = ito::tUInt16, + mono12 = ito::tUInt16, + mono16 = ito::tUInt16, + rgb32 = ito::tRGBA32, + }; void timerEvent (QTimerEvent *event); /*!< this method is called every time when the auto-grabbing-timer is fired. Usually you don't have to overwrite this method. */ @@ -152,6 +160,7 @@ namespace ito ChannelContainer() {}; ChannelContainer(ito::Param sizex, ito::Param sizey, ito::Param bpp) { + m_channelParam.insert("sizex",sizex); m_channelParam.insert("sizey",sizey); m_channelParam.insert("bpp", bpp); @@ -162,6 +171,7 @@ namespace ito virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ void addChannel(QString name, ito::Param sizex, ito::Param sizey, ito::Param bpp); + public: AddInMultiChannelGrabber(); ~AddInMultiChannelGrabber(); From 058c2a675039a0b3878ba9dc7d1cca03be093d49 Mon Sep 17 00:00:00 2001 From: robin92 Date: Wed, 30 Sep 2020 13:14:00 +0200 Subject: [PATCH 03/62] AddInMultiChannelGrabber: further work done --- common/addInGrabber.h | 43 +++++--- common/sources/addInGrabber.cpp | 175 ++++++++++++++++++++++++-------- 2 files changed, 158 insertions(+), 60 deletions(-) diff --git a/common/addInGrabber.h b/common/addInGrabber.h index eac66d2db..0c11babaf 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -45,7 +45,21 @@ namespace ito class ITOMCOMMONQT_EXPORT AddInAbstractGrabber : public ito::AddInDataIO { Q_OBJECT - + public: + enum PixelFormat + { + mono8 = ito::tUInt8, + mono10 = ito::tUInt16, + mono12 = ito::tUInt16, + mono16 = ito::tUInt16, + rgb32 = ito::tRGBA32, + }; +#if QT_VERSION < 0x050500 + //for >= Qt 5.5.0 see Q_ENUM definition below + Q_ENUMS(PixelFormat) +#else + Q_ENUM(PixelFormat) +#endif private: //! counter indicating how many times startDevice has been called /*! @@ -59,14 +73,10 @@ namespace ito AddInAbstractGrabberPrivate *dd; protected: - enum pixelFormat - { - mono8 = ito::tUInt8, - mono10 = ito::tUInt16, - mono12 = ito::tUInt16, - mono16 = ito::tUInt16, - rgb32 = ito::tRGBA32, - }; + + int pixelFormatStringToBpp(char* val); /*!< this method returns the size of a pixel for a given pixelFormat */ + int pixelFormatStringToEnum(char* val, bool* ok); /*!< this method maps a string to a value of pixelFormat */ + void timerEvent (QTimerEvent *event); /*!< this method is called every time when the auto-grabbing-timer is fired. Usually you don't have to overwrite this method. */ @@ -116,6 +126,7 @@ namespace ito AddInAbstractGrabber(); ~AddInAbstractGrabber(); + }; class ITOMCOMMONQT_EXPORT AddInGrabber : public AddInAbstractGrabber @@ -158,19 +169,21 @@ namespace ito ito::DataObject data; QMap m_channelParam; ChannelContainer() {}; - ChannelContainer(ito::Param sizex, ito::Param sizey, ito::Param bpp) + ChannelContainer(ito::Param roi, ito::Param pixelFormat, ito::Param sizex, ito::Param sizey) { - - m_channelParam.insert("sizex",sizex); - m_channelParam.insert("sizey",sizey); - m_channelParam.insert("bpp", bpp); + m_channelParam.insert("pixelFormat",pixelFormat); + m_channelParam.insert("roi", roi); + m_channelParam.insert("sizex", sizex); + m_channelParam.insert("sizey", sizey); + } }; QMap m_data; /*!< Map for recently grabbed images of various channels*/ virtual ito::RetVal checkData(ito::DataObject *externalDataObject = NULL); virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ - void addChannel(QString name, ito::Param sizex, ito::Param sizey, ito::Param bpp); + void addChannel(QString name); + ito::RetVal setBaseParam(ito::Param param,bool &ok); /*!< sets and updates all related base params. ok is set to true if param was set and all related params are updated sucessfully. */ public: AddInMultiChannelGrabber(); diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index bfddde31c..2a4e0f245 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -29,6 +29,8 @@ #include #include +#include + namespace ito { @@ -72,7 +74,58 @@ namespace ito { DELETE_AND_SET_NULL(dd); } - //---------------------------------------------------------------------------------------------------------------------------------- + + //---------------------------------------------------------------------------------------------------------------------------------- + //! this method returns the size of a pixel for a given pixelFormat. + int AddInAbstractGrabber::pixelFormatStringToBpp(char* val) + { + bool ok; + int format = pixelFormatStringToEnum(val, &ok); + if (ok) + { + if (format == mono8) + { + return 8; + } + else if (format == mono10 || format == mono12 || format == mono16) + { + return 16; + } + else if(format == rgb32) + { + return 40; + } + else + { + return -1; + } + } + else + { + return -1; + } + + } + //---------------------------------------------------------------------------------------------------------------------------------- + /*! + \class AddInAbstractGrabber + \brief This method maps a string to a value of pixelFormat. + + This function maps a string to a pixel format by using QMetaType. + */ + + int AddInAbstractGrabber::pixelFormatStringToEnum(char* val, bool* ok) + { +#if QT_VERSION >= 0x050500 + const QMetaObject mo = staticMetaObject; +#else + const QMetaObject mo = StaticQtMetaObject::get(); +#endif + QMetaEnum me = mo.enumerator(mo.indexOfEnumerator("PixelFormat")); + int pixelFormat = me.keyToValue(val, ok); + return pixelFormat; + } + //---------------------------------------------------------------------------------------------------------------------------------- //! if any live image has been connected to this camera, this event will be regularly fired. /*! This event is continoulsy fired if auto grabbing is enabled. At first, the image is acquired (method acquire). Then @@ -292,6 +345,35 @@ namespace ito AddInAbstractGrabber() { dd = new AddInMultiChannelGrabberPrivate(); + + ito::Param paramVal("name", ito::ParamBase::String | ito::ParamBase::Readonly, "DummyMultiChannelGrabber", "GrabberName"); + paramVal.setMeta(new ito::StringMeta(ito::StringMeta::String, "General"), true); + m_params.insert(paramVal.getName(), paramVal); + + int roi[] = { 0, 0, 2048, 2048 }; + paramVal = ito::Param("roi", ito::ParamBase::IntArray, 4, roi, tr("ROI (x,y,width,height) [this replaces the values x0,x1,y0,y1]").toLatin1().data()); + ito::RectMeta *rm = new ito::RectMeta(ito::RangeMeta(roi[0], roi[0] + roi[2] - 1), ito::RangeMeta(roi[1], roi[1] + roi[3] - 1), "ImageFormatControl"); + paramVal.setMeta(rm, true); + m_params.insert(paramVal.getName(), paramVal); + + paramVal = ito::Param("sizex", ito::ParamBase::Int | ito::ParamBase::Readonly, 4, 4096, 4096, tr("size in x (cols) [px]").toLatin1().data()); + paramVal.getMetaT()->setCategory("ImageFormatControl"); + m_params.insert(paramVal.getName(), paramVal); + + paramVal = ito::Param("sizey", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 4096, 4096, tr("size in y (rows) [px]").toLatin1().data()); + paramVal.getMetaT()->setCategory("ImageFormatControl"); + m_params.insert(paramVal.getName(), paramVal); + + ito::StringMeta *m = new ito::StringMeta(ito::StringMeta::String, "mono8"); + m->addItem("mono10"); + m->addItem("mono12"); + m->addItem("mono16"); + paramVal = ito::Param("pixelFormat", ito::ParamBase::String, "mono8", tr("bitdepth of images: mono8, mono10, mono12, mono16, rgb32").toLatin1().data()); + paramVal.setMeta(m, true); + m_params.insert(paramVal.getName(), paramVal); + + paramVal = ito::Param("defaultChannel", ito::ParamBase::String, "", tr("indicates the current default channel").toLatin1().data()); + m_params.insert(paramVal.getName(), paramVal); } //---------------------------------------------------------------------------------------------------------------------------------- @@ -368,33 +450,30 @@ namespace ito ito::RetVal ito::AddInMultiChannelGrabber::checkData(ito::DataObject *externalDataObject) { - unsigned int futureType, bpp; + ito::RetVal retVal(ito::retOk); + bool ok; + unsigned int futureType; + PixelFormat format; if (!externalDataObject) { QMutableMapIterator i(m_data); while (i.hasNext()) { i.next(); - bpp = i.value().m_channelParam["bpp"].getVal(); - if (bpp <= 8) - { - futureType = ito::tUInt8; - } - else if (bpp <= 16) - { - futureType = ito::tUInt16; - } - else if (bpp <= 32) + futureType = pixelFormatStringToEnum(i.value().m_channelParam["pixelFormat"].getVal(),&ok); + if (ok) { - futureType = ito::tInt32; + int* roi = i.value().m_channelParam["roi"].getVal(); + int height = roi[3] - roi[2]; + int width = roi[1] - roi[0]; + if (i.value().data.getDims() < 2 || i.value().data.getSize(0) != height || i.value().data.getSize(1) != width || i.value().data.getType() != futureType) + { + i.value().data = ito::DataObject(height, width, futureType); + } } else { - futureType = ito::tFloat64; - } - if (i.value().data.getDims() < 2 || i.value().data.getSize(0) != (unsigned int)i.value().m_channelParam["sizey"].getVal() || i.value().data.getSize(1) != (unsigned int)i.value().m_channelParam["sizex"].getVal() || i.value().data.getType() != futureType) - { - i.value().data = ito::DataObject(i.value().m_channelParam["sizey"].getVal(), i.value().m_channelParam["sizex"].getVal(), futureType); + retVal += ito::RetVal(ito::retError, 0, tr("invalid pixel format").toLatin1().data()); } } @@ -404,46 +483,52 @@ namespace ito char* channel = m_params["defaultChannel"].getVal(); if (m_data.contains(channel)) { - bpp = m_data[channel].m_channelParam["bpp"].getVal(); - if (bpp <= 8) + futureType = pixelFormatStringToEnum(m_data[channel].m_channelParam["pixelFormat"].getVal(), &ok); + if (ok) { - futureType = ito::tUInt8; - } - else if (bpp <= 16) - { - futureType = ito::tUInt16; - } - else if (bpp <= 32) - { - futureType = ito::tInt32; + int* roi = m_data[channel].m_channelParam["roi"].getVal(); + int width = roi[1] - roi[0]; + int height = roi[3] - roi[2]; + if (externalDataObject->getDims() == 0) + { + *externalDataObject = ito::DataObject(height, width, futureType); + } + else if (externalDataObject->calcNumMats() != 1) + { + return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object has more or less than 1 plane. It must be of right size and type or an uninitilized image.").toLatin1().data()); + } + else if (externalDataObject->getSize(externalDataObject->getDims() - 2) != height || externalDataObject->getSize(externalDataObject->getDims() - 1) != width || externalDataObject->getType() != futureType) + { + return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); + } } else { - futureType = ito::tFloat64; - } - if (externalDataObject->getDims() == 0) - { - *externalDataObject = ito::DataObject(m_data[channel].m_channelParam["sizey"].getVal(), m_data[channel].m_channelParam["sizex"].getVal(), futureType); - } - else if (externalDataObject->calcNumMats() != 1) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object has more or less than 1 plane. It must be of right size and type or an uninitilized image.").toLatin1().data()); - } - else if (externalDataObject->getSize(externalDataObject->getDims() - 2) != (unsigned int)m_data[channel].m_channelParam["sizey"].getVal() || externalDataObject->getSize(externalDataObject->getDims() - 1) != (unsigned int)m_data[channel].m_channelParam["sizex"].getVal() || externalDataObject->getType() != futureType) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); + retVal += ito::RetVal(ito::retError, 0, tr("invalid pixel format").toLatin1().data()); } } } - return ito::retOk; + return retVal; } - void AddInMultiChannelGrabber::addChannel(QString name, ito::Param sizex, ito::Param sizey, ito::Param bpp) + void AddInMultiChannelGrabber::addChannel(QString name) { - ChannelContainer a(sizex, sizey, bpp); + ChannelContainer a(m_params["roi"], m_params["pixelFormat"], m_params["sizex"], m_params["sizey"]); m_data[name] = a; } + + ito::RetVal ito::AddInMultiChannelGrabber::setBaseParam(ito::Param param, bool & ok) + { + QString paramName(param.getName()); + bool ok = paramName.compare("roi") || paramName.compare("pixelFormat") || paramName.compare("defaultChannel"); + if (ok) + { +dfsfdsf + } + return ito::retOk; + } + ito::RetVal AddInMultiChannelGrabber::adaptDefaultChannelParams() { ito::RetVal retVal(ito::retOk); From ae932cc9fe35349c6cf4a50cb3320820fb70aa12 Mon Sep 17 00:00:00 2001 From: robin92 Date: Mon, 5 Oct 2020 17:01:54 +0200 Subject: [PATCH 04/62] AddInMultiChannelGrabber: added untested method to synchronize the parameters between the channels and m_params. SetParam set to final and a pure virtual function setParameter is added. SetParameter is called by setParam. If successful, setParameter must return ok. If parameter in setParameter could not be processed, setParam tries to process the parameter further. --- common/addInGrabber.h | 10 ++- common/sources/addInGrabber.cpp | 129 +++++++++++++++++++++++++++----- 2 files changed, 117 insertions(+), 22 deletions(-) diff --git a/common/addInGrabber.h b/common/addInGrabber.h index 0c11babaf..b75cb7fb9 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -178,16 +178,20 @@ namespace ito } }; - QMap m_data; /*!< Map for recently grabbed images of various channels*/ + QMap m_channels; /*!< Map for recently grabbed images of various channels*/ virtual ito::RetVal checkData(ito::DataObject *externalDataObject = NULL); virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ void addChannel(QString name); - ito::RetVal setBaseParam(ito::Param param,bool &ok); /*!< sets and updates all related base params. ok is set to true if param was set and all related params are updated sucessfully. */ - + virtual ito::RetVal syncWithChannelParams(QString previousChannel);/*!< synchronizes the parameters from the defaultChannel with m_params */ + virtual ito::RetVal setParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok) = 0; + public: AddInMultiChannelGrabber(); ~AddInMultiChannelGrabber(); + public slots: + ito::RetVal setParam(QSharedPointer val, ItomSharedSemaphore *waitCond = NULL) final; + }; diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index 2a4e0f245..7a7a685aa 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -30,6 +30,8 @@ #include #include #include +#include +#include "common/helperCommon.h" namespace ito @@ -397,13 +399,13 @@ namespace ito // int i=0; int size = m_autoGrabbingListeners.size(); char* defChannel = m_params["defaultChannel"].getVal(); - if (m_data.contains(defChannel)) + if (m_channels.contains(defChannel)) { if (waitMS == 0) { foreach(obj, m_autoGrabbingListeners) { - if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_data[defChannel].data))), Q_ARG(ItomSharedSemaphore*, NULL))) + if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[defChannel].data))), Q_ARG(ItomSharedSemaphore*, NULL))) { retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); } @@ -418,7 +420,7 @@ namespace ito { waitConds[i] = new ItomSharedSemaphore(); // \todo On Linux a crash occurs here when closing the liveImage ... maybe the same reason why we get an error message on windows? - if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_data[defChannel].data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) + if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[defChannel].data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) { retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); } @@ -457,7 +459,7 @@ namespace ito if (!externalDataObject) { - QMutableMapIterator i(m_data); + QMutableMapIterator i(m_channels); while (i.hasNext()) { i.next(); futureType = pixelFormatStringToEnum(i.value().m_channelParam["pixelFormat"].getVal(),&ok); @@ -481,12 +483,12 @@ namespace ito else { char* channel = m_params["defaultChannel"].getVal(); - if (m_data.contains(channel)) + if (m_channels.contains(channel)) { - futureType = pixelFormatStringToEnum(m_data[channel].m_channelParam["pixelFormat"].getVal(), &ok); + futureType = pixelFormatStringToEnum(m_channels[channel].m_channelParam["pixelFormat"].getVal(), &ok); if (ok) { - int* roi = m_data[channel].m_channelParam["roi"].getVal(); + int* roi = m_channels[channel].m_channelParam["roi"].getVal(); int width = roi[1] - roi[0]; int height = roi[3] - roi[2]; if (externalDataObject->getDims() == 0) @@ -514,21 +516,10 @@ namespace ito void AddInMultiChannelGrabber::addChannel(QString name) { ChannelContainer a(m_params["roi"], m_params["pixelFormat"], m_params["sizex"], m_params["sizey"]); - m_data[name] = a; + m_channels[name] = a; } - ito::RetVal ito::AddInMultiChannelGrabber::setBaseParam(ito::Param param, bool & ok) - { - QString paramName(param.getName()); - bool ok = paramName.compare("roi") || paramName.compare("pixelFormat") || paramName.compare("defaultChannel"); - if (ok) - { -dfsfdsf - } - return ito::retOk; - } - ito::RetVal AddInMultiChannelGrabber::adaptDefaultChannelParams() { ito::RetVal retVal(ito::retOk); @@ -538,5 +529,105 @@ dfsfdsf } + ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer val, ItomSharedSemaphore *waitCond/* = NULL*/) + { + ItomSharedSemaphoreLocker locker(waitCond); + ito::RetVal retValue; + bool hasIndex, ok; + int index; + QString suffix, key; + ParamMapIterator it; + retValue += ito::parseParamName(val->getName(), key, hasIndex, index, suffix); + if (!retValue.containsError()) + { + retValue += apiGetParamFromMapByKey(m_params, key, it, true); + } + if (!retValue.containsError()) + { + retValue += apiValidateParam(*it, *val, false, true); + } + if (!retValue.containsError()) + { + + retValue += setParameter(val, it, suffix, key, index, hasIndex, ok); + if (!retValue.containsError() && !ok) + { + if (key == "defaultChannel") + { + QString previousChannel = m_params["defaultChannel"].getVal(); + retValue += it->copyValueFrom(&(*val)); + if (m_channels.find(it->getVal()) != m_channels.end()) + { + m_params["defaultChannel"].setVal(it->getVal()); + retValue += syncWithChannelParams(previousChannel); + } + else + { + retValue += ito::RetVal(ito::retError, 0, tr("Unknown channel: %1").arg(it->getVal()).toLatin1().data()); + } + } + } + } + if (!retValue.containsError()) + { + emit parametersChanged(m_params); + } + + if (waitCond) + { + waitCond->returnValue = retValue; + waitCond->release(); + } + + return retValue; + } + ////---------------------------------------------------------------------------------------------------------------------------------- + ////! synchronizes the parameters from the defaultChannel with m_params + ///*! + //This method synchronizes the parameters from the current selected channel container with m_params. Parameters which are not available for the current default channel are set to readonly + + //\param [in] previousChannel indicates the name of the previous default channel. This is needed to check whether a parameter is no longer contained in the current channel, which was contained in the previous one. + //\return retOk if everything was ok, else retError + //*/ + ito::RetVal AddInMultiChannelGrabber::syncWithChannelParams(QString previousChannel) + { + ito::RetVal retVal(ito::retOk); + unsigned int flag = 0; + QMapIterator itChannelParams(m_channels[m_params["defaultChannel"].getVal()].m_channelParam); + bool channelDiffer = false; + //Check if the previous channel had the same parameters + QStringList defaulKeyList = m_channels[m_params["defaultChannel"].getVal()].m_channelParam.keys(); + qSort(defaulKeyList); + QStringList previousKeyList = m_channels[previousChannel].m_channelParam.keys(); + qSort(previousKeyList); + if (defaulKeyList != previousKeyList) + { + QStringList::ConstIterator itPreviousChannel; + for (itPreviousChannel = previousKeyList.constBegin(); itPreviousChannel != previousKeyList.constEnd(); ++itPreviousChannel) + { + if (!defaulKeyList.contains(*itPreviousChannel))//if param from previous channel is not included in current channel, set param in m_params to readonly. + { + flag = m_params[*itPreviousChannel].getFlags(); + flag |= ito::ParamBase::Readonly; + m_params[*itPreviousChannel].setFlags(flag); + //if a param is in the current channel include which was not in the previous one, the readonly flag will be removed when copying the param from the channel container to m_params + } + } + } + while (itChannelParams.hasNext()) + { + itChannelParams.next(); + if (m_params.contains(itChannelParams.key())) + { + m_params[itChannelParams.key()] = itChannelParams.value(); //copy param + } + else + { + retVal += ito::RetVal(ito::retError, 0, QString("channel parameter %1 not found in m_params").arg(itChannelParams.key()).toLatin1().data()); + } + + } + return retVal; + } } //end namespace ito From 707448b2789b53f22db3f6eb801c2f97fbcaeebe Mon Sep 17 00:00:00 2001 From: robin92 Date: Fri, 9 Oct 2020 13:58:19 +0200 Subject: [PATCH 05/62] bugfix in template myActuator.cpp: in waitForDone the boolean done was set to false, even if axis is on target --- pluginTemplates/actuator/myActuator.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/pluginTemplates/actuator/myActuator.cpp b/pluginTemplates/actuator/myActuator.cpp index f764c095f..3916093d9 100644 --- a/pluginTemplates/actuator/myActuator.cpp +++ b/pluginTemplates/actuator/myActuator.cpp @@ -690,7 +690,6 @@ ito::RetVal MyActuator::waitForDone(const int timeoutMS, const QVector axis else if (1 /*axis i is at target*/) { setStatus(m_currentStatus[i], ito::actuatorAtTarget, ito::actSwitchesMask | ito::actStatusMask); - done = false; //not done yet } } From f67aeb9cc19277cd4a0ffbe20faad3ded019026e Mon Sep 17 00:00:00 2001 From: robin92 Date: Tue, 13 Oct 2020 09:51:21 +0200 Subject: [PATCH 06/62] AddInMultiChannelGrabber: added applyParamsToChannelParams to apply changes in m_params to the channel params. Further improved setParam... --- common/addInGrabber.h | 3 +- common/sources/addInGrabber.cpp | 110 ++++++++++++++++++++++++++++---- 2 files changed, 101 insertions(+), 12 deletions(-) diff --git a/common/addInGrabber.h b/common/addInGrabber.h index b75cb7fb9..29a194abe 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -183,7 +183,8 @@ namespace ito virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ void addChannel(QString name); - virtual ito::RetVal syncWithChannelParams(QString previousChannel);/*!< synchronizes the parameters from the defaultChannel with m_params */ + virtual ito::RetVal synchronizeParamswithChannelParams(QString previousChannel);/*!< synchronizes m_params with the params of default channel container */ + virtual ito::RetVal applyParamsToChannelParams(QStringList keyList = QStringList()); virtual ito::RetVal setParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok) = 0; public: diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index 7a7a685aa..5f085f7ce 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -47,7 +47,6 @@ namespace ito }; class AddInMultiChannelGrabberPrivate { - }; /*! @@ -466,8 +465,8 @@ namespace ito if (ok) { int* roi = i.value().m_channelParam["roi"].getVal(); - int height = roi[3] - roi[2]; - int width = roi[1] - roi[0]; + int height = roi[3]; + int width = roi[2]; if (i.value().data.getDims() < 2 || i.value().data.getSize(0) != height || i.value().data.getSize(1) != width || i.value().data.getType() != futureType) { i.value().data = ito::DataObject(height, width, futureType); @@ -489,8 +488,8 @@ namespace ito if (ok) { int* roi = m_channels[channel].m_channelParam["roi"].getVal(); - int width = roi[1] - roi[0]; - int height = roi[3] - roi[2]; + int width = roi[2]; + int height = roi[3]; if (externalDataObject->getDims() == 0) { *externalDataObject = ito::DataObject(height, width, futureType); @@ -538,6 +537,7 @@ namespace ito QString suffix, key; ParamMapIterator it; retValue += ito::parseParamName(val->getName(), key, hasIndex, index, suffix); + int cntStartedDevices = grabberStartedCount(); if (!retValue.containsError()) { retValue += apiGetParamFromMapByKey(m_params, key, it, true); @@ -559,37 +559,69 @@ namespace ito if (m_channels.find(it->getVal()) != m_channels.end()) { m_params["defaultChannel"].setVal(it->getVal()); - retValue += syncWithChannelParams(previousChannel); + retValue += synchronizeParamswithChannelParams(previousChannel); } else { retValue += ito::RetVal(ito::retError, 0, tr("Unknown channel: %1").arg(it->getVal()).toLatin1().data()); } } + + } + else if(!retValue.containsError()) + { + retValue += it->copyValueFrom(&(*val)); // it seems that the plugin does not process the param therefore it is copied here + } + if (key == "roi") //if key is roi sizex and sizey must be adapted + { + if (!hasIndex) + { + const int* roi = m_params["roi"].getVal(); + int height = roi[3]; + int width = roi[2]; + m_params["sizex"].setVal(width); + m_params["sizey"].setVal(height); + } + else + { + it->getVal()[index] = val->getVal(); + const int* roi = m_params["roi"].getVal(); + int height = roi[3]; + int width = roi[2]; + m_params["sizex"].setVal(width); + m_params["sizey"].setVal(height); + } } + applyParamsToChannelParams(QStringList(key)); } if (!retValue.containsError()) { emit parametersChanged(m_params); } - + if (cntStartedDevices != grabberStartedCount()) + { + if (cntStartedDevices != 0) + { + retValue += startDevice(NULL); + setGrabberStarted(cntStartedDevices); + } + } if (waitCond) { waitCond->returnValue = retValue; waitCond->release(); } - return retValue; } ////---------------------------------------------------------------------------------------------------------------------------------- - ////! synchronizes the parameters from the defaultChannel with m_params + ////! synchronizes m_params with the params of default channel container ///*! - //This method synchronizes the parameters from the current selected channel container with m_params. Parameters which are not available for the current default channel are set to readonly + //This method synchronizes the parameters from the current selected channel container with m_params. Call this function after changing the default parameter.Parameters which are not available for the current default channel are set to readonly //\param [in] previousChannel indicates the name of the previous default channel. This is needed to check whether a parameter is no longer contained in the current channel, which was contained in the previous one. //\return retOk if everything was ok, else retError //*/ - ito::RetVal AddInMultiChannelGrabber::syncWithChannelParams(QString previousChannel) + ito::RetVal AddInMultiChannelGrabber::synchronizeParamswithChannelParams(QString previousChannel) { ito::RetVal retVal(ito::retOk); unsigned int flag = 0; @@ -629,5 +661,61 @@ namespace ito } return retVal; } + ////---------------------------------------------------------------------------------------------------------------------------------- + ////! copies value m_params to the channel params of the current default channel + ///*! + //This method copies params of m_params to the params of the channel container. This function is usally called after setParam to apply the changed entries of m_params to the corresponding channel container. + //If a parameter is not found in the channel container nothing happens. This function updates also sizex and sizey if roi or nothing is passed as key. + + //\param [in] keyList indicates which params are copied. If the List is empty all Parameters of the current channel are updated. + //\return retOk if everything was ok, else retError + //*/ + ito::RetVal AddInMultiChannelGrabber::applyParamsToChannelParams(QStringList keyList ) + { + ito::RetVal retVal(ito::retOk); + QString currentChannel = m_params["defaultChannel"].getVal(); + if (!keyList.isEmpty()) + { + if (m_channels.contains(currentChannel)) + { + QString tmp; + foreach(tmp, keyList) + { + if (m_channels[currentChannel].m_channelParam.contains(tmp)) + { + if (m_params.contains(tmp)) + { + m_channels[currentChannel].m_channelParam[tmp] = m_params[tmp]; + if (tmp == "roi") + { + m_channels[currentChannel].m_channelParam["sizex"] = m_params["sizex"]; + m_channels[currentChannel].m_channelParam["sizey"] = m_params["sizey"]; + } + } + else + { + retVal = ito::RetVal(ito::retError, 0, tr("Unknown parameter %1 in m_params").arg(tmp).toLatin1().data()); + } + } + } + } + + else + { + retVal = ito::RetVal(ito::retError, 0, tr("Unknown channel %1").arg(currentChannel).toLatin1().data()); + } + } + else + { + QMapIterator it(m_channels[m_params["defaultChannel"].getVal()].m_channelParam); + while (it.hasNext()) + { + it.next(); + const_cast(it.value()) = m_params[it.key()]; + + } + } + return retVal; + } } //end namespace ito From 1a1d52ec48322e463db7fdbba9edadfff77e2176 Mon Sep 17 00:00:00 2001 From: robin92 Date: Tue, 13 Oct 2020 18:36:02 +0200 Subject: [PATCH 07/62] AddInMultiChannelGrabber: further adaptions --- common/addInGrabber.h | 18 ++++++++- common/sources/addInGrabber.cpp | 66 +++++++++++++++++++++------------ 2 files changed, 59 insertions(+), 25 deletions(-) diff --git a/common/addInGrabber.h b/common/addInGrabber.h index 29a194abe..21b13a42c 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -185,7 +185,23 @@ namespace ito void addChannel(QString name); virtual ito::RetVal synchronizeParamswithChannelParams(QString previousChannel);/*!< synchronizes m_params with the params of default channel container */ virtual ito::RetVal applyParamsToChannelParams(QStringList keyList = QStringList()); - virtual ito::RetVal setParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok) = 0; + + ////! Specific function to set the parameters in the respective plugin class + ///*! + //This function is a specific implementation of setParam. Overload this function to process parameters individually in the plugin class. This function is called by setParam after the parameter has been parsed and checked . + + //\param [in] val parameter to be processed + //\param [in] it ParamMapIterator iterator to the parameter in m_params + //\param [in] suffix possible suffix of the parameter + //\param [in] key of the parameter + //\param [in] index of the parameter + //\param [in] hasIndex is set to true if parameter has an index + //\param [in] set ok to true if parameter was processed + //\param [in] add key of changed channel specific parameters to pendingUpdate. + //\return retOk if everything was ok, else retError + //*/ + virtual ito::RetVal setParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok, QStringList &pendingUpdate) = 0; + void updateSizeXY(); /*!< updates sizex und sizey*/ public: AddInMultiChannelGrabber(); diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index 5f085f7ce..81ff214eb 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -548,8 +548,8 @@ namespace ito } if (!retValue.containsError()) { - - retValue += setParameter(val, it, suffix, key, index, hasIndex, ok); + QStringList list; + retValue += setParameter(val, it, suffix, key, index, hasIndex, ok, list); if (!retValue.containsError() && !ok) { if (key == "defaultChannel") @@ -566,39 +566,39 @@ namespace ito retValue += ito::RetVal(ito::retError, 0, tr("Unknown channel: %1").arg(it->getVal()).toLatin1().data()); } } - - } - else if(!retValue.containsError()) - { - retValue += it->copyValueFrom(&(*val)); // it seems that the plugin does not process the param therefore it is copied here - } - if (key == "roi") //if key is roi sizex and sizey must be adapted - { - if (!hasIndex) + if (key == "roi") { - const int* roi = m_params["roi"].getVal(); - int height = roi[3]; - int width = roi[2]; - m_params["sizex"].setVal(width); - m_params["sizey"].setVal(height); + if (!hasIndex) + { + retValue += it->copyValueFrom(&(*val)); + list << "roi"; + } + else + { + it->getVal()[index] = val->getVal(); + list << "roi"; + } } else { - it->getVal()[index] = val->getVal(); - const int* roi = m_params["roi"].getVal(); - int height = roi[3]; - int width = roi[2]; - m_params["sizex"].setVal(width); - m_params["sizey"].setVal(height); + retValue += it->copyValueFrom(&(*val)); // it seems that the plugin does not process the param therefore it is copied here + if (m_channels[m_params["defaultChannel"].getVal()].m_channelParam.contains(key)) + { + list << key; + } } } - applyParamsToChannelParams(QStringList(key)); + if (list.contains("roi")) //if key is roi sizex and sizey must be adapted + { + updateSizeXY(); + } + applyParamsToChannelParams(list); } if (!retValue.containsError()) { emit parametersChanged(m_params); } - if (cntStartedDevices != grabberStartedCount()) + if (cntStartedDevices < grabberStartedCount()) { if (cntStartedDevices != 0) { @@ -717,5 +717,23 @@ namespace ito } return retVal; } + + ////---------------------------------------------------------------------------------------------------------------------------------- + ////! updates sizex and sizey + ///*! + //Call this function to update sizex and sizey. If the roi is changed via setParam this function will be call automatically. + //Do not forget to apply the changes to the channel parameters by calling applyParamsToChannelParams after calling this function. + + //\param [in] keyList indicates which params are copied. If the List is empty all Parameters of the current channel are updated. + //\return retOk if everything was ok, else retError + //*/ + void AddInMultiChannelGrabber::updateSizeXY() + { + const int* roi = m_params["roi"].getVal(); + int height = roi[3]; + int width = roi[2]; + m_params["sizex"].setVal(width); + m_params["sizey"].setVal(height); + } } //end namespace ito From cc2a1fbf8cc9978517e917eb5fe006ce998ce199 Mon Sep 17 00:00:00 2001 From: robin92 Date: Thu, 18 Feb 2021 19:18:59 +0100 Subject: [PATCH 08/62] small fix --- common/sources/addInGrabber.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index 81ff214eb..b94b24c9a 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -590,9 +590,10 @@ namespace ito } if (list.contains("roi")) //if key is roi sizex and sizey must be adapted { - updateSizeXY(); + updateSizeXY(); } applyParamsToChannelParams(list); + checkData(); } if (!retValue.containsError()) { From a2cd54aadb59768fa963656c8fc8a88644862f9e Mon Sep 17 00:00:00 2001 From: robin92 Date: Fri, 19 Feb 2021 15:25:29 +0100 Subject: [PATCH 09/62] addInGrabber: implemented set and getParam with channel specification via parameter suffixes. Additionally getParam was moved to AddInMultiChannelGrabber. getParam calls getParameter in the plugin to allow more specific handling in the plugin. This is analogous to setParam and setParameter respectively. --- common/addInGrabber.h | 2 + common/sources/addInGrabber.cpp | 88 +++++++++++++++++++++++++++------ 2 files changed, 76 insertions(+), 14 deletions(-) diff --git a/common/addInGrabber.h b/common/addInGrabber.h index 21b13a42c..d071f0800 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -201,6 +201,7 @@ namespace ito //\return retOk if everything was ok, else retError //*/ virtual ito::RetVal setParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok, QStringList &pendingUpdate) = 0; + virtual ito::RetVal getParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok) = 0; void updateSizeXY(); /*!< updates sizex und sizey*/ public: @@ -208,6 +209,7 @@ namespace ito ~AddInMultiChannelGrabber(); public slots: ito::RetVal setParam(QSharedPointer val, ItomSharedSemaphore *waitCond = NULL) final; + ito::RetVal getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) final; }; diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index b94b24c9a..da4bc3b8a 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -528,6 +528,54 @@ namespace ito } + ito::RetVal AddInMultiChannelGrabber::getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) + { + ItomSharedSemaphoreLocker locker(waitCond); + ito::RetVal retValue; + QString key; + bool hasIndex = false; + int index; + QString suffix; + ParamMapIterator it; + bool ok = false; + + //parse the given parameter-name (if you support indexed or suffix-based parameters) + retValue += apiParseParamName(val->getName(), key, hasIndex, index, suffix); + + if (retValue == ito::retOk) + { + //gets the parameter key from m_params map (read-only is allowed, since we only want to get the value). + if (!suffix.isEmpty() && m_channels.contains(suffix)) + { + retValue += apiGetParamFromMapByKey(m_channels[suffix].m_channelParam, key, it, false); + if (retValue.containsError()) + { + retValue = ito::RetVal(ito::retError, 0, tr("an error occured while searching parameter \"%0\" for channel \"%1\".Maybe this is a non channel specific parameter.").arg(key).arg(suffix).toLatin1().data()); + } + } + else + { + retValue += apiGetParamFromMapByKey(m_params, key, it, false); + } + } + if (!retValue.containsError()) + { + retValue += getParameter(val, it, suffix, key, index, hasIndex, ok); + } + if (!retValue.containsError() && !ok)//the parameter was not processed by the plugin, so it is done here + { + *val = it.value(); + } + + if (waitCond) + { + waitCond->returnValue = retValue; + waitCond->release(); + } + + return retValue; + } + ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer val, ItomSharedSemaphore *waitCond/* = NULL*/) { ItomSharedSemaphoreLocker locker(waitCond); @@ -540,7 +588,18 @@ namespace ito int cntStartedDevices = grabberStartedCount(); if (!retValue.containsError()) { - retValue += apiGetParamFromMapByKey(m_params, key, it, true); + if (!suffix.isEmpty() && m_channels.contains(suffix)) + { + retValue += apiGetParamFromMapByKey(m_channels[suffix].m_channelParam, key, it, true); + if (retValue.containsError()) + { + retValue = ito::RetVal(ito::retError, 0, tr("an error occured while searching parameter \"%0\" for channel \"%1\".Maybe this is a non channel specific parameter.").arg(key).arg(suffix).toLatin1().data()); + } + } + else + { + retValue += apiGetParamFromMapByKey(m_params, key, it, true); + } } if (!retValue.containsError()) { @@ -563,21 +622,22 @@ namespace ito } else { - retValue += ito::RetVal(ito::retError, 0, tr("Unknown channel: %1").arg(it->getVal()).toLatin1().data()); + retValue += ito::RetVal(ito::retError, 0, tr("unknown channel: %1").arg(it->getVal()).toLatin1().data()); } } if (key == "roi") { - if (!hasIndex) - { - retValue += it->copyValueFrom(&(*val)); - list << "roi"; - } - else - { - it->getVal()[index] = val->getVal(); - list << "roi"; - } + if (!hasIndex) + { + retValue += it->copyValueFrom(&(*val)); + list << "roi"; + } + else + { + it->getVal()[index] = val->getVal(); + list << "roi"; + } + } else { @@ -695,7 +755,7 @@ namespace ito } else { - retVal = ito::RetVal(ito::retError, 0, tr("Unknown parameter %1 in m_params").arg(tmp).toLatin1().data()); + retVal = ito::RetVal(ito::retError, 0, tr("unknown parameter %1 in m_params").arg(tmp).toLatin1().data()); } } } @@ -703,7 +763,7 @@ namespace ito else { - retVal = ito::RetVal(ito::retError, 0, tr("Unknown channel %1").arg(currentChannel).toLatin1().data()); + retVal = ito::RetVal(ito::retError, 0, tr("unknown channel %1").arg(currentChannel).toLatin1().data()); } } else From b8a85a49ccc28786af0faff7f10561c971d2cdf8 Mon Sep 17 00:00:00 2001 From: robin92 Date: Mon, 22 Mar 2021 19:57:48 +0100 Subject: [PATCH 10/62] FigureWidget: adjustments to enable a live image based on a pixelFormat string for multichannelGrabber --- Qitom/widgets/figureWidget.cpp | 24 ++++++++++++++++++------ common/addInGrabber.h | 5 +++-- common/sources/addInGrabber.cpp | 4 ++-- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/Qitom/widgets/figureWidget.cpp b/Qitom/widgets/figureWidget.cpp index a746244c2..bde7acc12 100644 --- a/Qitom/widgets/figureWidget.cpp +++ b/Qitom/widgets/figureWidget.cpp @@ -29,10 +29,12 @@ #include "../helper/guiHelper.h" #include "plot/AbstractDObjFigure.h" #include "plot/AbstractDObjPCLFigure.h" +#include "../common/addInGrabber.h" #include + namespace ito { //---------------------------------------------------------------------------------------------------------------------------------- @@ -441,25 +443,35 @@ RetVal FigureWidget::liveImage( bool setDepth = false; bool isLine = false; ito::AutoInterval bitRange (0.0, 1.0); - QSharedPointer bpp = getParamByInvoke(cam.data(), "bpp", retval); + int bpp = 0; + if (qobject_cast(cam)) + { + QSharedPointer paramFormat = getParamByInvoke(cam.data(), "pixelFormat", retval); + const char * pixelFormat = paramFormat->getVal(); + bpp = AddInAbstractGrabber::pixelFormatStringToBpp(pixelFormat); + } + else + { + bpp = getParamByInvoke(cam.data(), "bpp", retval)->getVal(); + } if (!retval.containsError()) { - if (bpp->getVal() == 8) + if (bpp == 8) { setDepth = true; bitRange.setMaximum(255.0); } - else if (bpp->getVal() < 17) + else if (bpp < 17) { setDepth = true; - bitRange.setMaximum((float)((1 << bpp->getVal())-1)); + bitRange.setMaximum((float)((1 << bpp)-1)); } - else if (bpp->getVal() == 32) + else if (bpp == 32) { // ToDo define float32 and int32 behavior! } - else if (bpp->getVal() == 64) + else if (bpp == 64) { // ToDo define float64 behavior! } diff --git a/common/addInGrabber.h b/common/addInGrabber.h index d071f0800..556335b7c 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -74,8 +74,7 @@ namespace ito protected: - int pixelFormatStringToBpp(char* val); /*!< this method returns the size of a pixel for a given pixelFormat */ - int pixelFormatStringToEnum(char* val, bool* ok); /*!< this method maps a string to a value of pixelFormat */ + void timerEvent (QTimerEvent *event); /*!< this method is called every time when the auto-grabbing-timer is fired. Usually you don't have to overwrite this method. */ @@ -123,6 +122,8 @@ namespace ito } public: + static int pixelFormatStringToBpp(const char* val); /*!< this method returns the size of a pixel for a given pixelFormat */ + static int pixelFormatStringToEnum(const char* val, bool* ok); /*!< this method maps a string to a value of pixelFormat */ AddInAbstractGrabber(); ~AddInAbstractGrabber(); diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index da4bc3b8a..765bf878f 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -78,7 +78,7 @@ namespace ito //---------------------------------------------------------------------------------------------------------------------------------- //! this method returns the size of a pixel for a given pixelFormat. - int AddInAbstractGrabber::pixelFormatStringToBpp(char* val) + int AddInAbstractGrabber::pixelFormatStringToBpp(const char* val) { bool ok; int format = pixelFormatStringToEnum(val, &ok); @@ -115,7 +115,7 @@ namespace ito This function maps a string to a pixel format by using QMetaType. */ - int AddInAbstractGrabber::pixelFormatStringToEnum(char* val, bool* ok) + int AddInAbstractGrabber::pixelFormatStringToEnum(const char* val, bool* ok) { #if QT_VERSION >= 0x050500 const QMetaObject mo = staticMetaObject; From d6fa718ea834a08ea3c617ba14525ff740bc302c Mon Sep 17 00:00:00 2001 From: robin92 Date: Wed, 24 Mar 2021 09:24:52 +0100 Subject: [PATCH 11/62] added unittest for DummyMultiChannelGrabber --- Qitom/widgets/figureWidget.cpp | 2 +- common/sources/addInGrabber.cpp | 50 +++++++++------ python_unittests/multichannel_test.py | 92 +++++++++++++++++++++++++++ python_unittests/run_suite.py | 2 + 4 files changed, 125 insertions(+), 21 deletions(-) create mode 100644 python_unittests/multichannel_test.py diff --git a/Qitom/widgets/figureWidget.cpp b/Qitom/widgets/figureWidget.cpp index bde7acc12..64cddd217 100644 --- a/Qitom/widgets/figureWidget.cpp +++ b/Qitom/widgets/figureWidget.cpp @@ -451,7 +451,7 @@ RetVal FigureWidget::liveImage( const char * pixelFormat = paramFormat->getVal(); bpp = AddInAbstractGrabber::pixelFormatStringToBpp(pixelFormat); } - else + else // fall back for AddInGrabber { bpp = getParamByInvoke(cam.data(), "bpp", retval)->getVal(); } diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index 765bf878f..fb12a722a 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -550,7 +550,7 @@ namespace ito retValue += apiGetParamFromMapByKey(m_channels[suffix].m_channelParam, key, it, false); if (retValue.containsError()) { - retValue = ito::RetVal(ito::retError, 0, tr("an error occured while searching parameter \"%0\" for channel \"%1\".Maybe this is a non channel specific parameter.").arg(key).arg(suffix).toLatin1().data()); + retValue = ito::RetVal(ito::retError, 0, tr("an error occured while searching parameter \"%0\" for channel \"%1\". Maybe this is a channel specific parameter.").arg(key).arg(suffix).toLatin1().data()); } } else @@ -598,7 +598,14 @@ namespace ito } else { - retValue += apiGetParamFromMapByKey(m_params, key, it, true); + if (suffix.isEmpty()) + { + retValue += apiGetParamFromMapByKey(m_params, key, it, true); + } + else + { + retValue += ito::RetVal(ito::retError, 0, tr("unknown channel: %1").arg(suffix).toLatin1().data()); + } } } if (!retValue.containsError()) @@ -614,29 +621,29 @@ namespace ito if (key == "defaultChannel") { QString previousChannel = m_params["defaultChannel"].getVal(); - retValue += it->copyValueFrom(&(*val)); - if (m_channels.find(it->getVal()) != m_channels.end()) + + if (m_channels.find(val->getVal()) != m_channels.end()) { - m_params["defaultChannel"].setVal(it->getVal()); + retValue += it->copyValueFrom(&(*val)); retValue += synchronizeParamswithChannelParams(previousChannel); } else { - retValue += ito::RetVal(ito::retError, 0, tr("unknown channel: %1").arg(it->getVal()).toLatin1().data()); + retValue += ito::RetVal(ito::retError, 0, tr("unknown channel: %1").arg(val->getVal()).toLatin1().data()); } } - if (key == "roi") + else if (key == "roi") { - if (!hasIndex) - { - retValue += it->copyValueFrom(&(*val)); - list << "roi"; - } - else - { - it->getVal()[index] = val->getVal(); - list << "roi"; - } + if (!hasIndex) + { + retValue += it->copyValueFrom(&(*val)); + list << "roi"; + } + else + { + it->getVal()[index] = val->getVal(); + list << "roi"; + } } else @@ -644,7 +651,7 @@ namespace ito retValue += it->copyValueFrom(&(*val)); // it seems that the plugin does not process the param therefore it is copied here if (m_channels[m_params["defaultChannel"].getVal()].m_channelParam.contains(key)) { - list << key; + list << key; } } } @@ -652,8 +659,11 @@ namespace ito { updateSizeXY(); } - applyParamsToChannelParams(list); - checkData(); + if (!retValue.containsError()) + { + applyParamsToChannelParams(list); + checkData(); + } } if (!retValue.containsError()) { diff --git a/python_unittests/multichannel_test.py b/python_unittests/multichannel_test.py new file mode 100644 index 000000000..3f754fe8c --- /dev/null +++ b/python_unittests/multichannel_test.py @@ -0,0 +1,92 @@ +import unittest +from itom import dataIO + +def channelSpecificFunc1(): + cam = dataIO("DummyMultiChannelGrabber") + cam.setParam('defaultChannel','Channel_1') + cam.setParam('channelSpecificParameter',200) + + def channelSpecificFunc2(): + cam = dataIO("DummyMultiChannelGrabber") + cam.setParam('channelSpecificParameter:Channel_1',200) + +class MultiChannelDummyGrabberTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + pass + + def test_setAndGetParamViaSuffix(self): + cam = dataIO("DummyMultiChannelGrabber") + cam.setParam('defaultChannel', 'Channel_0') + originalRoi = cam.getParam('roi') + cam.setParam('roi:Channel_1', [0, 0, 20, 20]) + roiDefaultChannel = cam.getParam('roi') + roiChannel0 = cam.getParam('roi:Channel_0') + roiChannel1 = cam.getParam('roi:Channel_1') + + self.assertEqual(originalRoi, roiChannel0) + self.assertNotEquals(originalRoi, roiChannel1) + self.assertEqual(roiChannel1, (0, 0, 20, 20)) + self.assertEqual(roiDefaultChannel, roiChannel0) + + def test_setAndGetParamViaDefaultChannel(self): + cam = dataIO("DummyMultiChannelGrabber") + cam.setParam('defaultChannel', 'Channel_0') + originalRoi = cam.getParam('roi') + cam.setParam('defaultChannel', 'Channel_1') + cam.setParam('roi', [0,0,40,40]) + cam.setParam('defaultChannel', 'Channel_0') + channel0Roi = cam.getParam('roi') + cam.setParam('defaultChannel', 'Channel_1') + channel1Roi = cam.getParam('roi') + + self.assertEqual(originalRoi, channel0Roi) + self.assertNotEqual(originalRoi, channel1Roi) + + def test_channelSwitchAfterSuffixUsage(self): + cam = dataIO("DummyMultiChannelGrabber") + cam.setParam('defaultChannel', 'Channel_0') + originalChannel = cam.getParam('defaultChannel') + cam.setParam('roi:Channel_1', (0, 0, 40, 40)) + afterSuffixUsage = cam.getParam('defaultChannel') + self.assertEqual(originalChannel, afterSuffixUsage) + + def test_invalidDefaultChannelTest(self): + cam = dataIO("DummyMultiChannelGrabber") + paramList = cam.getParamList() + originalParamDict = {} + for elem in paramList: + originalParamDict[elem] = cam.getParam(elem) + try: + cam.setParam('defaultChannel', 'xyz') + except RuntimeError: + pass + testParamDict = {} + for elem in paramList: + testParamDict[elem] = cam.getParam(elem) + self.assertEqual(originalParamDict, testParamDict) + + def test_invalidSuffixUsage(self): + cam = dataIO("DummyMultiChannelGrabber") + paramList = cam.getParamList() + originalParamDict = {} + for elem in paramList: + originalParamDict[elem] = cam.getParam(elem) + try: + cam.setParam('roi:channel_7', (0, 0, 40, 40)) + except RuntimeError: + pass + testParamDict = {} + for elem in paramList: + testParamDict[elem] = cam.getParam(elem) + self.assertEqual(originalParamDict, testParamDict) + + + def test_channelSpecific(self): + self.assertRaises(RuntimeError, channelSpecificFunc1) + self.assertRaises(RuntimeError, channelSpecificFunc2) + + + + if __name__ == '__main__': + unittest.main(module='multichannel_test', exit=False) \ No newline at end of file diff --git a/python_unittests/run_suite.py b/python_unittests/run_suite.py index 3a183b813..8343228aa 100644 --- a/python_unittests/run_suite.py +++ b/python_unittests/run_suite.py @@ -16,6 +16,7 @@ import dataobject_scale_offset import plot_test import shape_test +import multichannel_test if pyversion >= "3.6": import itom_stubs_generator import itom_jedilib @@ -34,6 +35,7 @@ def suite(): suite.addTest(unittest.makeSuite(dataobject_scale_offset.DataObjectScaleOffset)) suite.addTest(unittest.makeSuite(plot_test.PlotTest)) suite.addTest(unittest.makeSuite(shape_test.ShapeTest)) + suite.addTest(unittest.makeSuite(multichannel_test.MultiChannelDummyGrabberTest)) if pyversion >= "3.6": suite.addTest(unittest.makeSuite(itom_stubs_generator.ItomStubsGenTest)) suite.addTest(unittest.makeSuite(itom_jedilib.ItomJediLibTest)) From dfd37478528ad79efdd027dd825cc44b74540217 Mon Sep 17 00:00:00 2001 From: robin92 Date: Thu, 6 May 2021 12:28:36 +0200 Subject: [PATCH 12/62] added optional channel parameter for AddInGrabber::sendDataToListeners. --- common/addInGrabber.h | 6 +++--- common/sources/addInGrabber.cpp | 16 ++++++++++------ python_unittests/multichannel_test.py | 6 +++--- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/common/addInGrabber.h b/common/addInGrabber.h index 556335b7c..44670cbc4 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -90,7 +90,7 @@ namespace ito */ virtual ito::RetVal retrieveData(ito::DataObject *externalDataObject = NULL) = 0; - virtual ito::RetVal sendDataToListeners(int waitMS) = 0; /*!< sends m_data to all registered listeners. */ + virtual ito::RetVal sendDataToListeners(int waitMS, QString channel = "") = 0; /*!< sends m_data to all registered listeners. */ inline int grabberStartedCount() { return m_started; } /*!< returns the number of started devices \see m_started */ @@ -151,7 +151,7 @@ namespace ito */ virtual ito::RetVal checkData(ito::DataObject *externalDataObject = NULL); - virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ + virtual ito::RetVal sendDataToListeners(int waitMS, QString channel = ""); /*!< sends m_data to all registered listeners. */ public: AddInGrabber(); ~AddInGrabber(); @@ -181,7 +181,7 @@ namespace ito }; QMap m_channels; /*!< Map for recently grabbed images of various channels*/ virtual ito::RetVal checkData(ito::DataObject *externalDataObject = NULL); - virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ + virtual ito::RetVal sendDataToListeners(int waitMS, QString channel = ""); /*!< sends m_data to all registered listeners. */ ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ void addChannel(QString name); virtual ito::RetVal synchronizeParamswithChannelParams(QString previousChannel);/*!< synchronizes m_params with the params of default channel container */ diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index fb12a722a..fc70ea14c 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -289,8 +289,9 @@ namespace ito \param [in] waitMS indicates the time (in ms) that should be waiting until every registered live image source node received m_image. 0: no wait, -1: infinit waiting time, else time in milliseconds \return retOk if everything was ok, retWarning if live image could not be invoked */ - ito::RetVal AddInGrabber::sendDataToListeners(int waitMS) + ito::RetVal AddInGrabber::sendDataToListeners(int waitMS, QString channel) { + Q_UNUSED(channel); QObject *obj; ito::RetVal retValue = ito::retOk; // int i=0; @@ -391,20 +392,23 @@ namespace ito //\param [in] waitMS indicates the time (in ms) that should be waiting until every registered live image source node received m_image. 0: no wait, -1: infinit waiting time, else time in milliseconds //\return retOk if everything was ok, retWarning if live image could not be invoked //*/ - ito::RetVal AddInMultiChannelGrabber::sendDataToListeners(int waitMS) + ito::RetVal AddInMultiChannelGrabber::sendDataToListeners(int waitMS, QString channel) { QObject *obj; ito::RetVal retValue = ito::retOk; // int i=0; int size = m_autoGrabbingListeners.size(); - char* defChannel = m_params["defaultChannel"].getVal(); - if (m_channels.contains(defChannel)) + if (channel.isEmpty()) + { + channel = m_params["defaultChannel"].getVal(); + } + if (m_channels.contains(channel)) { if (waitMS == 0) { foreach(obj, m_autoGrabbingListeners) { - if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[defChannel].data))), Q_ARG(ItomSharedSemaphore*, NULL))) + if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[channel].data))), Q_ARG(ItomSharedSemaphore*, NULL))) { retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); } @@ -419,7 +423,7 @@ namespace ito { waitConds[i] = new ItomSharedSemaphore(); // \todo On Linux a crash occurs here when closing the liveImage ... maybe the same reason why we get an error message on windows? - if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[defChannel].data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) + if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[channel].data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) { retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); } diff --git a/python_unittests/multichannel_test.py b/python_unittests/multichannel_test.py index 3f754fe8c..cf7566d5b 100644 --- a/python_unittests/multichannel_test.py +++ b/python_unittests/multichannel_test.py @@ -6,9 +6,9 @@ def channelSpecificFunc1(): cam.setParam('defaultChannel','Channel_1') cam.setParam('channelSpecificParameter',200) - def channelSpecificFunc2(): - cam = dataIO("DummyMultiChannelGrabber") - cam.setParam('channelSpecificParameter:Channel_1',200) +def channelSpecificFunc2(): + cam = dataIO("DummyMultiChannelGrabber") + cam.setParam('channelSpecificParameter:Channel_1',200) class MultiChannelDummyGrabberTest(unittest.TestCase): @classmethod From feec1b21bd6d034689c7e45e9b569fb3ee78f25b Mon Sep 17 00:00:00 2001 From: robin92 Date: Fri, 7 May 2021 12:48:53 +0200 Subject: [PATCH 13/62] started implementation of channelList param --- common/sources/addInGrabber.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index fc70ea14c..9537eae32 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -376,6 +376,8 @@ namespace ito paramVal = ito::Param("defaultChannel", ito::ParamBase::String, "", tr("indicates the current default channel").toLatin1().data()); m_params.insert(paramVal.getName(), paramVal); + + paramVal = ito::Param("channelList", ito::ParamBase::StringList, "", tr("names of the channels provided by the plugin").toLatin1().data()); } //---------------------------------------------------------------------------------------------------------------------------------- @@ -520,6 +522,12 @@ namespace ito { ChannelContainer a(m_params["roi"], m_params["pixelFormat"], m_params["sizex"], m_params["sizey"]); m_channels[name] = a; + const ByteArray* channelList = m_params["channelList"].getVal(); + int len = 0; + m_params["channelList"].getVal(len); + QVector qVectorList(len, *channelList); + qVectorList.append(ByteArray(name.toLatin1().data())); + m_params["channelList"].setVal(qVectorList.data()); } From 2daa835557e1be4dea302280457c6c158547fcd6 Mon Sep 17 00:00:00 2001 From: robin92 Date: Mon, 10 May 2021 10:09:23 +0200 Subject: [PATCH 14/62] addInGrabber: update channelList after adding a channel --- common/sources/addInGrabber.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index 9537eae32..f66d670b9 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -377,7 +377,8 @@ namespace ito paramVal = ito::Param("defaultChannel", ito::ParamBase::String, "", tr("indicates the current default channel").toLatin1().data()); m_params.insert(paramVal.getName(), paramVal); - paramVal = ito::Param("channelList", ito::ParamBase::StringList, "", tr("names of the channels provided by the plugin").toLatin1().data()); + paramVal = ito::Param("channelList", ito::ParamBase::StringList, {}, tr("names of the channels provided by the plugin").toLatin1().data()); + m_params.insert(paramVal.getName(), paramVal); } //---------------------------------------------------------------------------------------------------------------------------------- @@ -525,9 +526,10 @@ namespace ito const ByteArray* channelList = m_params["channelList"].getVal(); int len = 0; m_params["channelList"].getVal(len); + QVector qVectorList(len, *channelList); qVectorList.append(ByteArray(name.toLatin1().data())); - m_params["channelList"].setVal(qVectorList.data()); + m_params["channelList"].setVal(qVectorList.data(),qVectorList.length()); } From 3e336de6c51666d28c968176d4338406c726a58b Mon Sep 17 00:00:00 2001 From: robin92 Date: Mon, 10 May 2021 19:42:28 +0200 Subject: [PATCH 15/62] addInGrabber.cpp: set channelList to readonly --- common/sources/addInGrabber.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index f66d670b9..1e53fff57 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -377,7 +377,7 @@ namespace ito paramVal = ito::Param("defaultChannel", ito::ParamBase::String, "", tr("indicates the current default channel").toLatin1().data()); m_params.insert(paramVal.getName(), paramVal); - paramVal = ito::Param("channelList", ito::ParamBase::StringList, {}, tr("names of the channels provided by the plugin").toLatin1().data()); + paramVal = ito::Param("channelList", ito::ParamBase::StringList | ito::ParamBase::Readonly, {}, tr("names of the channels provided by the plugin").toLatin1().data()); m_params.insert(paramVal.getName(), paramVal); } From 96478886db97c8b6925fa17bddbc469dddcc9787 Mon Sep 17 00:00:00 2001 From: robin92 Date: Tue, 8 Jun 2021 15:44:03 +0200 Subject: [PATCH 16/62] changed m_autoGrabbingListener to QMultiMap --- common/addInGrabber.h | 200 ++--- common/addInInterface.h | 2 +- common/sources/addInGrabber.cpp | 1365 +++++++++++++++-------------- common/sources/addInInterface.cpp | 130 +-- 4 files changed, 875 insertions(+), 822 deletions(-) diff --git a/common/addInGrabber.h b/common/addInGrabber.h index 44670cbc4..dc43db61c 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -39,26 +39,26 @@ namespace ito { class AddInAbstractGrabberPrivate; - class AddInGrabberPrivate; - class AddInMultiChannelGrabberPrivate; + class AddInGrabberPrivate; + class AddInMultiChannelGrabberPrivate; class ITOMCOMMONQT_EXPORT AddInAbstractGrabber : public ito::AddInDataIO { Q_OBJECT - public: - enum PixelFormat - { - mono8 = ito::tUInt8, - mono10 = ito::tUInt16, - mono12 = ito::tUInt16, - mono16 = ito::tUInt16, - rgb32 = ito::tRGBA32, - }; + public: + enum PixelFormat + { + mono8 = ito::tUInt8, + mono10 = ito::tUInt16, + mono12 = ito::tUInt16, + mono16 = ito::tUInt16, + rgb32 = ito::tRGBA32, + }; #if QT_VERSION < 0x050500 - //for >= Qt 5.5.0 see Q_ENUM definition below - Q_ENUMS(PixelFormat) + //for >= Qt 5.5.0 see Q_ENUM definition below + Q_ENUMS(PixelFormat) #else - Q_ENUM(PixelFormat) + Q_ENUM(PixelFormat) #endif private: //! counter indicating how many times startDevice has been called @@ -90,7 +90,7 @@ namespace ito */ virtual ito::RetVal retrieveData(ito::DataObject *externalDataObject = NULL) = 0; - virtual ito::RetVal sendDataToListeners(int waitMS, QString channel = "") = 0; /*!< sends m_data to all registered listeners. */ + virtual ito::RetVal sendDataToListeners(int waitMS) = 0; /*!< sends m_data to all registered listeners. */ inline int grabberStartedCount() { return m_started; } /*!< returns the number of started devices \see m_started */ @@ -122,97 +122,97 @@ namespace ito } public: - static int pixelFormatStringToBpp(const char* val); /*!< this method returns the size of a pixel for a given pixelFormat */ - static int pixelFormatStringToEnum(const char* val, bool* ok); /*!< this method maps a string to a value of pixelFormat */ + static int pixelFormatStringToBpp(const char* val); /*!< this method returns the size of a pixel for a given pixelFormat */ + static int pixelFormatStringToEnum(const char* val, bool* ok); /*!< this method maps a string to a value of pixelFormat */ AddInAbstractGrabber(); ~AddInAbstractGrabber(); }; - class ITOMCOMMONQT_EXPORT AddInGrabber : public AddInAbstractGrabber - { - Q_OBJECT - private: - - AddInGrabberPrivate *dd; - protected: - ito::DataObject m_data; /*!< variable for the recently grabbed image*/ - - //! implement this method in order to check if m_image should be (re)allocated with respect to the current sizex, sizey, bpp... - /*! - Call this method if the size or bitdepth of your camera has changed (e.g. in your constructor, too). In this method, compare if the new size - is equal to the old one. If this is not the case, use the following example to set m_image to a newly allocated dataObject. The old dataObject - is deleted automatically with respect to its internal reference counter: - - m_image = ito::DataObject(futureHeight,futureWidth,futureType); - - \see m_image - */ - virtual ito::RetVal checkData(ito::DataObject *externalDataObject = NULL); - - virtual ito::RetVal sendDataToListeners(int waitMS, QString channel = ""); /*!< sends m_data to all registered listeners. */ - public: - AddInGrabber(); - ~AddInGrabber(); - - }; - - class ITOMCOMMONQT_EXPORT AddInMultiChannelGrabber : public AddInAbstractGrabber - { - Q_OBJECT - private: - AddInMultiChannelGrabberPrivate *dd; - protected: - - struct ChannelContainer - { - ito::DataObject data; - QMap m_channelParam; - ChannelContainer() {}; - ChannelContainer(ito::Param roi, ito::Param pixelFormat, ito::Param sizex, ito::Param sizey) - { - m_channelParam.insert("pixelFormat",pixelFormat); - m_channelParam.insert("roi", roi); - m_channelParam.insert("sizex", sizex); - m_channelParam.insert("sizey", sizey); - - } - }; - QMap m_channels; /*!< Map for recently grabbed images of various channels*/ - virtual ito::RetVal checkData(ito::DataObject *externalDataObject = NULL); - virtual ito::RetVal sendDataToListeners(int waitMS, QString channel = ""); /*!< sends m_data to all registered listeners. */ - ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ - void addChannel(QString name); - virtual ito::RetVal synchronizeParamswithChannelParams(QString previousChannel);/*!< synchronizes m_params with the params of default channel container */ - virtual ito::RetVal applyParamsToChannelParams(QStringList keyList = QStringList()); - - ////! Specific function to set the parameters in the respective plugin class - ///*! - //This function is a specific implementation of setParam. Overload this function to process parameters individually in the plugin class. This function is called by setParam after the parameter has been parsed and checked . - - //\param [in] val parameter to be processed - //\param [in] it ParamMapIterator iterator to the parameter in m_params - //\param [in] suffix possible suffix of the parameter - //\param [in] key of the parameter - //\param [in] index of the parameter - //\param [in] hasIndex is set to true if parameter has an index - //\param [in] set ok to true if parameter was processed - //\param [in] add key of changed channel specific parameters to pendingUpdate. - //\return retOk if everything was ok, else retError - //*/ - virtual ito::RetVal setParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok, QStringList &pendingUpdate) = 0; - virtual ito::RetVal getParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok) = 0; - void updateSizeXY(); /*!< updates sizex und sizey*/ - - public: - AddInMultiChannelGrabber(); - ~AddInMultiChannelGrabber(); - public slots: - ito::RetVal setParam(QSharedPointer val, ItomSharedSemaphore *waitCond = NULL) final; - ito::RetVal getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) final; - - }; + class ITOMCOMMONQT_EXPORT AddInGrabber : public AddInAbstractGrabber + { + Q_OBJECT + private: + + AddInGrabberPrivate *dd; + protected: + ito::DataObject m_data; /*!< variable for the recently grabbed image*/ + + //! implement this method in order to check if m_image should be (re)allocated with respect to the current sizex, sizey, bpp... + /*! + Call this method if the size or bitdepth of your camera has changed (e.g. in your constructor, too). In this method, compare if the new size + is equal to the old one. If this is not the case, use the following example to set m_image to a newly allocated dataObject. The old dataObject + is deleted automatically with respect to its internal reference counter: + + m_image = ito::DataObject(futureHeight,futureWidth,futureType); + + \see m_image + */ + virtual ito::RetVal checkData(ito::DataObject *externalDataObject = NULL); + + virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ + public: + AddInGrabber(); + ~AddInGrabber(); + + }; + + class ITOMCOMMONQT_EXPORT AddInMultiChannelGrabber : public AddInAbstractGrabber + { + Q_OBJECT + private: + AddInMultiChannelGrabberPrivate *dd; + protected: + + struct ChannelContainer + { + ito::DataObject data; + QMap m_channelParam; + ChannelContainer() {}; + ChannelContainer(ito::Param roi, ito::Param pixelFormat, ito::Param sizex, ito::Param sizey) + { + m_channelParam.insert("pixelFormat",pixelFormat); + m_channelParam.insert("roi", roi); + m_channelParam.insert("sizex", sizex); + m_channelParam.insert("sizey", sizey); + + } + }; + QMap m_channels; /*!< Map for recently grabbed images of various channels*/ + virtual ito::RetVal checkData(ito::DataObject *externalDataObject = NULL); + virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ + ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ + void addChannel(QString name); + virtual ito::RetVal synchronizeParamswithChannelParams(QString previousChannel);/*!< synchronizes m_params with the params of default channel container */ + virtual ito::RetVal applyParamsToChannelParams(QStringList keyList = QStringList()); + + ////! Specific function to set the parameters in the respective plugin class + ///*! + //This function is a specific implementation of setParam. Overload this function to process parameters individually in the plugin class. This function is called by setParam after the parameter has been parsed and checked . + + //\param [in] val parameter to be processed + //\param [in] it ParamMapIterator iterator to the parameter in m_params + //\param [in] suffix possible suffix of the parameter + //\param [in] key of the parameter + //\param [in] index of the parameter + //\param [in] hasIndex is set to true if parameter has an index + //\param [in] set ok to true if parameter was processed + //\param [in] add key of changed channel specific parameters to pendingUpdate. + //\return retOk if everything was ok, else retError + //*/ + virtual ito::RetVal setParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok, QStringList &pendingUpdate) = 0; + virtual ito::RetVal getParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok) = 0; + void updateSizeXY(); /*!< updates sizex und sizey*/ + + public: + AddInMultiChannelGrabber(); + ~AddInMultiChannelGrabber(); + public slots: + ito::RetVal setParam(QSharedPointer val, ItomSharedSemaphore *waitCond = NULL) final; + ito::RetVal getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) final; + ito::RetVal changeChannelForListerners(const QString& newChannel, QObject* obj); + }; diff --git a/common/addInInterface.h b/common/addInInterface.h index 4047858e0..3854c1932 100755 --- a/common/addInInterface.h +++ b/common/addInInterface.h @@ -676,7 +676,7 @@ namespace ito //void timerEvent (QTimerEvent *event) = 0; //implement this event in your plugin, if you are a device, which is accessible by any liveImage!!! - QSet m_autoGrabbingListeners; /*!< list of listeners (live image source nodes), which want to have updates from this camera */ + QMultiMap m_autoGrabbingListeners; /*!< MultiMap of listeners (live image source nodes), which want to have updates from this camera. The String indicates the channel. */ int m_timerID; /*!< internal ID of the timer, which acquires images for any live view (if allowed) */ int m_timerIntervalMS; /*!< timer interval (in ms)*/ bool m_autoGrabbingEnabled; /*!< defines, whether the auto-grabbing timer for any live image can be activated. If this variable becomes false and any timer is activated, this timer is killed.*/ diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index 1e53fff57..4e5f85416 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -41,13 +41,13 @@ namespace ito public: int m_nrLiveImageErrors; //number of consecutive errors when automatically grabbing the next image. If this number becomes bigger than a threshold, auto grabbing will be disabled. }; - class AddInGrabberPrivate - { + class AddInGrabberPrivate + { - }; - class AddInMultiChannelGrabberPrivate - { - }; + }; + class AddInMultiChannelGrabberPrivate + { + }; /*! \class AddInAbstractGrabber @@ -76,57 +76,57 @@ namespace ito DELETE_AND_SET_NULL(dd); } - //---------------------------------------------------------------------------------------------------------------------------------- - //! this method returns the size of a pixel for a given pixelFormat. - int AddInAbstractGrabber::pixelFormatStringToBpp(const char* val) - { - bool ok; - int format = pixelFormatStringToEnum(val, &ok); - if (ok) - { - if (format == mono8) - { - return 8; - } - else if (format == mono10 || format == mono12 || format == mono16) - { - return 16; - } - else if(format == rgb32) - { - return 40; - } - else - { - return -1; - } - } - else - { - return -1; - } - - } - //---------------------------------------------------------------------------------------------------------------------------------- - /*! - \class AddInAbstractGrabber - \brief This method maps a string to a value of pixelFormat. - - This function maps a string to a pixel format by using QMetaType. - */ - - int AddInAbstractGrabber::pixelFormatStringToEnum(const char* val, bool* ok) - { + //---------------------------------------------------------------------------------------------------------------------------------- + //! this method returns the size of a pixel for a given pixelFormat. + int AddInAbstractGrabber::pixelFormatStringToBpp(const char* val) + { + bool ok; + int format = pixelFormatStringToEnum(val, &ok); + if (ok) + { + if (format == mono8) + { + return 8; + } + else if (format == mono10 || format == mono12 || format == mono16) + { + return 16; + } + else if(format == rgb32) + { + return 40; + } + else + { + return -1; + } + } + else + { + return -1; + } + + } + //---------------------------------------------------------------------------------------------------------------------------------- + /*! + \class AddInAbstractGrabber + \brief This method maps a string to a value of pixelFormat. + + This function maps a string to a pixel format by using QMetaType. + */ + + int AddInAbstractGrabber::pixelFormatStringToEnum(const char* val, bool* ok) + { #if QT_VERSION >= 0x050500 - const QMetaObject mo = staticMetaObject; + const QMetaObject mo = staticMetaObject; #else - const QMetaObject mo = StaticQtMetaObject::get(); + const QMetaObject mo = StaticQtMetaObject::get(); #endif - QMetaEnum me = mo.enumerator(mo.indexOfEnumerator("PixelFormat")); - int pixelFormat = me.keyToValue(val, ok); - return pixelFormat; - } - //---------------------------------------------------------------------------------------------------------------------------------- + QMetaEnum me = mo.enumerator(mo.indexOfEnumerator("PixelFormat")); + int pixelFormat = me.keyToValue(val, ok); + return pixelFormat; + } + //---------------------------------------------------------------------------------------------------------------------------------- //! if any live image has been connected to this camera, this event will be regularly fired. /*! This event is continoulsy fired if auto grabbing is enabled. At first, the image is acquired (method acquire). Then @@ -190,339 +190,331 @@ namespace ito } } } - //---------------------------------------------------------------------------------------------------------------------------------- - //! constructor - AddInGrabber::AddInGrabber() : - AddInAbstractGrabber() - { - dd = new AddInGrabberPrivate(); - } - - //---------------------------------------------------------------------------------------------------------------------------------- - //! destructor - AddInGrabber::~AddInGrabber() - { - DELETE_AND_SET_NULL(dd); - } - //---------------------------------------------------------------------------------------------------------------------------------- - ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) - { - int futureHeight = m_params["sizey"].getVal(); - int futureWidth = m_params["sizex"].getVal(); - int futureType; - - int bpp = m_params["bpp"].getVal(); - if (bpp <= 8) - { - futureType = ito::tUInt8; - } - else if (bpp <= 16) - { - futureType = ito::tUInt16; - } - else if (bpp <= 32) - { - futureType = ito::tInt32; - } - else - { - futureType = ito::tFloat64; - } - if (!m_params.contains("sizez")) - { - - if (externalDataObject == NULL) - { - if (m_data.getDims() < 2 || m_data.getSize(0) != (unsigned int)futureHeight || m_data.getSize(1) != (unsigned int)futureWidth || m_data.getType() != futureType) - { - m_data = ito::DataObject(futureHeight, futureWidth, futureType); - } - } - else - { - int dims = externalDataObject->getDims(); - if (externalDataObject->getDims() == 0) - { - *externalDataObject = ito::DataObject(futureHeight, futureWidth, futureType); - } - else if (externalDataObject->calcNumMats() != 1) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object has more or less than 1 plane. It must be of right size and type or an uninitilized image.").toLatin1().data()); - } - else if (externalDataObject->getSize(dims - 2) != (unsigned int)futureHeight || externalDataObject->getSize(dims - 1) != (unsigned int)futureWidth || externalDataObject->getType() != futureType) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); - } - } - } - else - { - int numChannel = m_params["sizez"].getVal(); - if (externalDataObject == NULL) - { - if (m_data.getDims() < 3 || m_data.getSize(0) != (unsigned int)numChannel || m_data.getSize(1) != (unsigned int)futureHeight || m_data.getSize(2) != (unsigned int)futureWidth || m_data.getType() != futureType) - { - m_data = ito::DataObject(numChannel, futureHeight, futureWidth, futureType); - } - } - else - { - int dims = externalDataObject->getDims(); - if (externalDataObject->getDims() == 0) - { - *externalDataObject = ito::DataObject(numChannel, futureHeight, futureWidth, futureType); - } - else if (externalDataObject->getSize(dims - 3) != (unsigned int)numChannel || externalDataObject->getSize(dims - 2) != (unsigned int)futureHeight || externalDataObject->getSize(dims - 1) != (unsigned int)futureWidth || externalDataObject->getType() != futureType) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); - } - } - } - - return ito::retOk; - } - //---------------------------------------------------------------------------------------------------------------------------------- - //! sends m_image to all registered listeners. - /*! - This method is continuously called from timerEvent. Also call this method from your getVal-Method (usually with 0-timeout) - - \param [in] waitMS indicates the time (in ms) that should be waiting until every registered live image source node received m_image. 0: no wait, -1: infinit waiting time, else time in milliseconds - \return retOk if everything was ok, retWarning if live image could not be invoked - */ - ito::RetVal AddInGrabber::sendDataToListeners(int waitMS, QString channel) - { - Q_UNUSED(channel); - QObject *obj; - ito::RetVal retValue = ito::retOk; - // int i=0; - int size = m_autoGrabbingListeners.size(); - - if (waitMS == 0) - { - foreach(obj, m_autoGrabbingListeners) - { - if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_data))), Q_ARG(ItomSharedSemaphore*, NULL))) - { - retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); - } - } - } - else if (m_autoGrabbingListeners.size() > 0) - { - ItomSharedSemaphore** waitConds = new ItomSharedSemaphore*[size]; - int i = 0; - - foreach(obj, m_autoGrabbingListeners) - { - waitConds[i] = new ItomSharedSemaphore(); - // \todo On Linux a crash occurs here when closing the liveImage ... maybe the same reason why we get an error message on windows? - if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) - { - retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); - } - - i++; - } - - for (i = 0; i < size; i++) - { - if (!waitConds[i]->wait(waitMS)) - { - qDebug() << "timeout in number: " << i << "number of items: " << size; - } - waitConds[i]->deleteSemaphore(); - waitConds[i] = NULL; - } - - delete[] waitConds; - waitConds = NULL; - } - - return retValue; - } - - //---------------------------------------------------------------------------------------------------------------------------------- - //! constructor - AddInMultiChannelGrabber::AddInMultiChannelGrabber() : - AddInAbstractGrabber() - { - dd = new AddInMultiChannelGrabberPrivate(); - - ito::Param paramVal("name", ito::ParamBase::String | ito::ParamBase::Readonly, "DummyMultiChannelGrabber", "GrabberName"); - paramVal.setMeta(new ito::StringMeta(ito::StringMeta::String, "General"), true); - m_params.insert(paramVal.getName(), paramVal); - - int roi[] = { 0, 0, 2048, 2048 }; - paramVal = ito::Param("roi", ito::ParamBase::IntArray, 4, roi, tr("ROI (x,y,width,height) [this replaces the values x0,x1,y0,y1]").toLatin1().data()); - ito::RectMeta *rm = new ito::RectMeta(ito::RangeMeta(roi[0], roi[0] + roi[2] - 1), ito::RangeMeta(roi[1], roi[1] + roi[3] - 1), "ImageFormatControl"); - paramVal.setMeta(rm, true); - m_params.insert(paramVal.getName(), paramVal); - - paramVal = ito::Param("sizex", ito::ParamBase::Int | ito::ParamBase::Readonly, 4, 4096, 4096, tr("size in x (cols) [px]").toLatin1().data()); - paramVal.getMetaT()->setCategory("ImageFormatControl"); - m_params.insert(paramVal.getName(), paramVal); - - paramVal = ito::Param("sizey", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 4096, 4096, tr("size in y (rows) [px]").toLatin1().data()); - paramVal.getMetaT()->setCategory("ImageFormatControl"); - m_params.insert(paramVal.getName(), paramVal); - - ito::StringMeta *m = new ito::StringMeta(ito::StringMeta::String, "mono8"); - m->addItem("mono10"); - m->addItem("mono12"); - m->addItem("mono16"); - paramVal = ito::Param("pixelFormat", ito::ParamBase::String, "mono8", tr("bitdepth of images: mono8, mono10, mono12, mono16, rgb32").toLatin1().data()); - paramVal.setMeta(m, true); - m_params.insert(paramVal.getName(), paramVal); - - paramVal = ito::Param("defaultChannel", ito::ParamBase::String, "", tr("indicates the current default channel").toLatin1().data()); - m_params.insert(paramVal.getName(), paramVal); + //---------------------------------------------------------------------------------------------------------------------------------- + //! constructor + AddInGrabber::AddInGrabber() : + AddInAbstractGrabber() + { + dd = new AddInGrabberPrivate(); + } + + //---------------------------------------------------------------------------------------------------------------------------------- + //! destructor + AddInGrabber::~AddInGrabber() + { + DELETE_AND_SET_NULL(dd); + } + //---------------------------------------------------------------------------------------------------------------------------------- + ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) + { + int futureHeight = m_params["sizey"].getVal(); + int futureWidth = m_params["sizex"].getVal(); + int futureType; + + int bpp = m_params["bpp"].getVal(); + if (bpp <= 8) + { + futureType = ito::tUInt8; + } + else if (bpp <= 16) + { + futureType = ito::tUInt16; + } + else if (bpp <= 32) + { + futureType = ito::tInt32; + } + else + { + futureType = ito::tFloat64; + } + if (!m_params.contains("sizez")) + { + + if (externalDataObject == NULL) + { + if (m_data.getDims() < 2 || m_data.getSize(0) != (unsigned int)futureHeight || m_data.getSize(1) != (unsigned int)futureWidth || m_data.getType() != futureType) + { + m_data = ito::DataObject(futureHeight, futureWidth, futureType); + } + } + else + { + int dims = externalDataObject->getDims(); + if (externalDataObject->getDims() == 0) + { + *externalDataObject = ito::DataObject(futureHeight, futureWidth, futureType); + } + else if (externalDataObject->calcNumMats() != 1) + { + return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object has more or less than 1 plane. It must be of right size and type or an uninitilized image.").toLatin1().data()); + } + else if (externalDataObject->getSize(dims - 2) != (unsigned int)futureHeight || externalDataObject->getSize(dims - 1) != (unsigned int)futureWidth || externalDataObject->getType() != futureType) + { + return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); + } + } + } + else + { + int numChannel = m_params["sizez"].getVal(); + if (externalDataObject == NULL) + { + if (m_data.getDims() < 3 || m_data.getSize(0) != (unsigned int)numChannel || m_data.getSize(1) != (unsigned int)futureHeight || m_data.getSize(2) != (unsigned int)futureWidth || m_data.getType() != futureType) + { + m_data = ito::DataObject(numChannel, futureHeight, futureWidth, futureType); + } + } + else + { + int dims = externalDataObject->getDims(); + if (externalDataObject->getDims() == 0) + { + *externalDataObject = ito::DataObject(numChannel, futureHeight, futureWidth, futureType); + } + else if (externalDataObject->getSize(dims - 3) != (unsigned int)numChannel || externalDataObject->getSize(dims - 2) != (unsigned int)futureHeight || externalDataObject->getSize(dims - 1) != (unsigned int)futureWidth || externalDataObject->getType() != futureType) + { + return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); + } + } + } + + return ito::retOk; + } + //---------------------------------------------------------------------------------------------------------------------------------- + //! sends m_image to all registered listeners. + /*! + This method is continuously called from timerEvent. Also call this method from your getVal-Method (usually with 0-timeout) + + \param [in] waitMS indicates the time (in ms) that should be waiting until every registered live image source node received m_image. 0: no wait, -1: infinit waiting time, else time in milliseconds + \return retOk if everything was ok, retWarning if live image could not be invoked + */ + ito::RetVal AddInGrabber::sendDataToListeners(int waitMS) + { + QObject *obj; + ito::RetVal retValue = ito::retOk; + // int i=0; + int size = m_autoGrabbingListeners.size(); + + if (waitMS == 0) + { + foreach(obj, m_autoGrabbingListeners) + { + if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_data))), Q_ARG(ItomSharedSemaphore*, NULL))) + { + retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); + } + } + } + else if (m_autoGrabbingListeners.size() > 0) + { + ItomSharedSemaphore** waitConds = new ItomSharedSemaphore*[size]; + int i = 0; + + foreach(obj, m_autoGrabbingListeners) + { + waitConds[i] = new ItomSharedSemaphore(); + // \todo On Linux a crash occurs here when closing the liveImage ... maybe the same reason why we get an error message on windows? + if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) + { + retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); + } + + i++; + } + + for (i = 0; i < size; i++) + { + if (!waitConds[i]->wait(waitMS)) + { + qDebug() << "timeout in number: " << i << "number of items: " << size; + } + waitConds[i]->deleteSemaphore(); + waitConds[i] = NULL; + } + + delete[] waitConds; + waitConds = NULL; + } + + return retValue; + } + + //---------------------------------------------------------------------------------------------------------------------------------- + //! constructor + AddInMultiChannelGrabber::AddInMultiChannelGrabber() : + AddInAbstractGrabber() + { + dd = new AddInMultiChannelGrabberPrivate(); + + ito::Param paramVal("name", ito::ParamBase::String | ito::ParamBase::Readonly, "DummyMultiChannelGrabber", "GrabberName"); + paramVal.setMeta(new ito::StringMeta(ito::StringMeta::String, "General"), true); + m_params.insert(paramVal.getName(), paramVal); + + int roi[] = { 0, 0, 2048, 2048 }; + paramVal = ito::Param("roi", ito::ParamBase::IntArray, 4, roi, tr("ROI (x,y,width,height) [this replaces the values x0,x1,y0,y1]").toLatin1().data()); + ito::RectMeta *rm = new ito::RectMeta(ito::RangeMeta(roi[0], roi[0] + roi[2] - 1), ito::RangeMeta(roi[1], roi[1] + roi[3] - 1), "ImageFormatControl"); + paramVal.setMeta(rm, true); + m_params.insert(paramVal.getName(), paramVal); + + paramVal = ito::Param("sizex", ito::ParamBase::Int | ito::ParamBase::Readonly, 4, 4096, 4096, tr("size in x (cols) [px]").toLatin1().data()); + paramVal.getMetaT()->setCategory("ImageFormatControl"); + m_params.insert(paramVal.getName(), paramVal); + + paramVal = ito::Param("sizey", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 4096, 4096, tr("size in y (rows) [px]").toLatin1().data()); + paramVal.getMetaT()->setCategory("ImageFormatControl"); + m_params.insert(paramVal.getName(), paramVal); + + ito::StringMeta *m = new ito::StringMeta(ito::StringMeta::String, "mono8"); + m->addItem("mono10"); + m->addItem("mono12"); + m->addItem("mono16"); + paramVal = ito::Param("pixelFormat", ito::ParamBase::String, "mono8", tr("bitdepth of images: mono8, mono10, mono12, mono16, rgb32").toLatin1().data()); + paramVal.setMeta(m, true); + m_params.insert(paramVal.getName(), paramVal); + + paramVal = ito::Param("defaultChannel", ito::ParamBase::String, "", tr("indicates the current default channel").toLatin1().data()); + m_params.insert(paramVal.getName(), paramVal); paramVal = ito::Param("channelList", ito::ParamBase::StringList | ito::ParamBase::Readonly, {}, tr("names of the channels provided by the plugin").toLatin1().data()); m_params.insert(paramVal.getName(), paramVal); - } - - //---------------------------------------------------------------------------------------------------------------------------------- - //! destructor - AddInMultiChannelGrabber::~AddInMultiChannelGrabber() - { - DELETE_AND_SET_NULL(dd); - } - ////---------------------------------------------------------------------------------------------------------------------------------- - ////! sends m_image to all registered listeners. - ///*! - //This method is continuously called from timerEvent. Also call this method from your getVal-Method (usually with 0-timeout) - - //\param [in] waitMS indicates the time (in ms) that should be waiting until every registered live image source node received m_image. 0: no wait, -1: infinit waiting time, else time in milliseconds - //\return retOk if everything was ok, retWarning if live image could not be invoked - //*/ - ito::RetVal AddInMultiChannelGrabber::sendDataToListeners(int waitMS, QString channel) - { - QObject *obj; - ito::RetVal retValue = ito::retOk; - // int i=0; - int size = m_autoGrabbingListeners.size(); - if (channel.isEmpty()) + } + + //---------------------------------------------------------------------------------------------------------------------------------- + //! destructor + AddInMultiChannelGrabber::~AddInMultiChannelGrabber() + { + DELETE_AND_SET_NULL(dd); + } + ////---------------------------------------------------------------------------------------------------------------------------------- + ////! sends m_image to all registered listeners. + ///*! + //This method is continuously called from timerEvent. Also call this method from your getVal-Method (usually with 0-timeout) + + //\param [in] waitMS indicates the time (in ms) that should be waiting until every registered live image source node received m_image. 0: no wait, -1: infinit waiting time, else time in milliseconds + //\return retOk if everything was ok, retWarning if live image could not be invoked + //*/ + ito::RetVal AddInMultiChannelGrabber::sendDataToListeners(int waitMS) + { + ito::RetVal retValue = ito::retOk; + int size = m_autoGrabbingListeners.size(); + if (waitMS == 0) { - channel = m_params["defaultChannel"].getVal(); + QMultiMap::iterator it = m_autoGrabbingListeners.begin(); + while(it != m_autoGrabbingListeners.end()) + { + if (!QMetaObject::invokeMethod(it.value(), "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[it.key().toLatin1().data()].data))), Q_ARG(ItomSharedSemaphore*, NULL))) + { + retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); + } + it++; + } } - if (m_channels.contains(channel)) - { - if (waitMS == 0) - { - foreach(obj, m_autoGrabbingListeners) - { - if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[channel].data))), Q_ARG(ItomSharedSemaphore*, NULL))) - { - retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); - } - } - } - else if (m_autoGrabbingListeners.size() > 0) - { - ItomSharedSemaphore** waitConds = new ItomSharedSemaphore*[size]; - int i = 0; - - foreach(obj, m_autoGrabbingListeners) - { - waitConds[i] = new ItomSharedSemaphore(); - // \todo On Linux a crash occurs here when closing the liveImage ... maybe the same reason why we get an error message on windows? - if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[channel].data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) - { - retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); - } - - i++; - } - - for (i = 0; i < size; i++) - { - if (!waitConds[i]->wait(waitMS)) - { - qDebug() << "timeout in number: " << i << "number of items: " << size; - } - waitConds[i]->deleteSemaphore(); - waitConds[i] = NULL; - } - - delete[] waitConds; - waitConds = NULL; - } - } - else - { - retValue += ito::RetVal(ito::retError, 1001, tr("channel not found in channel map").toLatin1().data()); - } - - return retValue; - } - - ito::RetVal ito::AddInMultiChannelGrabber::checkData(ito::DataObject *externalDataObject) - { - ito::RetVal retVal(ito::retOk); - bool ok; - unsigned int futureType; - PixelFormat format; - if (!externalDataObject) - { - - QMutableMapIterator i(m_channels); - while (i.hasNext()) { - i.next(); - futureType = pixelFormatStringToEnum(i.value().m_channelParam["pixelFormat"].getVal(),&ok); - if (ok) - { - int* roi = i.value().m_channelParam["roi"].getVal(); - int height = roi[3]; - int width = roi[2]; - if (i.value().data.getDims() < 2 || i.value().data.getSize(0) != height || i.value().data.getSize(1) != width || i.value().data.getType() != futureType) - { - i.value().data = ito::DataObject(height, width, futureType); - } - } - else - { - retVal += ito::RetVal(ito::retError, 0, tr("invalid pixel format").toLatin1().data()); - } - - } - } - else - { - char* channel = m_params["defaultChannel"].getVal(); - if (m_channels.contains(channel)) - { - futureType = pixelFormatStringToEnum(m_channels[channel].m_channelParam["pixelFormat"].getVal(), &ok); - if (ok) - { - int* roi = m_channels[channel].m_channelParam["roi"].getVal(); - int width = roi[2]; - int height = roi[3]; - if (externalDataObject->getDims() == 0) - { - *externalDataObject = ito::DataObject(height, width, futureType); - } - else if (externalDataObject->calcNumMats() != 1) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object has more or less than 1 plane. It must be of right size and type or an uninitilized image.").toLatin1().data()); - } - else if (externalDataObject->getSize(externalDataObject->getDims() - 2) != height || externalDataObject->getSize(externalDataObject->getDims() - 1) != width || externalDataObject->getType() != futureType) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); - } - } - else - { - retVal += ito::RetVal(ito::retError, 0, tr("invalid pixel format").toLatin1().data()); - } - } - } - return retVal; - } - - void AddInMultiChannelGrabber::addChannel(QString name) - { - ChannelContainer a(m_params["roi"], m_params["pixelFormat"], m_params["sizex"], m_params["sizey"]); - m_channels[name] = a; + else if (m_autoGrabbingListeners.size() > 0) + { + ItomSharedSemaphore** waitConds = new ItomSharedSemaphore*[size]; + int i = 0; + QMultiMap::iterator it = m_autoGrabbingListeners.begin(); + while (it != m_autoGrabbingListeners.end()) + { + waitConds[i] = new ItomSharedSemaphore(); + // \todo On Linux a crash occurs here when closing the liveImage ... maybe the same reason why we get an error message on windows? + if (it.value()) + { + if (!QMetaObject::invokeMethod(it.value(), "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[it.key().toLatin1().data()].data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) + { + retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); + } + } + it++; + i++; + } + + for (i = 0; i < size; i++) + { + if (!waitConds[i]->wait(waitMS)) + { + qDebug() << "timeout in number: " << i << "number of items: " << size; + } + waitConds[i]->deleteSemaphore(); + waitConds[i] = NULL; + } + + delete[] waitConds; + waitConds = NULL; + } + + + return retValue; + } + + ito::RetVal ito::AddInMultiChannelGrabber::checkData(ito::DataObject *externalDataObject) + { + ito::RetVal retVal(ito::retOk); + bool ok; + unsigned int futureType; + PixelFormat format; + if (!externalDataObject) + { + + QMutableMapIterator i(m_channels); + while (i.hasNext()) { + i.next(); + futureType = pixelFormatStringToEnum(i.value().m_channelParam["pixelFormat"].getVal(),&ok); + if (ok) + { + int* roi = i.value().m_channelParam["roi"].getVal(); + int height = roi[3]; + int width = roi[2]; + if (i.value().data.getDims() < 2 || i.value().data.getSize(0) != height || i.value().data.getSize(1) != width || i.value().data.getType() != futureType) + { + i.value().data = ito::DataObject(height, width, futureType); + } + } + else + { + retVal += ito::RetVal(ito::retError, 0, tr("invalid pixel format").toLatin1().data()); + } + + } + } + else + { + char* channel = m_params["defaultChannel"].getVal(); + if (m_channels.contains(channel)) + { + futureType = pixelFormatStringToEnum(m_channels[channel].m_channelParam["pixelFormat"].getVal(), &ok); + if (ok) + { + int* roi = m_channels[channel].m_channelParam["roi"].getVal(); + int width = roi[2]; + int height = roi[3]; + if (externalDataObject->getDims() == 0) + { + *externalDataObject = ito::DataObject(height, width, futureType); + } + else if (externalDataObject->calcNumMats() != 1) + { + return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object has more or less than 1 plane. It must be of right size and type or an uninitilized image.").toLatin1().data()); + } + else if (externalDataObject->getSize(externalDataObject->getDims() - 2) != height || externalDataObject->getSize(externalDataObject->getDims() - 1) != width || externalDataObject->getType() != futureType) + { + return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); + } + } + else + { + retVal += ito::RetVal(ito::retError, 0, tr("invalid pixel format").toLatin1().data()); + } + } + } + return retVal; + } + + void AddInMultiChannelGrabber::addChannel(QString name) + { + ChannelContainer a(m_params["roi"], m_params["pixelFormat"], m_params["sizex"], m_params["sizey"]); + m_channels[name] = a; const ByteArray* channelList = m_params["channelList"].getVal(); int len = 0; m_params["channelList"].getVal(len); @@ -531,294 +523,325 @@ namespace ito qVectorList.append(ByteArray(name.toLatin1().data())); m_params["channelList"].setVal(qVectorList.data(),qVectorList.length()); - } - - ito::RetVal AddInMultiChannelGrabber::adaptDefaultChannelParams() - { - ito::RetVal retVal(ito::retOk); - char* channel = m_params["defaultChannel"].getVal(); - return retVal; - - - } - - ito::RetVal AddInMultiChannelGrabber::getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) - { - ItomSharedSemaphoreLocker locker(waitCond); - ito::RetVal retValue; - QString key; - bool hasIndex = false; - int index; - QString suffix; - ParamMapIterator it; - bool ok = false; - - //parse the given parameter-name (if you support indexed or suffix-based parameters) - retValue += apiParseParamName(val->getName(), key, hasIndex, index, suffix); - - if (retValue == ito::retOk) - { - //gets the parameter key from m_params map (read-only is allowed, since we only want to get the value). - if (!suffix.isEmpty() && m_channels.contains(suffix)) - { - retValue += apiGetParamFromMapByKey(m_channels[suffix].m_channelParam, key, it, false); - if (retValue.containsError()) - { - retValue = ito::RetVal(ito::retError, 0, tr("an error occured while searching parameter \"%0\" for channel \"%1\". Maybe this is a channel specific parameter.").arg(key).arg(suffix).toLatin1().data()); - } - } - else - { - retValue += apiGetParamFromMapByKey(m_params, key, it, false); - } - } - if (!retValue.containsError()) - { - retValue += getParameter(val, it, suffix, key, index, hasIndex, ok); - } - if (!retValue.containsError() && !ok)//the parameter was not processed by the plugin, so it is done here - { - *val = it.value(); - } - - if (waitCond) - { - waitCond->returnValue = retValue; - waitCond->release(); - } - - return retValue; - } - - ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer val, ItomSharedSemaphore *waitCond/* = NULL*/) - { - ItomSharedSemaphoreLocker locker(waitCond); - ito::RetVal retValue; - bool hasIndex, ok; - int index; - QString suffix, key; - ParamMapIterator it; - retValue += ito::parseParamName(val->getName(), key, hasIndex, index, suffix); - int cntStartedDevices = grabberStartedCount(); - if (!retValue.containsError()) - { - if (!suffix.isEmpty() && m_channels.contains(suffix)) - { - retValue += apiGetParamFromMapByKey(m_channels[suffix].m_channelParam, key, it, true); - if (retValue.containsError()) - { - retValue = ito::RetVal(ito::retError, 0, tr("an error occured while searching parameter \"%0\" for channel \"%1\".Maybe this is a non channel specific parameter.").arg(key).arg(suffix).toLatin1().data()); - } - } - else - { - if (suffix.isEmpty()) - { - retValue += apiGetParamFromMapByKey(m_params, key, it, true); - } - else - { - retValue += ito::RetVal(ito::retError, 0, tr("unknown channel: %1").arg(suffix).toLatin1().data()); - } - } - } - if (!retValue.containsError()) - { - retValue += apiValidateParam(*it, *val, false, true); - } - if (!retValue.containsError()) - { - QStringList list; - retValue += setParameter(val, it, suffix, key, index, hasIndex, ok, list); - if (!retValue.containsError() && !ok) - { - if (key == "defaultChannel") - { - QString previousChannel = m_params["defaultChannel"].getVal(); - - if (m_channels.find(val->getVal()) != m_channels.end()) - { - retValue += it->copyValueFrom(&(*val)); - retValue += synchronizeParamswithChannelParams(previousChannel); - } - else - { - retValue += ito::RetVal(ito::retError, 0, tr("unknown channel: %1").arg(val->getVal()).toLatin1().data()); - } - } - else if (key == "roi") - { - if (!hasIndex) - { - retValue += it->copyValueFrom(&(*val)); - list << "roi"; - } - else - { - it->getVal()[index] = val->getVal(); - list << "roi"; - } - - } - else - { - retValue += it->copyValueFrom(&(*val)); // it seems that the plugin does not process the param therefore it is copied here - if (m_channels[m_params["defaultChannel"].getVal()].m_channelParam.contains(key)) - { - list << key; - } - } - } - if (list.contains("roi")) //if key is roi sizex and sizey must be adapted - { - updateSizeXY(); - } - if (!retValue.containsError()) - { - applyParamsToChannelParams(list); - checkData(); - } - } - if (!retValue.containsError()) - { - emit parametersChanged(m_params); - } - if (cntStartedDevices < grabberStartedCount()) - { - if (cntStartedDevices != 0) - { - retValue += startDevice(NULL); - setGrabberStarted(cntStartedDevices); - } - } - if (waitCond) - { - waitCond->returnValue = retValue; - waitCond->release(); - } - return retValue; - } - ////---------------------------------------------------------------------------------------------------------------------------------- - ////! synchronizes m_params with the params of default channel container - ///*! - //This method synchronizes the parameters from the current selected channel container with m_params. Call this function after changing the default parameter.Parameters which are not available for the current default channel are set to readonly - - //\param [in] previousChannel indicates the name of the previous default channel. This is needed to check whether a parameter is no longer contained in the current channel, which was contained in the previous one. - //\return retOk if everything was ok, else retError - //*/ - ito::RetVal AddInMultiChannelGrabber::synchronizeParamswithChannelParams(QString previousChannel) - { - ito::RetVal retVal(ito::retOk); - unsigned int flag = 0; - QMapIterator itChannelParams(m_channels[m_params["defaultChannel"].getVal()].m_channelParam); - bool channelDiffer = false; - //Check if the previous channel had the same parameters - QStringList defaulKeyList = m_channels[m_params["defaultChannel"].getVal()].m_channelParam.keys(); - qSort(defaulKeyList); - QStringList previousKeyList = m_channels[previousChannel].m_channelParam.keys(); - qSort(previousKeyList); - if (defaulKeyList != previousKeyList) - { - QStringList::ConstIterator itPreviousChannel; - for (itPreviousChannel = previousKeyList.constBegin(); itPreviousChannel != previousKeyList.constEnd(); ++itPreviousChannel) - { - if (!defaulKeyList.contains(*itPreviousChannel))//if param from previous channel is not included in current channel, set param in m_params to readonly. - { - flag = m_params[*itPreviousChannel].getFlags(); - flag |= ito::ParamBase::Readonly; - m_params[*itPreviousChannel].setFlags(flag); - //if a param is in the current channel include which was not in the previous one, the readonly flag will be removed when copying the param from the channel container to m_params - } - } - } - while (itChannelParams.hasNext()) - { - itChannelParams.next(); - if (m_params.contains(itChannelParams.key())) - { - m_params[itChannelParams.key()] = itChannelParams.value(); //copy param - } - else - { - retVal += ito::RetVal(ito::retError, 0, QString("channel parameter %1 not found in m_params").arg(itChannelParams.key()).toLatin1().data()); - } - - } - return retVal; - } - ////---------------------------------------------------------------------------------------------------------------------------------- - ////! copies value m_params to the channel params of the current default channel - ///*! - //This method copies params of m_params to the params of the channel container. This function is usally called after setParam to apply the changed entries of m_params to the corresponding channel container. - //If a parameter is not found in the channel container nothing happens. This function updates also sizex and sizey if roi or nothing is passed as key. - - //\param [in] keyList indicates which params are copied. If the List is empty all Parameters of the current channel are updated. - //\return retOk if everything was ok, else retError - //*/ - ito::RetVal AddInMultiChannelGrabber::applyParamsToChannelParams(QStringList keyList ) - { - ito::RetVal retVal(ito::retOk); - QString currentChannel = m_params["defaultChannel"].getVal(); - if (!keyList.isEmpty()) - { - if (m_channels.contains(currentChannel)) - { - QString tmp; - foreach(tmp, keyList) - { - if (m_channels[currentChannel].m_channelParam.contains(tmp)) - { - if (m_params.contains(tmp)) - { - m_channels[currentChannel].m_channelParam[tmp] = m_params[tmp]; - if (tmp == "roi") - { - m_channels[currentChannel].m_channelParam["sizex"] = m_params["sizex"]; - m_channels[currentChannel].m_channelParam["sizey"] = m_params["sizey"]; - } - } - else - { - retVal = ito::RetVal(ito::retError, 0, tr("unknown parameter %1 in m_params").arg(tmp).toLatin1().data()); - } - } - } - } - - else - { - retVal = ito::RetVal(ito::retError, 0, tr("unknown channel %1").arg(currentChannel).toLatin1().data()); - } - } - else - { - QMapIterator it(m_channels[m_params["defaultChannel"].getVal()].m_channelParam); - while (it.hasNext()) - { - it.next(); - const_cast(it.value()) = m_params[it.key()]; - - } - } - return retVal; - } - - ////---------------------------------------------------------------------------------------------------------------------------------- - ////! updates sizex and sizey - ///*! - //Call this function to update sizex and sizey. If the roi is changed via setParam this function will be call automatically. - //Do not forget to apply the changes to the channel parameters by calling applyParamsToChannelParams after calling this function. - - //\param [in] keyList indicates which params are copied. If the List is empty all Parameters of the current channel are updated. - //\return retOk if everything was ok, else retError - //*/ - void AddInMultiChannelGrabber::updateSizeXY() - { - const int* roi = m_params["roi"].getVal(); - int height = roi[3]; - int width = roi[2]; - m_params["sizex"].setVal(width); - m_params["sizey"].setVal(height); - } + } + + ito::RetVal AddInMultiChannelGrabber::adaptDefaultChannelParams() + { + ito::RetVal retVal(ito::retOk); + char* channel = m_params["defaultChannel"].getVal(); + return retVal; + + + } + + ito::RetVal AddInMultiChannelGrabber::getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) + { + ItomSharedSemaphoreLocker locker(waitCond); + ito::RetVal retValue; + QString key; + bool hasIndex = false; + int index; + QString suffix; + ParamMapIterator it; + bool ok = false; + + //parse the given parameter-name (if you support indexed or suffix-based parameters) + retValue += apiParseParamName(val->getName(), key, hasIndex, index, suffix); + + if (retValue == ito::retOk) + { + //gets the parameter key from m_params map (read-only is allowed, since we only want to get the value). + if (!suffix.isEmpty() && m_channels.contains(suffix)) + { + retValue += apiGetParamFromMapByKey(m_channels[suffix].m_channelParam, key, it, false); + if (retValue.containsError()) + { + retValue = ito::RetVal(ito::retError, 0, tr("an error occured while searching parameter \"%0\" for channel \"%1\". Maybe this is a channel specific parameter.").arg(key).arg(suffix).toLatin1().data()); + } + } + else + { + retValue += apiGetParamFromMapByKey(m_params, key, it, false); + } + } + if (!retValue.containsError()) + { + retValue += getParameter(val, it, suffix, key, index, hasIndex, ok); + } + if (!retValue.containsError() && !ok)//the parameter was not processed by the plugin, so it is done here + { + *val = it.value(); + } + + if (waitCond) + { + waitCond->returnValue = retValue; + waitCond->release(); + } + + return retValue; + } + + ito::RetVal AddInMultiChannelGrabber::changeChannelForListerners(const QString& newChannel, QObject* obj) + { + ito::RetVal retValue(ito::retOk); + bool found = false; + if (obj) + { + + QMultiMap::iterator i = m_autoGrabbingListeners.begin(); + while (i != m_autoGrabbingListeners.end()) + { + if (i.value() == obj) + { + found = true; + m_autoGrabbingListeners.remove(i.key(), i.value()); + m_autoGrabbingListeners.insert(newChannel, obj); + break; + } + + } + if (!found) + { + retValue += ito::RetVal(ito::retError, 0, tr("Could not find plot in m_autoGrabbingListeners").toLatin1().data()); + } + } + else + { + retValue += ito::RetVal(ito::retError, 0, "QObject not callable."); + } + return retValue; + } + + ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer val, ItomSharedSemaphore *waitCond/* = NULL*/) + { + ItomSharedSemaphoreLocker locker(waitCond); + ito::RetVal retValue; + bool hasIndex, ok; + int index; + QString suffix, key; + ParamMapIterator it; + retValue += ito::parseParamName(val->getName(), key, hasIndex, index, suffix); + int cntStartedDevices = grabberStartedCount(); + if (!retValue.containsError()) + { + if (!suffix.isEmpty() && m_channels.contains(suffix)) + { + retValue += apiGetParamFromMapByKey(m_channels[suffix].m_channelParam, key, it, true); + if (retValue.containsError()) + { + retValue = ito::RetVal(ito::retError, 0, tr("an error occured while searching parameter \"%0\" for channel \"%1\".Maybe this is a non channel specific parameter.").arg(key).arg(suffix).toLatin1().data()); + } + } + else + { + if (suffix.isEmpty()) + { + retValue += apiGetParamFromMapByKey(m_params, key, it, true); + } + else + { + retValue += ito::RetVal(ito::retError, 0, tr("unknown channel: %1").arg(suffix).toLatin1().data()); + } + } + } + if (!retValue.containsError()) + { + retValue += apiValidateParam(*it, *val, false, true); + } + if (!retValue.containsError()) + { + QStringList list; + retValue += setParameter(val, it, suffix, key, index, hasIndex, ok, list); + if (!retValue.containsError() && !ok) + { + if (key == "defaultChannel") + { + QString previousChannel = m_params["defaultChannel"].getVal(); + + if (m_channels.find(val->getVal()) != m_channels.end()) + { + retValue += it->copyValueFrom(&(*val)); + retValue += synchronizeParamswithChannelParams(previousChannel); + } + else + { + retValue += ito::RetVal(ito::retError, 0, tr("unknown channel: %1").arg(val->getVal()).toLatin1().data()); + } + } + else if (key == "roi") + { + if (!hasIndex) + { + retValue += it->copyValueFrom(&(*val)); + list << "roi"; + } + else + { + it->getVal()[index] = val->getVal(); + list << "roi"; + } + + } + else + { + retValue += it->copyValueFrom(&(*val)); // it seems that the plugin does not process the param therefore it is copied here + if (m_channels[m_params["defaultChannel"].getVal()].m_channelParam.contains(key)) + { + list << key; + } + } + } + if (list.contains("roi")) //if key is roi sizex and sizey must be adapted + { + updateSizeXY(); + } + if (!retValue.containsError()) + { + applyParamsToChannelParams(list); + checkData(); + } + } + if (!retValue.containsError()) + { + emit parametersChanged(m_params); + } + if (cntStartedDevices < grabberStartedCount()) + { + if (cntStartedDevices != 0) + { + retValue += startDevice(NULL); + setGrabberStarted(cntStartedDevices); + } + } + if (waitCond) + { + waitCond->returnValue = retValue; + waitCond->release(); + } + return retValue; + } + ////---------------------------------------------------------------------------------------------------------------------------------- + ////! synchronizes m_params with the params of default channel container + ///*! + //This method synchronizes the parameters from the current selected channel container with m_params. Call this function after changing the default parameter.Parameters which are not available for the current default channel are set to readonly + + //\param [in] previousChannel indicates the name of the previous default channel. This is needed to check whether a parameter is no longer contained in the current channel, which was contained in the previous one. + //\return retOk if everything was ok, else retError + //*/ + ito::RetVal AddInMultiChannelGrabber::synchronizeParamswithChannelParams(QString previousChannel) + { + ito::RetVal retVal(ito::retOk); + unsigned int flag = 0; + QMapIterator itChannelParams(m_channels[m_params["defaultChannel"].getVal()].m_channelParam); + bool channelDiffer = false; + //Check if the previous channel had the same parameters + QStringList defaulKeyList = m_channels[m_params["defaultChannel"].getVal()].m_channelParam.keys(); + qSort(defaulKeyList); + QStringList previousKeyList = m_channels[previousChannel].m_channelParam.keys(); + qSort(previousKeyList); + if (defaulKeyList != previousKeyList) + { + QStringList::ConstIterator itPreviousChannel; + for (itPreviousChannel = previousKeyList.constBegin(); itPreviousChannel != previousKeyList.constEnd(); ++itPreviousChannel) + { + if (!defaulKeyList.contains(*itPreviousChannel))//if param from previous channel is not included in current channel, set param in m_params to readonly. + { + flag = m_params[*itPreviousChannel].getFlags(); + flag |= ito::ParamBase::Readonly; + m_params[*itPreviousChannel].setFlags(flag); + //if a param is in the current channel include which was not in the previous one, the readonly flag will be removed when copying the param from the channel container to m_params + } + } + } + while (itChannelParams.hasNext()) + { + itChannelParams.next(); + if (m_params.contains(itChannelParams.key())) + { + m_params[itChannelParams.key()] = itChannelParams.value(); //copy param + } + else + { + retVal += ito::RetVal(ito::retError, 0, QString("channel parameter %1 not found in m_params").arg(itChannelParams.key()).toLatin1().data()); + } + + } + return retVal; + } + ////---------------------------------------------------------------------------------------------------------------------------------- + ////! copies value m_params to the channel params of the current default channel + ///*! + //This method copies params of m_params to the params of the channel container. This function is usally called after setParam to apply the changed entries of m_params to the corresponding channel container. + //If a parameter is not found in the channel container nothing happens. This function updates also sizex and sizey if roi or nothing is passed as key. + + //\param [in] keyList indicates which params are copied. If the List is empty all Parameters of the current channel are updated. + //\return retOk if everything was ok, else retError + //*/ + ito::RetVal AddInMultiChannelGrabber::applyParamsToChannelParams(QStringList keyList ) + { + ito::RetVal retVal(ito::retOk); + QString currentChannel = m_params["defaultChannel"].getVal(); + if (!keyList.isEmpty()) + { + if (m_channels.contains(currentChannel)) + { + QString tmp; + foreach(tmp, keyList) + { + if (m_channels[currentChannel].m_channelParam.contains(tmp)) + { + if (m_params.contains(tmp)) + { + m_channels[currentChannel].m_channelParam[tmp] = m_params[tmp]; + if (tmp == "roi") + { + m_channels[currentChannel].m_channelParam["sizex"] = m_params["sizex"]; + m_channels[currentChannel].m_channelParam["sizey"] = m_params["sizey"]; + } + } + else + { + retVal = ito::RetVal(ito::retError, 0, tr("unknown parameter %1 in m_params").arg(tmp).toLatin1().data()); + } + } + } + } + + else + { + retVal = ito::RetVal(ito::retError, 0, tr("unknown channel %1").arg(currentChannel).toLatin1().data()); + } + } + else + { + QMapIterator it(m_channels[m_params["defaultChannel"].getVal()].m_channelParam); + while (it.hasNext()) + { + it.next(); + const_cast(it.value()) = m_params[it.key()]; + + } + } + return retVal; + } + + ////---------------------------------------------------------------------------------------------------------------------------------- + ////! updates sizex and sizey + ///*! + //Call this function to update sizex and sizey. If the roi is changed via setParam this function will be call automatically. + //Do not forget to apply the changes to the channel parameters by calling applyParamsToChannelParams after calling this function. + + //\param [in] keyList indicates which params are copied. If the List is empty all Parameters of the current channel are updated. + //\return retOk if everything was ok, else retError + //*/ + void AddInMultiChannelGrabber::updateSizeXY() + { + const int* roi = m_params["roi"].getVal(); + int height = roi[3]; + int width = roi[2]; + m_params["sizex"].setVal(width); + m_params["sizey"].setVal(height); + } } //end namespace ito diff --git a/common/sources/addInInterface.cpp b/common/sources/addInInterface.cpp index 77624938d..fbf43c0c9 100644 --- a/common/sources/addInInterface.cpp +++ b/common/sources/addInInterface.cpp @@ -34,6 +34,7 @@ #include #include #include +#include "addInGrabber.h" #include "abstractAddInDockWidget.h" @@ -425,12 +426,12 @@ namespace ito moveToThread(d->m_pThread); d->m_pThread->start(); - /*set new seed for random generator of OpenCV. - This is required to have real random values for any randn or randu command. - The seed must be set in every thread. This is for the main thread. - */ - cv::theRNG().state = (uint64)cv::getCPUTickCount(); - /*seed is set*/ + /*set new seed for random generator of OpenCV. + This is required to have real random values for any randn or randu command. + The seed must be set in every thread. This is for the main thread. + */ + cv::theRNG().state = (uint64)cv::getCPUTickCount(); + /*seed is set*/ return retOk; } @@ -848,12 +849,20 @@ namespace ito qDebug("begin: startDeviceAndRegisterListener"); ItomSharedSemaphoreLocker locker(waitCond); ito::RetVal retValue(ito::retOk); + QString defaultChannel; + bool isMultiChannel = false; + isMultiChannel = this->inherits("ito::AddInMultiChannelGrabber"); + + if (isMultiChannel) + { + defaultChannel = m_params["defaultChannel"].getVal(); + } if (obj->metaObject()->indexOfSlot(QMetaObject::normalizedSignature("setSource(QSharedPointer,ItomSharedSemaphore*)")) == -1) { retValue += ito::RetVal(ito::retError, 2002, tr("listener does not have a slot ").toLatin1().data()); } - else if (m_autoGrabbingListeners.contains(obj)) + else if ((!isMultiChannel && m_autoGrabbingListeners.contains("",obj))||(isMultiChannel && m_autoGrabbingListeners.contains(defaultChannel, obj))) { retValue += ito::RetVal(ito::retWarning, 1011, tr("this object already has been registered as listener").toLatin1().data()); } @@ -861,20 +870,26 @@ namespace ito { retValue += startDevice(NULL); - if (!retValue.containsError()) - { - if (m_autoGrabbingEnabled == true && m_autoGrabbingListeners.size() >= 0 && m_timerID == 0) - { - m_timerID = startTimer(m_timerIntervalMS); - - if (m_timerID == 0) - { - retValue += ito::RetVal(ito::retError, 2001, tr("timer could not be set").toLatin1().data()); - } - } + if (!retValue.containsError()) + { + if (m_autoGrabbingEnabled == true && m_autoGrabbingListeners.size() >= 0 && m_timerID == 0) + { + m_timerID = startTimer(m_timerIntervalMS); - m_autoGrabbingListeners.insert(obj); - } + if (m_timerID == 0) + { + retValue += ito::RetVal(ito::retError, 2001, tr("timer could not be set").toLatin1().data()); + } + } + if (!isMultiChannel) + { + m_autoGrabbingListeners.insert("",obj); + } + else + { + m_autoGrabbingListeners.insert(defaultChannel, obj); + } + } } if (waitCond) @@ -882,51 +897,66 @@ namespace ito waitCond->returnValue = retValue; waitCond->release(); } - else if (retValue.containsError()) - { - std::cout << "Error binding / starting camera: " << retValue.errorMessage() << "\n" << std::endl; - } + else if (retValue.containsError()) + { + std::cout << "Error binding / starting camera: " << retValue.errorMessage() << "\n" << std::endl; + } qDebug("end: startDeviceAndRegisterListener"); return retValue; } //---------------------------------------------------------------------------------------------------------------------------------- - ito::RetVal AddInDataIO::stopDeviceAndUnregisterListener(QObject* obj, ItomSharedSemaphore *waitCond) - { - qDebug("start: stopDeviceAndUnregisterListener"); - ItomSharedSemaphoreLocker locker(waitCond); - ito::RetVal retValue(ito::retOk); + ito::RetVal AddInDataIO::stopDeviceAndUnregisterListener(QObject* obj, ItomSharedSemaphore *waitCond) + { + qDebug("start: stopDeviceAndUnregisterListener"); + ItomSharedSemaphoreLocker locker(waitCond); + ito::RetVal retValue(ito::retOk); - if (!m_autoGrabbingListeners.remove(obj)) - { - retValue += ito::RetVal(ito::retWarning, 1012, tr("the object could not been removed from the listener list").toLatin1().data()); - } - else - { - qDebug("live image has been removed from listener list"); + if (obj) + { + bool found = false; + QMultiMap::iterator i = m_autoGrabbingListeners.begin(); + while (i != m_autoGrabbingListeners.end()) + { + if (i.value() == obj) + { + found = true; + m_autoGrabbingListeners.remove(i.key(), i.value()); + break; + } - if (m_autoGrabbingListeners.size() <= 0) - { - if (m_timerID) //stop timer if no other listeners are registered - { - killTimer(m_timerID); - m_timerID = 0; - } - } + } + if (!found) + { + retValue += ito::RetVal(ito::retWarning, 1012, tr("the object could not been found in m_autoGrabbingListeners").toLatin1().data()); + } + } + else + { + qDebug("live image has been removed from listener list"); - retValue += stopDevice(NULL); - } + if (m_autoGrabbingListeners.size() <= 0) + { + if (m_timerID) //stop timer if no other listeners are registered + { + killTimer(m_timerID); + m_timerID = 0; + } + } + + retValue += stopDevice(NULL); + } if (waitCond) { waitCond->returnValue = retValue; waitCond->release(); } - else if (retValue.containsError()) - { - std::cout << "Error unbinding / stopping camera: " << retValue.errorMessage() << "\n" << std::endl; - } + else if (retValue.containsError()) + { + std::cout << "Error unbinding / stopping camera: " << retValue.errorMessage() << "\n" << std::endl; + } qDebug("end: stopDeviceAndUnregisterListener"); return retValue; From 62aae46f65bdc11877a3d23a2f89f53217d9ce4f Mon Sep 17 00:00:00 2001 From: robin92 Date: Wed, 9 Jun 2021 18:06:53 +0200 Subject: [PATCH 17/62] AbstractDObjFigure: added cameraChannel property --- plot/AbstractDObjFigure.h | 15 +++++-- plot/sources/AbstractDObjFigure.cpp | 63 ++++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/plot/AbstractDObjFigure.h b/plot/AbstractDObjFigure.h index dc87c8e49..1b7c8b710 100644 --- a/plot/AbstractDObjFigure.h +++ b/plot/AbstractDObjFigure.h @@ -54,6 +54,7 @@ class ITOMCOMMONPLOT_EXPORT AbstractDObjFigure : public AbstractFigure Q_PROPERTY(ito::AutoInterval yAxisInterval READ getYAxisInterval WRITE setYAxisInterval DESIGNABLE true USER true) Q_PROPERTY(ito::AutoInterval zAxisInterval READ getZAxisInterval WRITE setZAxisInterval DESIGNABLE true USER true) Q_PROPERTY(QString colorMap READ getColorMap WRITE setColorMap DESIGNABLE true USER true) + Q_PROPERTY(QString cameraChannel READ getDisplayedCameraChannel WRITE setDisplayedCameraChannel DESIGNABLE false USER true); Q_CLASSINFO("prop://source", "Sets the input data object for this plot.") Q_CLASSINFO("prop://displayed", "This returns the currently displayed data object [read only].") @@ -62,10 +63,12 @@ class ITOMCOMMONPLOT_EXPORT AbstractDObjFigure : public AbstractFigure Q_CLASSINFO("prop://yAxisInterval", "Sets the visible range of the displayed y-axis (in coordinates of the data object). Set it to 'auto' if range should be automatically set [default].") Q_CLASSINFO("prop://zAxisInterval", "Sets the visible range of the displayed z-axis (in coordinates of the data object). Set it to 'auto' if range should be automatically set [default].") Q_CLASSINFO("prop://colorMap", "Color map (string) that should be used to colorize a non-color data object.") + Q_CLASSINFO("prop://cameraChannel", "If a multi channel device (MultiChannelGrabber) is connected to this plot, the currently displayed channel of the device can be set. To obtain a list of the available channels see the parameter channelList of the device") Q_CLASSINFO("slot://setSource", "This slot can be implemented by any plot plugin to send a dataObject to the plot. Here it is not required and therefore not implemented.") Q_CLASSINFO("slot://setLinePlot", "This slot can be implemented by any plot plugin to force the plot to open a line plot. Here it is not required and therefore not implemented.") - +private: + QString m_currentDisplayedCameraChannel; public: AbstractDObjFigure(const QString &itomSettingsFile, AbstractFigure::WindowMode windowMode = AbstractFigure::ModeStandaloneInUi, QWidget *parent = 0); @@ -100,20 +103,26 @@ class ITOMCOMMONPLOT_EXPORT AbstractDObjFigure : public AbstractFigure //! plot-specific render function to enable more complex printing in subfigures ... virtual QPixmap renderToPixMap(const int xsize, const int ysize, const int resolution); + //!< returns the currently displayed channel of the connected grabber + QString getDisplayedCameraChannel() const; + protected: QHash > m_dataPointer; bool m_cameraConnected; RetVal removeLiveSource(); -signals: - public slots: //this source is invoked by any connected camera virtual ITOM_PYNOTACCESSIBLE void setSource(QSharedPointer source, ItomSharedSemaphore *waitCond); //this can be invoked by python to trigger a lineplot virtual ito::RetVal setLinePlot(const double x0, const double y0, const double x1, const double y1, const int destID = -1); + + virtual ito::RetVal setDisplayedCameraChannel(const QString& channel); + +signals: + void cameraChannelChanged(const QString& channel, QObject* obj); }; } // namespace ito diff --git a/plot/sources/AbstractDObjFigure.cpp b/plot/sources/AbstractDObjFigure.cpp index b310806de..5f5e4c1d2 100644 --- a/plot/sources/AbstractDObjFigure.cpp +++ b/plot/sources/AbstractDObjFigure.cpp @@ -37,7 +37,8 @@ namespace ito //---------------------------------------------------------------------------------------------------------------------------------- AbstractDObjFigure::AbstractDObjFigure(const QString &itomSettingsFile, AbstractFigure::WindowMode windowMode /*= AbstractFigure::ModeStandaloneInUi*/, QWidget *parent /*= 0*/) : AbstractFigure(itomSettingsFile, windowMode, parent), - m_cameraConnected(false) + m_cameraConnected(false), + m_currentDisplayedCameraChannel("") { addInputParam(new ito::Param("source", ito::ParamBase::DObjPtr, NULL, QObject::tr("Source data for plot").toLatin1().data())); addInputParam(new ito::Param("liveSource", ito::ParamBase::HWRef, NULL, QObject::tr("Live data source for plot").toLatin1().data())); @@ -397,5 +398,65 @@ QPixmap AbstractDObjFigure::renderToPixMap(const int xsize, const int ysize, con emptyMap.fill(Qt::green); return emptyMap; } +//------------------------------------------------------------------------------------- +ito::RetVal AbstractDObjFigure::setDisplayedCameraChannel(const QString& channel) +{ + ito::RetVal retValue(ito::retOk); + QPointer liveSource = getCamera(); + if (liveSource) + { + bool isMultiChannel = false; + isMultiChannel = liveSource->inherits("ito::AddInMultiChannelGrabber"); + if (isMultiChannel) + { + ItomSharedSemaphoreLocker locker(new ItomSharedSemaphore()); + QSharedPointer channelListParam(new ito::Param("channelList", ito::ParamBase::StringList)); + if (QMetaObject::invokeMethod(liveSource, "getParam", Q_ARG(QSharedPointer, channelListParam), Q_ARG(ItomSharedSemaphore*, locker.getSemaphore()))) + { + bool timeout = false; + + while (!locker.getSemaphore()->wait(500)) + { + retValue += ito::RetVal(ito::retError, 0, tr("timeout while getting channelList parameter").toLatin1().data()); + break; + } + if (!retValue.containsError()) + { + int len = 0; + const ito::ByteArray* channelList = channelListParam->getVal(len); + bool found = false; + for (int i = 0; i < len; i++) + { + if (QString(channelList[i].data()).compare(channel) == 0) + { + found = true; + m_currentDisplayedCameraChannel = channel; + emit cameraChannelChanged(channel, this); + break; + } + } + if (!found) + { + retValue += ito::RetVal(ito::retError, 0, tr("the connected camera does not contain a channel called %1.").arg(channel).toLatin1().data()); + } + } + } + } + else + { + retValue +=ito::RetVal(ito::retWarning, 0, tr("could not set a camera channel, since the connected camera is not of type \"AddInMultiChannelGrabber\".").toLatin1().data()); + m_currentDisplayedCameraChannel = ""; + } + + + } + + return retValue; +} +//------------------------------------------------------------------------------------- +QString AbstractDObjFigure::getDisplayedCameraChannel() const +{ + return m_currentDisplayedCameraChannel; +} } //end namespace ito From 12b9ac3b5c49268fdf9ba78d4e00c636c1eb081e Mon Sep 17 00:00:00 2001 From: "M. Gronle" Date: Fri, 18 Jun 2021 15:19:10 +0200 Subject: [PATCH 18/62] small updates based on recent meeting --- common/addInGrabber.h | 4 +++- common/sources/addInGrabber.cpp | 15 ++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/common/addInGrabber.h b/common/addInGrabber.h index dc43db61c..e071219af 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -46,6 +46,8 @@ namespace ito { Q_OBJECT public: + + // all items must be lowercase! enum PixelFormat { mono8 = ito::tUInt8, @@ -123,7 +125,7 @@ namespace ito public: static int pixelFormatStringToBpp(const char* val); /*!< this method returns the size of a pixel for a given pixelFormat */ - static int pixelFormatStringToEnum(const char* val, bool* ok); /*!< this method maps a string to a value of pixelFormat */ + static int pixelFormatStringToEnum(const QByteArray &val, bool* ok); /*!< this method maps a string to a value of pixelFormat */ AddInAbstractGrabber(); ~AddInAbstractGrabber(); diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index 4e5f85416..54aa77381 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -115,15 +115,16 @@ namespace ito This function maps a string to a pixel format by using QMetaType. */ - int AddInAbstractGrabber::pixelFormatStringToEnum(const char* val, bool* ok) + int AddInAbstractGrabber::pixelFormatStringToEnum(const QByteArray &val, bool* ok) { #if QT_VERSION >= 0x050500 const QMetaObject mo = staticMetaObject; #else const QMetaObject mo = StaticQtMetaObject::get(); #endif + const char* val_ = val.toLower().data(); QMetaEnum me = mo.enumerator(mo.indexOfEnumerator("PixelFormat")); - int pixelFormat = me.keyToValue(val, ok); + int pixelFormat = me.keyToValue(val_, ok); return pixelFormat; } //---------------------------------------------------------------------------------------------------------------------------------- @@ -132,7 +133,7 @@ namespace ito This event is continoulsy fired if auto grabbing is enabled. At first, the image is acquired (method acquire). Then the image is retrieved (retrieveImage) and finally the newly grabbed image is send to all registered listeners (sendImagetoListeners) */ - void AddInAbstractGrabber::timerEvent (QTimerEvent * /*event*/) + void AddInAbstractGrabber::timerEvent(QTimerEvent * /*event*/) { QCoreApplication::sendPostedEvents(this,0); ito::RetVal retValue = ito::retOk; @@ -342,12 +343,12 @@ namespace ito //---------------------------------------------------------------------------------------------------------------------------------- //! constructor - AddInMultiChannelGrabber::AddInMultiChannelGrabber() : + AddInMultiChannelGrabber::AddInMultiChannelGrabber(const QByteArray &grabberName) : AddInAbstractGrabber() { dd = new AddInMultiChannelGrabberPrivate(); - ito::Param paramVal("name", ito::ParamBase::String | ito::ParamBase::Readonly, "DummyMultiChannelGrabber", "GrabberName"); + ito::Param paramVal("name", ito::ParamBase::String | ito::ParamBase::Readonly, grabberName.data(), "GrabberName"); paramVal.setMeta(new ito::StringMeta(ito::StringMeta::String, "General"), true); m_params.insert(paramVal.getName(), paramVal); @@ -460,7 +461,7 @@ namespace ito QMutableMapIterator i(m_channels); while (i.hasNext()) { i.next(); - futureType = pixelFormatStringToEnum(i.value().m_channelParam["pixelFormat"].getVal(),&ok); + futureType = pixelFormatStringToEnum(i.value().m_channelParam["pixelFormat"].getVal(),&ok); if (ok) { int* roi = i.value().m_channelParam["roi"].getVal(); @@ -483,7 +484,7 @@ namespace ito char* channel = m_params["defaultChannel"].getVal(); if (m_channels.contains(channel)) { - futureType = pixelFormatStringToEnum(m_channels[channel].m_channelParam["pixelFormat"].getVal(), &ok); + futureType = pixelFormatStringToEnum(m_channels[channel].m_channelParam["pixelFormat"].getVal(), &ok); if (ok) { int* roi = m_channels[channel].m_channelParam["roi"].getVal(); From fd9e4a63a46afa68c31adff1adfe48fbd47345da Mon Sep 17 00:00:00 2001 From: robin92 Date: Mon, 21 Jun 2021 17:55:31 +0200 Subject: [PATCH 19/62] created file addInMultiChannelGrabber.cpp and addInMultiChannelGrabber.h. Started the implementation of initializeDefaultConfiguration. The QMapm_paramChannelAvailabilityMap has been introduced. This map gives an overview which parameters are available for which channels. Todo: find a better name for the parameter. --- Qitom/CMakeLists.txt | 1 + Qitom/widgets/figureWidget.cpp | 2 +- common/addInGrabber.h | 55 -- common/addInMultiChannelGrabber.h | 104 ++++ common/sources/addInGrabber.cpp | 504 +---------------- common/sources/addInMultiChannelGrabber.cpp | 592 ++++++++++++++++++++ commonQt/CMakeLists.txt | 2 + 7 files changed, 701 insertions(+), 559 deletions(-) create mode 100644 common/addInMultiChannelGrabber.h create mode 100644 common/sources/addInMultiChannelGrabber.cpp diff --git a/Qitom/CMakeLists.txt b/Qitom/CMakeLists.txt index 0ea7bbed8..4462fd0c1 100644 --- a/Qitom/CMakeLists.txt +++ b/Qitom/CMakeLists.txt @@ -232,6 +232,7 @@ link_directories( set(qitom_HEADERS_NOMOC ${CMAKE_CURRENT_SOURCE_DIR}/benchmarks.h ${CMAKE_CURRENT_SOURCE_DIR}/../common/addInGrabber.h + ${CMAKE_CURRENT_SOURCE_DIR}/../common/sources/addInMultiChannelGrabber.h ${CMAKE_CURRENT_SOURCE_DIR}/../common/addInInterface.h ${CMAKE_CURRENT_SOURCE_DIR}/../common/helperCommon.h ${CMAKE_CURRENT_SOURCE_DIR}/../common/sharedFunctionsQt.h diff --git a/Qitom/widgets/figureWidget.cpp b/Qitom/widgets/figureWidget.cpp index e61db6185..5dfe1513f 100644 --- a/Qitom/widgets/figureWidget.cpp +++ b/Qitom/widgets/figureWidget.cpp @@ -29,7 +29,7 @@ #include "../helper/guiHelper.h" #include "plot/AbstractDObjFigure.h" #include "plot/AbstractDObjPCLFigure.h" -#include "../common/addInGrabber.h" +#include "../common/addInMultiChannelGrabber.h" #include diff --git a/common/addInGrabber.h b/common/addInGrabber.h index e071219af..3324d72f7 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -40,7 +40,6 @@ namespace ito { class AddInAbstractGrabberPrivate; class AddInGrabberPrivate; - class AddInMultiChannelGrabberPrivate; class ITOMCOMMONQT_EXPORT AddInAbstractGrabber : public ito::AddInDataIO { @@ -160,61 +159,7 @@ namespace ito }; - class ITOMCOMMONQT_EXPORT AddInMultiChannelGrabber : public AddInAbstractGrabber - { - Q_OBJECT - private: - AddInMultiChannelGrabberPrivate *dd; - protected: - - struct ChannelContainer - { - ito::DataObject data; - QMap m_channelParam; - ChannelContainer() {}; - ChannelContainer(ito::Param roi, ito::Param pixelFormat, ito::Param sizex, ito::Param sizey) - { - m_channelParam.insert("pixelFormat",pixelFormat); - m_channelParam.insert("roi", roi); - m_channelParam.insert("sizex", sizex); - m_channelParam.insert("sizey", sizey); - - } - }; - QMap m_channels; /*!< Map for recently grabbed images of various channels*/ - virtual ito::RetVal checkData(ito::DataObject *externalDataObject = NULL); - virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ - ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ - void addChannel(QString name); - virtual ito::RetVal synchronizeParamswithChannelParams(QString previousChannel);/*!< synchronizes m_params with the params of default channel container */ - virtual ito::RetVal applyParamsToChannelParams(QStringList keyList = QStringList()); - - ////! Specific function to set the parameters in the respective plugin class - ///*! - //This function is a specific implementation of setParam. Overload this function to process parameters individually in the plugin class. This function is called by setParam after the parameter has been parsed and checked . - - //\param [in] val parameter to be processed - //\param [in] it ParamMapIterator iterator to the parameter in m_params - //\param [in] suffix possible suffix of the parameter - //\param [in] key of the parameter - //\param [in] index of the parameter - //\param [in] hasIndex is set to true if parameter has an index - //\param [in] set ok to true if parameter was processed - //\param [in] add key of changed channel specific parameters to pendingUpdate. - //\return retOk if everything was ok, else retError - //*/ - virtual ito::RetVal setParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok, QStringList &pendingUpdate) = 0; - virtual ito::RetVal getParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok) = 0; - void updateSizeXY(); /*!< updates sizex und sizey*/ - public: - AddInMultiChannelGrabber(); - ~AddInMultiChannelGrabber(); - public slots: - ito::RetVal setParam(QSharedPointer val, ItomSharedSemaphore *waitCond = NULL) final; - ito::RetVal getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) final; - ito::RetVal changeChannelForListerners(const QString& newChannel, QObject* obj); - }; diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h new file mode 100644 index 000000000..648276937 --- /dev/null +++ b/common/addInMultiChannelGrabber.h @@ -0,0 +1,104 @@ +/* ******************************************************************** + itom software + URL: http://www.uni-stuttgart.de/ito + Copyright (C) 2020, Institut fuer Technische Optik (ITO), + Universitaet Stuttgart, Germany + + This file is part of itom and its software development toolkit (SDK). + + itom is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public Licence as published by + the Free Software Foundation; either version 2 of the Licence, or (at + your option) any later version. + + In addition, as a special exception, the Institut fuer Technische + Optik (ITO) gives you certain additional rights. + These rights are described in the ITO LGPL Exception version 1.0, + which can be found in the file LGPL_EXCEPTION.txt in this package. + + itom is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library + General Public Licence for more details. + + You should have received a copy of the GNU Library General Public License + along with itom. If not, see . +*********************************************************************** */ + +#ifndef ADDINMULTICHANNELGRABBER_H +#define ADDINMULTICHANNELGRABBER_H + +#include "addInInterface.h" +#include "addInGrabber.h" + +#include "../DataObject/dataobj.h" +#include "sharedStructuresQt.h" +#include "sharedStructures.h" + +#if !defined(Q_MOC_RUN) || defined(ITOMCOMMONQT_MOC) //only moc this file in itomCommonQtLib but not in other libraries or executables linking against this itomCommonQtLib + +namespace ito +{ + class AddInMultiChannelGrabberPrivate; + + class ITOMCOMMONQT_EXPORT AddInMultiChannelGrabber : public AddInAbstractGrabber + { + Q_OBJECT + private: + AddInMultiChannelGrabberPrivate *dd; + bool m_defaultConfigReady; + QMap m_paramChannelAvailabilityMap; + protected: + + struct ChannelContainer + { + ito::DataObject data; + QMap m_channelParam; + ChannelContainer() {}; + ChannelContainer(ito::Param roi, ito::Param pixelFormat, ito::Param sizex, ito::Param sizey) + { + m_channelParam.insert("pixelFormat", pixelFormat); + m_channelParam.insert("roi", roi); + m_channelParam.insert("sizex", sizex); + m_channelParam.insert("sizey", sizey); + + } + }; + QMap m_channels; /*!< Map for recently grabbed images of various channels*/ + virtual ito::RetVal checkData(ito::DataObject *externalDataObject = NULL); + virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ + ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ + void addChannel(QString name); + virtual ito::RetVal synchronizeParamswithChannelParams(QString previousChannel);/*!< synchronizes m_params with the params of default channel container */ + virtual ito::RetVal applyParamsToChannelParams(QStringList keyList = QStringList()); + void initializeDefaultConfiguration(QMap channelContainerMap);/*!< sets the channel parameters.*/ + + ////! Specific function to set the parameters in the respective plugin class + ///*! + //This function is a specific implementation of setParam. Overload this function to process parameters individually in the plugin class. This function is called by setParam after the parameter has been parsed and checked . + + //\param [in] val parameter to be processed + //\param [in] it ParamMapIterator iterator to the parameter in m_params + //\param [in] suffix possible suffix of the parameter + //\param [in] key of the parameter + //\param [in] index of the parameter + //\param [in] hasIndex is set to true if parameter has an index + //\param [in] set ok to true if parameter was processed + //\param [in] add key of changed channel specific parameters to pendingUpdate. + //\return retOk if everything was ok, else retError + //*/ + virtual ito::RetVal setParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok, QStringList &pendingUpdate) = 0; + virtual ito::RetVal getParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok) = 0; + void updateSizeXY(); /*!< updates sizex und sizey*/ + + public: + AddInMultiChannelGrabber(const QByteArray &grabberName); + ~AddInMultiChannelGrabber(); + public slots: + ito::RetVal setParam(QSharedPointer val, ItomSharedSemaphore *waitCond = NULL) final; + ito::RetVal getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) final; + ito::RetVal changeChannelForListerners(const QString& newChannel, QObject* obj); + }; +} +#endif +#endif \ No newline at end of file diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index 54aa77381..e41537d5a 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -341,508 +341,6 @@ namespace ito return retValue; } - //---------------------------------------------------------------------------------------------------------------------------------- - //! constructor - AddInMultiChannelGrabber::AddInMultiChannelGrabber(const QByteArray &grabberName) : - AddInAbstractGrabber() - { - dd = new AddInMultiChannelGrabberPrivate(); - - ito::Param paramVal("name", ito::ParamBase::String | ito::ParamBase::Readonly, grabberName.data(), "GrabberName"); - paramVal.setMeta(new ito::StringMeta(ito::StringMeta::String, "General"), true); - m_params.insert(paramVal.getName(), paramVal); - - int roi[] = { 0, 0, 2048, 2048 }; - paramVal = ito::Param("roi", ito::ParamBase::IntArray, 4, roi, tr("ROI (x,y,width,height) [this replaces the values x0,x1,y0,y1]").toLatin1().data()); - ito::RectMeta *rm = new ito::RectMeta(ito::RangeMeta(roi[0], roi[0] + roi[2] - 1), ito::RangeMeta(roi[1], roi[1] + roi[3] - 1), "ImageFormatControl"); - paramVal.setMeta(rm, true); - m_params.insert(paramVal.getName(), paramVal); - - paramVal = ito::Param("sizex", ito::ParamBase::Int | ito::ParamBase::Readonly, 4, 4096, 4096, tr("size in x (cols) [px]").toLatin1().data()); - paramVal.getMetaT()->setCategory("ImageFormatControl"); - m_params.insert(paramVal.getName(), paramVal); - - paramVal = ito::Param("sizey", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 4096, 4096, tr("size in y (rows) [px]").toLatin1().data()); - paramVal.getMetaT()->setCategory("ImageFormatControl"); - m_params.insert(paramVal.getName(), paramVal); - - ito::StringMeta *m = new ito::StringMeta(ito::StringMeta::String, "mono8"); - m->addItem("mono10"); - m->addItem("mono12"); - m->addItem("mono16"); - paramVal = ito::Param("pixelFormat", ito::ParamBase::String, "mono8", tr("bitdepth of images: mono8, mono10, mono12, mono16, rgb32").toLatin1().data()); - paramVal.setMeta(m, true); - m_params.insert(paramVal.getName(), paramVal); - - paramVal = ito::Param("defaultChannel", ito::ParamBase::String, "", tr("indicates the current default channel").toLatin1().data()); - m_params.insert(paramVal.getName(), paramVal); - - paramVal = ito::Param("channelList", ito::ParamBase::StringList | ito::ParamBase::Readonly, {}, tr("names of the channels provided by the plugin").toLatin1().data()); - m_params.insert(paramVal.getName(), paramVal); - } - - //---------------------------------------------------------------------------------------------------------------------------------- - //! destructor - AddInMultiChannelGrabber::~AddInMultiChannelGrabber() - { - DELETE_AND_SET_NULL(dd); - } - ////---------------------------------------------------------------------------------------------------------------------------------- - ////! sends m_image to all registered listeners. - ///*! - //This method is continuously called from timerEvent. Also call this method from your getVal-Method (usually with 0-timeout) - - //\param [in] waitMS indicates the time (in ms) that should be waiting until every registered live image source node received m_image. 0: no wait, -1: infinit waiting time, else time in milliseconds - //\return retOk if everything was ok, retWarning if live image could not be invoked - //*/ - ito::RetVal AddInMultiChannelGrabber::sendDataToListeners(int waitMS) - { - ito::RetVal retValue = ito::retOk; - int size = m_autoGrabbingListeners.size(); - if (waitMS == 0) - { - QMultiMap::iterator it = m_autoGrabbingListeners.begin(); - while(it != m_autoGrabbingListeners.end()) - { - if (!QMetaObject::invokeMethod(it.value(), "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[it.key().toLatin1().data()].data))), Q_ARG(ItomSharedSemaphore*, NULL))) - { - retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); - } - it++; - } - } - else if (m_autoGrabbingListeners.size() > 0) - { - ItomSharedSemaphore** waitConds = new ItomSharedSemaphore*[size]; - int i = 0; - QMultiMap::iterator it = m_autoGrabbingListeners.begin(); - while (it != m_autoGrabbingListeners.end()) - { - waitConds[i] = new ItomSharedSemaphore(); - // \todo On Linux a crash occurs here when closing the liveImage ... maybe the same reason why we get an error message on windows? - if (it.value()) - { - if (!QMetaObject::invokeMethod(it.value(), "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[it.key().toLatin1().data()].data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) - { - retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); - } - } - it++; - i++; - } - - for (i = 0; i < size; i++) - { - if (!waitConds[i]->wait(waitMS)) - { - qDebug() << "timeout in number: " << i << "number of items: " << size; - } - waitConds[i]->deleteSemaphore(); - waitConds[i] = NULL; - } - - delete[] waitConds; - waitConds = NULL; - } - - - return retValue; - } - - ito::RetVal ito::AddInMultiChannelGrabber::checkData(ito::DataObject *externalDataObject) - { - ito::RetVal retVal(ito::retOk); - bool ok; - unsigned int futureType; - PixelFormat format; - if (!externalDataObject) - { - - QMutableMapIterator i(m_channels); - while (i.hasNext()) { - i.next(); - futureType = pixelFormatStringToEnum(i.value().m_channelParam["pixelFormat"].getVal(),&ok); - if (ok) - { - int* roi = i.value().m_channelParam["roi"].getVal(); - int height = roi[3]; - int width = roi[2]; - if (i.value().data.getDims() < 2 || i.value().data.getSize(0) != height || i.value().data.getSize(1) != width || i.value().data.getType() != futureType) - { - i.value().data = ito::DataObject(height, width, futureType); - } - } - else - { - retVal += ito::RetVal(ito::retError, 0, tr("invalid pixel format").toLatin1().data()); - } - - } - } - else - { - char* channel = m_params["defaultChannel"].getVal(); - if (m_channels.contains(channel)) - { - futureType = pixelFormatStringToEnum(m_channels[channel].m_channelParam["pixelFormat"].getVal(), &ok); - if (ok) - { - int* roi = m_channels[channel].m_channelParam["roi"].getVal(); - int width = roi[2]; - int height = roi[3]; - if (externalDataObject->getDims() == 0) - { - *externalDataObject = ito::DataObject(height, width, futureType); - } - else if (externalDataObject->calcNumMats() != 1) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object has more or less than 1 plane. It must be of right size and type or an uninitilized image.").toLatin1().data()); - } - else if (externalDataObject->getSize(externalDataObject->getDims() - 2) != height || externalDataObject->getSize(externalDataObject->getDims() - 1) != width || externalDataObject->getType() != futureType) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); - } - } - else - { - retVal += ito::RetVal(ito::retError, 0, tr("invalid pixel format").toLatin1().data()); - } - } - } - return retVal; - } - - void AddInMultiChannelGrabber::addChannel(QString name) - { - ChannelContainer a(m_params["roi"], m_params["pixelFormat"], m_params["sizex"], m_params["sizey"]); - m_channels[name] = a; - const ByteArray* channelList = m_params["channelList"].getVal(); - int len = 0; - m_params["channelList"].getVal(len); - - QVector qVectorList(len, *channelList); - qVectorList.append(ByteArray(name.toLatin1().data())); - m_params["channelList"].setVal(qVectorList.data(),qVectorList.length()); - - } - - ito::RetVal AddInMultiChannelGrabber::adaptDefaultChannelParams() - { - ito::RetVal retVal(ito::retOk); - char* channel = m_params["defaultChannel"].getVal(); - return retVal; - - - } - - ito::RetVal AddInMultiChannelGrabber::getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) - { - ItomSharedSemaphoreLocker locker(waitCond); - ito::RetVal retValue; - QString key; - bool hasIndex = false; - int index; - QString suffix; - ParamMapIterator it; - bool ok = false; - - //parse the given parameter-name (if you support indexed or suffix-based parameters) - retValue += apiParseParamName(val->getName(), key, hasIndex, index, suffix); - - if (retValue == ito::retOk) - { - //gets the parameter key from m_params map (read-only is allowed, since we only want to get the value). - if (!suffix.isEmpty() && m_channels.contains(suffix)) - { - retValue += apiGetParamFromMapByKey(m_channels[suffix].m_channelParam, key, it, false); - if (retValue.containsError()) - { - retValue = ito::RetVal(ito::retError, 0, tr("an error occured while searching parameter \"%0\" for channel \"%1\". Maybe this is a channel specific parameter.").arg(key).arg(suffix).toLatin1().data()); - } - } - else - { - retValue += apiGetParamFromMapByKey(m_params, key, it, false); - } - } - if (!retValue.containsError()) - { - retValue += getParameter(val, it, suffix, key, index, hasIndex, ok); - } - if (!retValue.containsError() && !ok)//the parameter was not processed by the plugin, so it is done here - { - *val = it.value(); - } - - if (waitCond) - { - waitCond->returnValue = retValue; - waitCond->release(); - } - - return retValue; - } - - ito::RetVal AddInMultiChannelGrabber::changeChannelForListerners(const QString& newChannel, QObject* obj) - { - ito::RetVal retValue(ito::retOk); - bool found = false; - if (obj) - { - - QMultiMap::iterator i = m_autoGrabbingListeners.begin(); - while (i != m_autoGrabbingListeners.end()) - { - if (i.value() == obj) - { - found = true; - m_autoGrabbingListeners.remove(i.key(), i.value()); - m_autoGrabbingListeners.insert(newChannel, obj); - break; - } - - } - if (!found) - { - retValue += ito::RetVal(ito::retError, 0, tr("Could not find plot in m_autoGrabbingListeners").toLatin1().data()); - } - } - else - { - retValue += ito::RetVal(ito::retError, 0, "QObject not callable."); - } - return retValue; - } - - ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer val, ItomSharedSemaphore *waitCond/* = NULL*/) - { - ItomSharedSemaphoreLocker locker(waitCond); - ito::RetVal retValue; - bool hasIndex, ok; - int index; - QString suffix, key; - ParamMapIterator it; - retValue += ito::parseParamName(val->getName(), key, hasIndex, index, suffix); - int cntStartedDevices = grabberStartedCount(); - if (!retValue.containsError()) - { - if (!suffix.isEmpty() && m_channels.contains(suffix)) - { - retValue += apiGetParamFromMapByKey(m_channels[suffix].m_channelParam, key, it, true); - if (retValue.containsError()) - { - retValue = ito::RetVal(ito::retError, 0, tr("an error occured while searching parameter \"%0\" for channel \"%1\".Maybe this is a non channel specific parameter.").arg(key).arg(suffix).toLatin1().data()); - } - } - else - { - if (suffix.isEmpty()) - { - retValue += apiGetParamFromMapByKey(m_params, key, it, true); - } - else - { - retValue += ito::RetVal(ito::retError, 0, tr("unknown channel: %1").arg(suffix).toLatin1().data()); - } - } - } - if (!retValue.containsError()) - { - retValue += apiValidateParam(*it, *val, false, true); - } - if (!retValue.containsError()) - { - QStringList list; - retValue += setParameter(val, it, suffix, key, index, hasIndex, ok, list); - if (!retValue.containsError() && !ok) - { - if (key == "defaultChannel") - { - QString previousChannel = m_params["defaultChannel"].getVal(); - - if (m_channels.find(val->getVal()) != m_channels.end()) - { - retValue += it->copyValueFrom(&(*val)); - retValue += synchronizeParamswithChannelParams(previousChannel); - } - else - { - retValue += ito::RetVal(ito::retError, 0, tr("unknown channel: %1").arg(val->getVal()).toLatin1().data()); - } - } - else if (key == "roi") - { - if (!hasIndex) - { - retValue += it->copyValueFrom(&(*val)); - list << "roi"; - } - else - { - it->getVal()[index] = val->getVal(); - list << "roi"; - } - - } - else - { - retValue += it->copyValueFrom(&(*val)); // it seems that the plugin does not process the param therefore it is copied here - if (m_channels[m_params["defaultChannel"].getVal()].m_channelParam.contains(key)) - { - list << key; - } - } - } - if (list.contains("roi")) //if key is roi sizex and sizey must be adapted - { - updateSizeXY(); - } - if (!retValue.containsError()) - { - applyParamsToChannelParams(list); - checkData(); - } - } - if (!retValue.containsError()) - { - emit parametersChanged(m_params); - } - if (cntStartedDevices < grabberStartedCount()) - { - if (cntStartedDevices != 0) - { - retValue += startDevice(NULL); - setGrabberStarted(cntStartedDevices); - } - } - if (waitCond) - { - waitCond->returnValue = retValue; - waitCond->release(); - } - return retValue; - } - ////---------------------------------------------------------------------------------------------------------------------------------- - ////! synchronizes m_params with the params of default channel container - ///*! - //This method synchronizes the parameters from the current selected channel container with m_params. Call this function after changing the default parameter.Parameters which are not available for the current default channel are set to readonly - - //\param [in] previousChannel indicates the name of the previous default channel. This is needed to check whether a parameter is no longer contained in the current channel, which was contained in the previous one. - //\return retOk if everything was ok, else retError - //*/ - ito::RetVal AddInMultiChannelGrabber::synchronizeParamswithChannelParams(QString previousChannel) - { - ito::RetVal retVal(ito::retOk); - unsigned int flag = 0; - QMapIterator itChannelParams(m_channels[m_params["defaultChannel"].getVal()].m_channelParam); - bool channelDiffer = false; - //Check if the previous channel had the same parameters - QStringList defaulKeyList = m_channels[m_params["defaultChannel"].getVal()].m_channelParam.keys(); - qSort(defaulKeyList); - QStringList previousKeyList = m_channels[previousChannel].m_channelParam.keys(); - qSort(previousKeyList); - if (defaulKeyList != previousKeyList) - { - QStringList::ConstIterator itPreviousChannel; - for (itPreviousChannel = previousKeyList.constBegin(); itPreviousChannel != previousKeyList.constEnd(); ++itPreviousChannel) - { - if (!defaulKeyList.contains(*itPreviousChannel))//if param from previous channel is not included in current channel, set param in m_params to readonly. - { - flag = m_params[*itPreviousChannel].getFlags(); - flag |= ito::ParamBase::Readonly; - m_params[*itPreviousChannel].setFlags(flag); - //if a param is in the current channel include which was not in the previous one, the readonly flag will be removed when copying the param from the channel container to m_params - } - } - } - while (itChannelParams.hasNext()) - { - itChannelParams.next(); - if (m_params.contains(itChannelParams.key())) - { - m_params[itChannelParams.key()] = itChannelParams.value(); //copy param - } - else - { - retVal += ito::RetVal(ito::retError, 0, QString("channel parameter %1 not found in m_params").arg(itChannelParams.key()).toLatin1().data()); - } - - } - return retVal; - } - ////---------------------------------------------------------------------------------------------------------------------------------- - ////! copies value m_params to the channel params of the current default channel - ///*! - //This method copies params of m_params to the params of the channel container. This function is usally called after setParam to apply the changed entries of m_params to the corresponding channel container. - //If a parameter is not found in the channel container nothing happens. This function updates also sizex and sizey if roi or nothing is passed as key. - - //\param [in] keyList indicates which params are copied. If the List is empty all Parameters of the current channel are updated. - //\return retOk if everything was ok, else retError - //*/ - ito::RetVal AddInMultiChannelGrabber::applyParamsToChannelParams(QStringList keyList ) - { - ito::RetVal retVal(ito::retOk); - QString currentChannel = m_params["defaultChannel"].getVal(); - if (!keyList.isEmpty()) - { - if (m_channels.contains(currentChannel)) - { - QString tmp; - foreach(tmp, keyList) - { - if (m_channels[currentChannel].m_channelParam.contains(tmp)) - { - if (m_params.contains(tmp)) - { - m_channels[currentChannel].m_channelParam[tmp] = m_params[tmp]; - if (tmp == "roi") - { - m_channels[currentChannel].m_channelParam["sizex"] = m_params["sizex"]; - m_channels[currentChannel].m_channelParam["sizey"] = m_params["sizey"]; - } - } - else - { - retVal = ito::RetVal(ito::retError, 0, tr("unknown parameter %1 in m_params").arg(tmp).toLatin1().data()); - } - } - } - } - - else - { - retVal = ito::RetVal(ito::retError, 0, tr("unknown channel %1").arg(currentChannel).toLatin1().data()); - } - } - else - { - QMapIterator it(m_channels[m_params["defaultChannel"].getVal()].m_channelParam); - while (it.hasNext()) - { - it.next(); - const_cast(it.value()) = m_params[it.key()]; - - } - } - return retVal; - } - - ////---------------------------------------------------------------------------------------------------------------------------------- - ////! updates sizex and sizey - ///*! - //Call this function to update sizex and sizey. If the roi is changed via setParam this function will be call automatically. - //Do not forget to apply the changes to the channel parameters by calling applyParamsToChannelParams after calling this function. - - //\param [in] keyList indicates which params are copied. If the List is empty all Parameters of the current channel are updated. - //\return retOk if everything was ok, else retError - //*/ - void AddInMultiChannelGrabber::updateSizeXY() - { - const int* roi = m_params["roi"].getVal(); - int height = roi[3]; - int width = roi[2]; - m_params["sizex"].setVal(width); - m_params["sizey"].setVal(height); - } + } //end namespace ito diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp new file mode 100644 index 000000000..3a6b1875c --- /dev/null +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -0,0 +1,592 @@ +/* ******************************************************************** + itom software + URL: http://www.uni-stuttgart.de/ito + Copyright (C) 2020, Institut fuer Technische Optik (ITO), + Universitaet Stuttgart, Germany + + This file is part of itom and its software development toolkit (SDK). + + itom is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public Licence as published by + the Free Software Foundation; either version 2 of the Licence, or (at + your option) any later version. + + In addition, as a special exception, the Institut fuer Technische + Optik (ITO) gives you certain additional rights. + These rights are described in the ITO LGPL Exception version 1.0, + which can be found in the file LGPL_EXCEPTION.txt in this package. + + itom is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library + General Public Licence for more details. + + You should have received a copy of the GNU Library General Public License + along with itom. If not, see . +*********************************************************************** */ + +#include "AddInMultiChannelGrabber.h" + +#include +#include +#include +#include +#include +#include "common/helperCommon.h" + + +namespace ito +{ + class AddInMultiChannelGrabberPrivate + { + }; + //---------------------------------------------------------------------------------------------------------------------------------- + //! constructor + AddInMultiChannelGrabber::AddInMultiChannelGrabber(const QByteArray &grabberName) : + AddInAbstractGrabber(), + m_defaultConfigReady(false) + { + dd = new AddInMultiChannelGrabberPrivate(); + + ito::Param paramVal("name", ito::ParamBase::String | ito::ParamBase::Readonly, grabberName.data(), "GrabberName"); + paramVal.setMeta(new ito::StringMeta(ito::StringMeta::String, "General"), true); + m_params.insert(paramVal.getName(), paramVal); + + paramVal = ito::Param("defaultChannel", ito::ParamBase::String, "", tr("indicates the current default channel").toLatin1().data()); + m_params.insert(paramVal.getName(), paramVal); + + paramVal = ito::Param("channelList", ito::ParamBase::StringList | ito::ParamBase::Readonly, {}, tr("names of the channels provided by the plugin").toLatin1().data()); + m_params.insert(paramVal.getName(), paramVal); + + + int roi[] = { 0, 0, 2048, 2048 }; + paramVal = ito::Param("roi", ito::ParamBase::IntArray, 4, roi, tr("ROI (x,y,width,height) [this replaces the values x0,x1,y0,y1]").toLatin1().data()); + ito::RectMeta *rm = new ito::RectMeta(ito::RangeMeta(roi[0], roi[0] + roi[2] - 1), ito::RangeMeta(roi[1], roi[1] + roi[3] - 1), "ImageFormatControl"); + paramVal.setMeta(rm, true); + m_params.insert(paramVal.getName(), paramVal); + + paramVal = ito::Param("sizex", ito::ParamBase::Int | ito::ParamBase::Readonly, 4, 4096, 4096, tr("size in x (cols) [px]").toLatin1().data()); + paramVal.getMetaT()->setCategory("ImageFormatControl"); + m_params.insert(paramVal.getName(), paramVal); + + paramVal = ito::Param("sizey", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 4096, 4096, tr("size in y (rows) [px]").toLatin1().data()); + paramVal.getMetaT()->setCategory("ImageFormatControl"); + m_params.insert(paramVal.getName(), paramVal); + + ito::StringMeta *m = new ito::StringMeta(ito::StringMeta::String, "mono8"); + m->addItem("mono10"); + m->addItem("mono12"); + m->addItem("mono16"); + paramVal = ito::Param("pixelFormat", ito::ParamBase::String, "mono8", tr("bitdepth of images: mono8, mono10, mono12, mono16, rgb32").toLatin1().data()); + paramVal.setMeta(m, true); + m_params.insert(paramVal.getName(), paramVal); + + + + + } + + //---------------------------------------------------------------------------------------------------------------------------------- + //! destructor + AddInMultiChannelGrabber::~AddInMultiChannelGrabber() + { + DELETE_AND_SET_NULL(dd); + } + + //---------------------------------------------------------------------------------------------------------------------------------- + void AddInMultiChannelGrabber::initializeDefaultConfiguration(QMap channelContainerMap) + { + ito::RetVal retValue(ito::retOk); + bool channelSpecificParam = false; + if (!m_defaultConfigReady) + { + assert(channelContainerMap.size() != 0); + QMapIterator channel(channelContainerMap); + QVector channelList; + while (channel.hasNext()) + { + channel.next(); + QMapIterator channelParamIterator(channel.value().m_channelParam); + if (!m_params.contains(channelParamIterator.key())) + { + m_paramChannelAvailabilityMap.insert(channelParamIterator.key(), QStringList()); + QMapIteratortmpChannel(channelContainerMap); + while (tmpChannel.hasNext()) + { + tmpChannel.next(); + if (tmpChannel.value().m_channelParam.contains(channelParamIterator.key())) + { + m_paramChannelAvailabilityMap[channelParamIterator.key()].append(tmpChannel.key()); + } + } + } + channelList.append(channel.key().toLatin1().data()); + } + m_params["channelList"].setVal(channelList.data(), channelList.length()); + //todo standards müssen noch gesetzt werden und parameter in m_params übertragen werden + + m_defaultConfigReady = true; + + } + } + + + + ////---------------------------------------------------------------------------------------------------------------------------------- + ////! sends m_image to all registered listeners. + ///*! + //This method is continuously called from timerEvent. Also call this method from your getVal-Method (usually with 0-timeout) + + //\param [in] waitMS indicates the time (in ms) that should be waiting until every registered live image source node received m_image. 0: no wait, -1: infinit waiting time, else time in milliseconds + //\return retOk if everything was ok, retWarning if live image could not be invoked + //*/ + ito::RetVal AddInMultiChannelGrabber::sendDataToListeners(int waitMS) + { + ito::RetVal retValue = ito::retOk; + int size = m_autoGrabbingListeners.size(); + if (waitMS == 0) + { + QMultiMap::iterator it = m_autoGrabbingListeners.begin(); + while (it != m_autoGrabbingListeners.end()) + { + if (!QMetaObject::invokeMethod(it.value(), "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[it.key().toLatin1().data()].data))), Q_ARG(ItomSharedSemaphore*, NULL))) + { + retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); + } + it++; + } + } + else if (m_autoGrabbingListeners.size() > 0) + { + ItomSharedSemaphore** waitConds = new ItomSharedSemaphore*[size]; + int i = 0; + QMultiMap::iterator it = m_autoGrabbingListeners.begin(); + while (it != m_autoGrabbingListeners.end()) + { + waitConds[i] = new ItomSharedSemaphore(); + // \todo On Linux a crash occurs here when closing the liveImage ... maybe the same reason why we get an error message on windows? + if (it.value()) + { + if (!QMetaObject::invokeMethod(it.value(), "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[it.key().toLatin1().data()].data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) + { + retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); + } + } + it++; + i++; + } + + for (i = 0; i < size; i++) + { + if (!waitConds[i]->wait(waitMS)) + { + qDebug() << "timeout in number: " << i << "number of items: " << size; + } + waitConds[i]->deleteSemaphore(); + waitConds[i] = NULL; + } + + delete[] waitConds; + waitConds = NULL; + } + + + return retValue; + } + + ito::RetVal ito::AddInMultiChannelGrabber::checkData(ito::DataObject *externalDataObject) + { + ito::RetVal retVal(ito::retOk); + bool ok; + unsigned int futureType; + PixelFormat format; + if (!externalDataObject) + { + + QMutableMapIterator i(m_channels); + while (i.hasNext()) { + i.next(); + futureType = pixelFormatStringToEnum(i.value().m_channelParam["pixelFormat"].getVal(), &ok); + if (ok) + { + int* roi = i.value().m_channelParam["roi"].getVal(); + int height = roi[3]; + int width = roi[2]; + if (i.value().data.getDims() < 2 || i.value().data.getSize(0) != height || i.value().data.getSize(1) != width || i.value().data.getType() != futureType) + { + i.value().data = ito::DataObject(height, width, futureType); + } + } + else + { + retVal += ito::RetVal(ito::retError, 0, tr("invalid pixel format").toLatin1().data()); + } + + } + } + else + { + char* channel = m_params["defaultChannel"].getVal(); + if (m_channels.contains(channel)) + { + futureType = pixelFormatStringToEnum(m_channels[channel].m_channelParam["pixelFormat"].getVal(), &ok); + if (ok) + { + int* roi = m_channels[channel].m_channelParam["roi"].getVal(); + int width = roi[2]; + int height = roi[3]; + if (externalDataObject->getDims() == 0) + { + *externalDataObject = ito::DataObject(height, width, futureType); + } + else if (externalDataObject->calcNumMats() != 1) + { + return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object has more or less than 1 plane. It must be of right size and type or an uninitilized image.").toLatin1().data()); + } + else if (externalDataObject->getSize(externalDataObject->getDims() - 2) != height || externalDataObject->getSize(externalDataObject->getDims() - 1) != width || externalDataObject->getType() != futureType) + { + return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); + } + } + else + { + retVal += ito::RetVal(ito::retError, 0, tr("invalid pixel format").toLatin1().data()); + } + } + } + return retVal; + } + + void AddInMultiChannelGrabber::addChannel(QString name) + { + ChannelContainer a(m_params["roi"], m_params["pixelFormat"], m_params["sizex"], m_params["sizey"]); + m_channels[name] = a; + const ByteArray* channelList = m_params["channelList"].getVal(); + int len = 0; + m_params["channelList"].getVal(len); + + QVector qVectorList(len, *channelList); + qVectorList.append(ByteArray(name.toLatin1().data())); + m_params["channelList"].setVal(qVectorList.data(), qVectorList.length()); + + } + + ito::RetVal AddInMultiChannelGrabber::adaptDefaultChannelParams() + { + ito::RetVal retVal(ito::retOk); + char* channel = m_params["defaultChannel"].getVal(); + return retVal; + + + } + + ito::RetVal AddInMultiChannelGrabber::getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) + { + ItomSharedSemaphoreLocker locker(waitCond); + ito::RetVal retValue; + QString key; + bool hasIndex = false; + int index; + QString suffix; + ParamMapIterator it; + bool ok = false; + + //parse the given parameter-name (if you support indexed or suffix-based parameters) + retValue += apiParseParamName(val->getName(), key, hasIndex, index, suffix); + + if (retValue == ito::retOk) + { + //gets the parameter key from m_params map (read-only is allowed, since we only want to get the value). + if (!suffix.isEmpty() && m_channels.contains(suffix)) + { + retValue += apiGetParamFromMapByKey(m_channels[suffix].m_channelParam, key, it, false); + if (retValue.containsError()) + { + retValue = ito::RetVal(ito::retError, 0, tr("an error occured while searching parameter \"%0\" for channel \"%1\". Maybe this is a channel specific parameter.").arg(key).arg(suffix).toLatin1().data()); + } + } + else + { + retValue += apiGetParamFromMapByKey(m_params, key, it, false); + } + } + if (!retValue.containsError()) + { + retValue += getParameter(val, it, suffix, key, index, hasIndex, ok); + } + if (!retValue.containsError() && !ok)//the parameter was not processed by the plugin, so it is done here + { + *val = it.value(); + } + + if (waitCond) + { + waitCond->returnValue = retValue; + waitCond->release(); + } + + return retValue; + } + + ito::RetVal AddInMultiChannelGrabber::changeChannelForListerners(const QString& newChannel, QObject* obj) + { + ito::RetVal retValue(ito::retOk); + bool found = false; + if (obj) + { + + QMultiMap::iterator i = m_autoGrabbingListeners.begin(); + while (i != m_autoGrabbingListeners.end()) + { + if (i.value() == obj) + { + found = true; + m_autoGrabbingListeners.remove(i.key(), i.value()); + m_autoGrabbingListeners.insert(newChannel, obj); + break; + } + + } + if (!found) + { + retValue += ito::RetVal(ito::retError, 0, tr("Could not find plot in m_autoGrabbingListeners").toLatin1().data()); + } + } + else + { + retValue += ito::RetVal(ito::retError, 0, "QObject not callable."); + } + return retValue; + } + + ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer val, ItomSharedSemaphore *waitCond/* = NULL*/) + { + ItomSharedSemaphoreLocker locker(waitCond); + ito::RetVal retValue; + bool hasIndex, ok; + int index; + QString suffix, key; + ParamMapIterator it; + retValue += ito::parseParamName(val->getName(), key, hasIndex, index, suffix); + int cntStartedDevices = grabberStartedCount(); + if (!retValue.containsError()) + { + if (!suffix.isEmpty() && m_channels.contains(suffix)) + { + retValue += apiGetParamFromMapByKey(m_channels[suffix].m_channelParam, key, it, true); + if (retValue.containsError()) + { + retValue = ito::RetVal(ito::retError, 0, tr("an error occured while searching parameter \"%0\" for channel \"%1\".Maybe this is a non channel specific parameter.").arg(key).arg(suffix).toLatin1().data()); + } + } + else + { + if (suffix.isEmpty()) + { + retValue += apiGetParamFromMapByKey(m_params, key, it, true); + } + else + { + retValue += ito::RetVal(ito::retError, 0, tr("unknown channel: %1").arg(suffix).toLatin1().data()); + } + } + } + if (!retValue.containsError()) + { + retValue += apiValidateParam(*it, *val, false, true); + } + if (!retValue.containsError()) + { + QStringList list; + retValue += setParameter(val, it, suffix, key, index, hasIndex, ok, list); + if (!retValue.containsError() && !ok) + { + if (key == "defaultChannel") + { + QString previousChannel = m_params["defaultChannel"].getVal(); + + if (m_channels.find(val->getVal()) != m_channels.end()) + { + retValue += it->copyValueFrom(&(*val)); + retValue += synchronizeParamswithChannelParams(previousChannel); + } + else + { + retValue += ito::RetVal(ito::retError, 0, tr("unknown channel: %1").arg(val->getVal()).toLatin1().data()); + } + } + else if (key == "roi") + { + if (!hasIndex) + { + retValue += it->copyValueFrom(&(*val)); + list << "roi"; + } + else + { + it->getVal()[index] = val->getVal(); + list << "roi"; + } + + } + else + { + retValue += it->copyValueFrom(&(*val)); // it seems that the plugin does not process the param therefore it is copied here + if (m_channels[m_params["defaultChannel"].getVal()].m_channelParam.contains(key)) + { + list << key; + } + } + } + if (list.contains("roi")) //if key is roi sizex and sizey must be adapted + { + updateSizeXY(); + } + if (!retValue.containsError()) + { + applyParamsToChannelParams(list); + checkData(); + } + } + if (!retValue.containsError()) + { + emit parametersChanged(m_params); + } + if (cntStartedDevices < grabberStartedCount()) + { + if (cntStartedDevices != 0) + { + retValue += startDevice(NULL); + setGrabberStarted(cntStartedDevices); + } + } + if (waitCond) + { + waitCond->returnValue = retValue; + waitCond->release(); + } + return retValue; + } + ////---------------------------------------------------------------------------------------------------------------------------------- + ////! synchronizes m_params with the params of default channel container + ///*! + //This method synchronizes the parameters from the current selected channel container with m_params. Call this function after changing the default parameter.Parameters which are not available for the current default channel are set to readonly + + //\param [in] previousChannel indicates the name of the previous default channel. This is needed to check whether a parameter is no longer contained in the current channel, which was contained in the previous one. + //\return retOk if everything was ok, else retError + //*/ + ito::RetVal AddInMultiChannelGrabber::synchronizeParamswithChannelParams(QString previousChannel) + { + ito::RetVal retVal(ito::retOk); + unsigned int flag = 0; + QMapIterator itChannelParams(m_channels[m_params["defaultChannel"].getVal()].m_channelParam); + bool channelDiffer = false; + //Check if the previous channel had the same parameters + QStringList defaulKeyList = m_channels[m_params["defaultChannel"].getVal()].m_channelParam.keys(); + qSort(defaulKeyList); + QStringList previousKeyList = m_channels[previousChannel].m_channelParam.keys(); + qSort(previousKeyList); + if (defaulKeyList != previousKeyList) + { + QStringList::ConstIterator itPreviousChannel; + for (itPreviousChannel = previousKeyList.constBegin(); itPreviousChannel != previousKeyList.constEnd(); ++itPreviousChannel) + { + if (!defaulKeyList.contains(*itPreviousChannel))//if param from previous channel is not included in current channel, set param in m_params to readonly. + { + flag = m_params[*itPreviousChannel].getFlags(); + flag |= ito::ParamBase::Readonly; + m_params[*itPreviousChannel].setFlags(flag); + //if a param is in the current channel include which was not in the previous one, the readonly flag will be removed when copying the param from the channel container to m_params + } + } + } + while (itChannelParams.hasNext()) + { + itChannelParams.next(); + if (m_params.contains(itChannelParams.key())) + { + m_params[itChannelParams.key()] = itChannelParams.value(); //copy param + } + else + { + retVal += ito::RetVal(ito::retError, 0, QString("channel parameter %1 not found in m_params").arg(itChannelParams.key()).toLatin1().data()); + } + + } + return retVal; + } + ////---------------------------------------------------------------------------------------------------------------------------------- + ////! copies value m_params to the channel params of the current default channel + ///*! + //This method copies params of m_params to the params of the channel container. This function is usally called after setParam to apply the changed entries of m_params to the corresponding channel container. + //If a parameter is not found in the channel container nothing happens. This function updates also sizex and sizey if roi or nothing is passed as key. + + //\param [in] keyList indicates which params are copied. If the List is empty all Parameters of the current channel are updated. + //\return retOk if everything was ok, else retError + //*/ + ito::RetVal AddInMultiChannelGrabber::applyParamsToChannelParams(QStringList keyList) + { + ito::RetVal retVal(ito::retOk); + QString currentChannel = m_params["defaultChannel"].getVal(); + if (!keyList.isEmpty()) + { + if (m_channels.contains(currentChannel)) + { + QString tmp; + foreach(tmp, keyList) + { + if (m_channels[currentChannel].m_channelParam.contains(tmp)) + { + if (m_params.contains(tmp)) + { + m_channels[currentChannel].m_channelParam[tmp] = m_params[tmp]; + if (tmp == "roi") + { + m_channels[currentChannel].m_channelParam["sizex"] = m_params["sizex"]; + m_channels[currentChannel].m_channelParam["sizey"] = m_params["sizey"]; + } + } + else + { + retVal = ito::RetVal(ito::retError, 0, tr("unknown parameter %1 in m_params").arg(tmp).toLatin1().data()); + } + } + } + } + + else + { + retVal = ito::RetVal(ito::retError, 0, tr("unknown channel %1").arg(currentChannel).toLatin1().data()); + } + } + else + { + QMapIterator it(m_channels[m_params["defaultChannel"].getVal()].m_channelParam); + while (it.hasNext()) + { + it.next(); + const_cast(it.value()) = m_params[it.key()]; + + } + } + return retVal; + } + + ////---------------------------------------------------------------------------------------------------------------------------------- + ////! updates sizex and sizey + ///*! + //Call this function to update sizex and sizey. If the roi is changed via setParam this function will be call automatically. + //Do not forget to apply the changes to the channel parameters by calling applyParamsToChannelParams after calling this function. + + //\param [in] keyList indicates which params are copied. If the List is empty all Parameters of the current channel are updated. + //\return retOk if everything was ok, else retError + //*/ + void AddInMultiChannelGrabber::updateSizeXY() + { + const int* roi = m_params["roi"].getVal(); + int height = roi[3]; + int width = roi[2]; + m_params["sizex"].setVal(width); + m_params["sizey"].setVal(height); + } +}//end namespace ito \ No newline at end of file diff --git a/commonQt/CMakeLists.txt b/commonQt/CMakeLists.txt index 6b84e5c02..c0e36b0a5 100644 --- a/commonQt/CMakeLists.txt +++ b/commonQt/CMakeLists.txt @@ -70,6 +70,7 @@ link_directories( set(ITOMCOMMONQT_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/commonQtVersion.h ${CMAKE_CURRENT_SOURCE_DIR}/../common/addInGrabber.h + ${CMAKE_CURRENT_SOURCE_DIR}/../common/addInMultiChannelGrabber.h ${CMAKE_CURRENT_SOURCE_DIR}/../common/addInInterface.h ${CMAKE_CURRENT_SOURCE_DIR}/../common/addInInterfaceVersion.h ${CMAKE_CURRENT_SOURCE_DIR}/../common/abstractAddInDockWidget.h @@ -89,6 +90,7 @@ set(ITOMCOMMONQT_HEADERS set(ITOMCOMMONQT_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../common/sources/addInGrabber.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../common/sources/addInMultiChannelGrabber.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../common/sources/addInInterface.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../common/sources/abstractAddInDockWidget.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../common/sources/abstractAddInConfigDialog.cpp From 249ba875f14d5ecef358a2926623571b43ec8403 Mon Sep 17 00:00:00 2001 From: robin92 Date: Wed, 30 Jun 2021 16:56:56 +0200 Subject: [PATCH 20/62] AddInMultiChannelGrabber: added new functions allowing to set parameters within the plugin. --- common/addInMultiChannelGrabber.h | 10 +- common/sources/addInGrabber.cpp | 3 +- common/sources/addInMultiChannelGrabber.cpp | 352 ++++++++++++++++---- 3 files changed, 296 insertions(+), 69 deletions(-) diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index 648276937..62f5872fc 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -69,9 +69,15 @@ namespace ito virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ void addChannel(QString name); - virtual ito::RetVal synchronizeParamswithChannelParams(QString previousChannel);/*!< synchronizes m_params with the params of default channel container */ + virtual ito::RetVal switchDefaultChannel();/*!< synchronizes m_params with the params of default channel container */ virtual ito::RetVal applyParamsToChannelParams(QStringList keyList = QStringList()); - void initializeDefaultConfiguration(QMap channelContainerMap);/*!< sets the channel parameters.*/ + void initializeDefaultConfiguration(const QMap& channelContainerMap, const QMap& nonChannelSpecificParams = QMap());/*!< sets the channel parameters.*/ + + template ito::RetVal setParamVal(const QByteArray& paramName,const T& val, const QList& channelList = QList()); + ito::RetVal setParamMeta(const QByteArray& paramName, ito::ParamMeta* meta, bool takeOwnerShip, const QList& channelList = QList()); + ito::RetVal setParamFlags(const QByteArray& paramName, const unsigned int& flags, const QList& channelList = QList()); + ito::RetVal roiChanged(const QList& channelList = QList()); + ////! Specific function to set the parameters in the respective plugin class ///*! diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index e41537d5a..535eb4192 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -122,7 +122,8 @@ namespace ito #else const QMetaObject mo = StaticQtMetaObject::get(); #endif - const char* val_ = val.toLower().data(); + const QByteArray lowerByte = val.toLower(); + const char* val_ = lowerByte.data(); QMetaEnum me = mo.enumerator(mo.indexOfEnumerator("PixelFormat")); int pixelFormat = me.keyToValue(val_, ok); return pixelFormat; diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index 3a6b1875c..2aad95c71 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -59,30 +59,27 @@ namespace ito m_params.insert(paramVal.getName(), paramVal); - int roi[] = { 0, 0, 2048, 2048 }; - paramVal = ito::Param("roi", ito::ParamBase::IntArray, 4, roi, tr("ROI (x,y,width,height) [this replaces the values x0,x1,y0,y1]").toLatin1().data()); - ito::RectMeta *rm = new ito::RectMeta(ito::RangeMeta(roi[0], roi[0] + roi[2] - 1), ito::RangeMeta(roi[1], roi[1] + roi[3] - 1), "ImageFormatControl"); - paramVal.setMeta(rm, true); - m_params.insert(paramVal.getName(), paramVal); - - paramVal = ito::Param("sizex", ito::ParamBase::Int | ito::ParamBase::Readonly, 4, 4096, 4096, tr("size in x (cols) [px]").toLatin1().data()); - paramVal.getMetaT()->setCategory("ImageFormatControl"); - m_params.insert(paramVal.getName(), paramVal); - - paramVal = ito::Param("sizey", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 4096, 4096, tr("size in y (rows) [px]").toLatin1().data()); - paramVal.getMetaT()->setCategory("ImageFormatControl"); - m_params.insert(paramVal.getName(), paramVal); - - ito::StringMeta *m = new ito::StringMeta(ito::StringMeta::String, "mono8"); - m->addItem("mono10"); - m->addItem("mono12"); - m->addItem("mono16"); - paramVal = ito::Param("pixelFormat", ito::ParamBase::String, "mono8", tr("bitdepth of images: mono8, mono10, mono12, mono16, rgb32").toLatin1().data()); - paramVal.setMeta(m, true); - m_params.insert(paramVal.getName(), paramVal); - - - + //int roi[] = { 0, 0, 2048, 2048 }; + //paramVal = ito::Param("roi", ito::ParamBase::IntArray, 4, roi, tr("ROI (x,y,width,height) [this replaces the values x0,x1,y0,y1]").toLatin1().data()); + //ito::RectMeta *rm = new ito::RectMeta(ito::RangeMeta(roi[0], roi[0] + roi[2] - 1), ito::RangeMeta(roi[1], roi[1] + roi[3] - 1), "ImageFormatControl"); + //paramVal.setMeta(rm, true); + //m_params.insert(paramVal.getName(), paramVal); + + //paramVal = ito::Param("sizex", ito::ParamBase::Int | ito::ParamBase::Readonly, 4, 4096, 4096, tr("size in x (cols) [px]").toLatin1().data()); + //paramVal.getMetaT()->setCategory("ImageFormatControl"); + //m_params.insert(paramVal.getName(), paramVal); + + //paramVal = ito::Param("sizey", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 4096, 4096, tr("size in y (rows) [px]").toLatin1().data()); + //paramVal.getMetaT()->setCategory("ImageFormatControl"); + //m_params.insert(paramVal.getName(), paramVal); + + //ito::StringMeta *m = new ito::StringMeta(ito::StringMeta::String, "mono8"); + //m->addItem("mono10"); + //m->addItem("mono12"); + //m->addItem("mono16"); + //paramVal = ito::Param("pixelFormat", ito::ParamBase::String, "mono8", tr("bitdepth of images: mono8, mono10, mono12, mono16, rgb32").toLatin1().data()); + //paramVal.setMeta(m, true); + //m_params.insert(paramVal.getName(), paramVal); } @@ -94,7 +91,7 @@ namespace ito } //---------------------------------------------------------------------------------------------------------------------------------- - void AddInMultiChannelGrabber::initializeDefaultConfiguration(QMap channelContainerMap) + void AddInMultiChannelGrabber::initializeDefaultConfiguration(const QMap& channelContainerMap, const QMap& nonChannelSpecificParams /*QMap()*/) { ito::RetVal retValue(ito::retOk); bool channelSpecificParam = false; @@ -103,29 +100,54 @@ namespace ito assert(channelContainerMap.size() != 0); QMapIterator channel(channelContainerMap); QVector channelList; + QMapinitialParams = m_params; while (channel.hasNext()) { channel.next(); QMapIterator channelParamIterator(channel.value().m_channelParam); - if (!m_params.contains(channelParamIterator.key())) + while (channelParamIterator.hasNext())//iterate through channel params { - m_paramChannelAvailabilityMap.insert(channelParamIterator.key(), QStringList()); - QMapIteratortmpChannel(channelContainerMap); - while (tmpChannel.hasNext()) + channelParamIterator.next(); + if (!m_params.contains(channelParamIterator.key())) { - tmpChannel.next(); - if (tmpChannel.value().m_channelParam.contains(channelParamIterator.key())) - { - m_paramChannelAvailabilityMap[channelParamIterator.key()].append(tmpChannel.key()); - } + m_params.insert(channelParamIterator.key(),channelParamIterator.value()); } + if (!m_paramChannelAvailabilityMap.contains(channelParamIterator.key())) + { + m_paramChannelAvailabilityMap.insert(channelParamIterator.key(), QStringList(channel.key())); + } + else + { + m_paramChannelAvailabilityMap[channelParamIterator.key()].append(channel.key()); + } + } channelList.append(channel.key().toLatin1().data()); } m_params["channelList"].setVal(channelList.data(), channelList.length()); - //todo standards müssen noch gesetzt werden und parameter in m_params übertragen werden + m_params["defaultChannel"].setVal(channelContainerMap.firstKey().toLatin1().data()); + m_channels = channelContainerMap; + QMapIterator nonChannelSpecificParamsIt(nonChannelSpecificParams); + while (nonChannelSpecificParamsIt.hasNext()) + { + nonChannelSpecificParamsIt.next(); + assert(!m_params.contains(nonChannelSpecificParamsIt.key())); + assert(!m_paramChannelAvailabilityMap.contains(nonChannelSpecificParamsIt.key())); + m_paramChannelAvailabilityMap.insert(nonChannelSpecificParamsIt.key(), QStringList()); + m_params.insert(nonChannelSpecificParamsIt.key(), nonChannelSpecificParamsIt.value()); + + } + QMapIterator initialParamsIt(initialParams); + while (initialParamsIt.hasNext()) + { + initialParamsIt.next(); + assert(!m_paramChannelAvailabilityMap.contains(initialParamsIt.key())); + m_paramChannelAvailabilityMap.insert(nonChannelSpecificParamsIt.key(), QStringList()); + } m_defaultConfigReady = true; + switchDefaultChannel(); + } } @@ -142,6 +164,7 @@ namespace ito //*/ ito::RetVal AddInMultiChannelGrabber::sendDataToListeners(int waitMS) { + assert(m_defaultConfigReady); ito::RetVal retValue = ito::retOk; int size = m_autoGrabbingListeners.size(); if (waitMS == 0) @@ -196,6 +219,7 @@ namespace ito ito::RetVal ito::AddInMultiChannelGrabber::checkData(ito::DataObject *externalDataObject) { + assert(m_defaultConfigReady); ito::RetVal retVal(ito::retOk); bool ok; unsigned int futureType; @@ -282,6 +306,7 @@ namespace ito ito::RetVal AddInMultiChannelGrabber::getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) { + assert(m_defaultConfigReady); ItomSharedSemaphoreLocker locker(waitCond); ito::RetVal retValue; QString key; @@ -330,6 +355,7 @@ namespace ito ito::RetVal AddInMultiChannelGrabber::changeChannelForListerners(const QString& newChannel, QObject* obj) { + assert(m_defaultConfigReady); ito::RetVal retValue(ito::retOk); bool found = false; if (obj) @@ -358,9 +384,10 @@ namespace ito } return retValue; } - + //todo: update setParam... ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer val, ItomSharedSemaphore *waitCond/* = NULL*/) { + assert(m_defaultConfigReady); ItomSharedSemaphoreLocker locker(waitCond); ito::RetVal retValue; bool hasIndex, ok; @@ -403,12 +430,12 @@ namespace ito { if (key == "defaultChannel") { - QString previousChannel = m_params["defaultChannel"].getVal(); if (m_channels.find(val->getVal()) != m_channels.end()) { retValue += it->copyValueFrom(&(*val)); - retValue += synchronizeParamswithChannelParams(previousChannel); + retValue += switchDefaultChannel(); + //retValue += synchronizeParamswithChannelParams(previousChannel); } else { @@ -475,45 +502,36 @@ namespace ito //\param [in] previousChannel indicates the name of the previous default channel. This is needed to check whether a parameter is no longer contained in the current channel, which was contained in the previous one. //\return retOk if everything was ok, else retError //*/ - ito::RetVal AddInMultiChannelGrabber::synchronizeParamswithChannelParams(QString previousChannel) + //Todo: this function will be replaced by switchDefaultChannel + ito::RetVal AddInMultiChannelGrabber::switchDefaultChannel() { - ito::RetVal retVal(ito::retOk); + assert(m_defaultConfigReady); + ito::RetVal retValue(ito::retOk); unsigned int flag = 0; - QMapIterator itChannelParams(m_channels[m_params["defaultChannel"].getVal()].m_channelParam); - bool channelDiffer = false; - //Check if the previous channel had the same parameters - QStringList defaulKeyList = m_channels[m_params["defaultChannel"].getVal()].m_channelParam.keys(); - qSort(defaulKeyList); - QStringList previousKeyList = m_channels[previousChannel].m_channelParam.keys(); - qSort(previousKeyList); - if (defaulKeyList != previousKeyList) + const char* selectedChannel = m_params["defaultChannel"].getVal(); + if (m_channels.contains(selectedChannel)) { - QStringList::ConstIterator itPreviousChannel; - for (itPreviousChannel = previousKeyList.constBegin(); itPreviousChannel != previousKeyList.constEnd(); ++itPreviousChannel) + QMutableMapIterator itParam(m_params); + while (itParam.hasNext()) { - if (!defaulKeyList.contains(*itPreviousChannel))//if param from previous channel is not included in current channel, set param in m_params to readonly. + itParam.next(); + if (m_paramChannelAvailabilityMap[itParam.key()].contains(selectedChannel)) { - flag = m_params[*itPreviousChannel].getFlags(); + itParam.value() = m_channels[selectedChannel].m_channelParam[itParam.key()]; + } + else if(!m_paramChannelAvailabilityMap[itParam.key()].isEmpty()) + { + flag = itParam.value().getFlags(); flag |= ito::ParamBase::Readonly; - m_params[*itPreviousChannel].setFlags(flag); - //if a param is in the current channel include which was not in the previous one, the readonly flag will be removed when copying the param from the channel container to m_params + itParam.value().setFlags(flag); } } } - while (itChannelParams.hasNext()) + else { - itChannelParams.next(); - if (m_params.contains(itChannelParams.key())) - { - m_params[itChannelParams.key()] = itChannelParams.value(); //copy param - } - else - { - retVal += ito::RetVal(ito::retError, 0, QString("channel parameter %1 not found in m_params").arg(itChannelParams.key()).toLatin1().data()); - } - + retValue += ito::RetVal(ito::retError, 0, tr("could not switch to channel %1. The channel is not registered.").arg(selectedChannel).toLatin1().data()); } - return retVal; + return retValue; } ////---------------------------------------------------------------------------------------------------------------------------------- ////! copies value m_params to the channel params of the current default channel @@ -526,6 +544,7 @@ namespace ito //*/ ito::RetVal AddInMultiChannelGrabber::applyParamsToChannelParams(QStringList keyList) { + assert(m_defaultConfigReady); ito::RetVal retVal(ito::retOk); QString currentChannel = m_params["defaultChannel"].getVal(); if (!keyList.isEmpty()) @@ -583,10 +602,211 @@ namespace ito //*/ void AddInMultiChannelGrabber::updateSizeXY() { + assert(m_defaultConfigReady); const int* roi = m_params["roi"].getVal(); int height = roi[3]; int width = roi[2]; m_params["sizex"].setVal(width); m_params["sizey"].setVal(height); } + + template ito::RetVal ito::AddInMultiChannelGrabber::setParamVal( const QByteArray& paramName, const T & val, const QList& channelList /*=QList()*/) + { + assert(m_defaultConfigReady); + ito::RetVal retValue(ito::retOk); + if (m_paramChannelAvailabilityMap.contains(paramName) && m_params.contains(paramName)) + { + if (channelList.isEmpty()) //we want to update the param for all channels even if it is a global one + { + retValue = m_params[paramName].setVal(val); + QStringListIterator it (m_paramChannelAvailabilityMap[paramName]); + while (it.hasNext()) // update param for all channels + { + it.next(); + retValue += m_channels[it.value()].m_channelParam[paramName].setVal(val); + } + } + else // we only want to update the param for a list of channels + { + for (int i = 0; i < channelList.length(); i++) + { + if (m_channels.contains(channelList[i])) + { + if (m_paramChannelAvailabilityMap[paramName].contains(channelList[i])) + { + retValue += m_channels[channelList[i]].m_channelParam[paramName].setVal(val); + } + } + else + { + retValue += ito::RetVal(ito::retError, 0, QString("unknown channel %1").arg(channelList[i])); + } + + } + if (!retValue.containsError()) + { + //update m_params if the current default channel is listed in channelList or if the current default channel does not support the param (the param in m_params then is set to readonly) + if (channelList.contains(m_params["defaultChannel"].getVal()) || !m_paramChannelAvailabilityMap[paramName].contains(m_params["defaultChannel"].getVal())) + { + retValue += m_params[paramName].setVal(val); + } + } + } + + } + else + { + retValue += ito::RetVal(ito::retError, 0, QString("could not find parameter %1. Maybe the parameter is not registered").arg(paramName)); + } + if (paramName == "roi" && !retValue.containsError()) + { + retValue += roiChanged(channelList); + } + + return retValue; + } + + ito::RetVal AddInMultiChannelGrabber::setParamMeta(const QByteArray& paramName, ito::ParamMeta* meta, bool takeOwnerShip ,const QList& channelList/* = QList()*/) + { + assert(m_defaultConfigReady); + ito::RetVal retValue(ito::retOk); + if (m_paramChannelAvailabilityMap.contains(paramName) && m_params.contains(paramName)) + { + if (channelList.isEmpty()) //we want to update the param for all channels even if it is a global one + { + m_params[paramName].setMeta(meta, takeOwnerShip); + QStringListIterator it(m_paramChannelAvailabilityMap[paramName]); + while (it.hasNext()) // update param for all channels + { + m_channels[it.next()].m_channelParam[paramName].setMeta(meta, takeOwnerShip); + } + } + else // we only want to update the param for a list of channels + { + for (int i = 0; i < channelList.length(); i++) + { + if (m_channels.contains(channelList[i])) + { + if (m_paramChannelAvailabilityMap[paramName].contains(channelList[i])) + { + m_channels[channelList[i]].m_channelParam[paramName].setMeta(meta, takeOwnerShip); + } + } + else + { + retValue += ito::RetVal(ito::retError, 0, QString("unknown channel %1").arg(QString(paramName)).toLatin1().data()); + } + + } + if (!retValue.containsError()) + { + //update m_params if the current default channel is listed in channelList or if the current default channel does not support the param (the param in m_params then is set to readonly) + if (channelList.contains(m_params["defaultChannel"].getVal()) || !m_paramChannelAvailabilityMap[paramName].contains(m_params["defaultChannel"].getVal())) + { + m_params[paramName].setMeta(meta, takeOwnerShip); + } + } + } + + } + else + { + retValue += ito::RetVal(ito::retError, 0, QString("could not find parameter %1. Maybe the parameter is not registered").arg(QString(paramName)).toLatin1().data()); + } + + return retValue; + } + + ito::RetVal AddInMultiChannelGrabber::setParamFlags(const QByteArray& paramName, const unsigned int& flags, const QList& channelList/* = QList()*/) + { + assert(m_defaultConfigReady); + ito::RetVal retValue(ito::retOk); + if (m_paramChannelAvailabilityMap.contains(paramName) && m_params.contains(paramName)) + { + if (channelList.isEmpty()) //we want to update the param for all channels even if it is a global one + { + m_params[paramName].setFlags(flags); + QStringListIterator it(m_paramChannelAvailabilityMap[paramName]); + while (it.hasNext()) // update param for all channels + { + m_channels[it.next()].m_channelParam[paramName].setFlags(flags); + } + } + else // we only want to update the param for a list of channels + { + for (int i = 0; i < channelList.length(); i++) + { + if (m_channels.contains(channelList[i])) + { + if (m_paramChannelAvailabilityMap[paramName].contains(channelList[i])) + { + m_channels[channelList[i]].m_channelParam[paramName].setFlags(flags); + } + } + else + { + retValue += ito::RetVal(ito::retError, 0, QString("unknown channel %1").arg(QString(paramName)).toLatin1().data()); + } + + } + if (!retValue.containsError()) + { + //update m_params if the current default channel is listed in channelList or if the current default channel does not support the param (the param in m_params then is set to readonly) + if (channelList.contains(m_params["defaultChannel"].getVal()) || !m_paramChannelAvailabilityMap[paramName].contains(m_params["defaultChannel"].getVal())) + { + m_params[paramName].setFlags(flags); + } + } + } + + } + else + { + retValue += ito::RetVal(ito::retError, 0, QString("could not find parameter %1. Maybe the parameter is not registered").arg(QString(paramName)).toLatin1().data()); + } + + return retValue; + } + + ito::RetVal AddInMultiChannelGrabber::roiChanged(const QList& channelList /*= QList()*/) + { + ito::RetVal retValue(ito::retOk); + if (channelList.isEmpty())//assume the roi changed for all channels + { + QMapIterator it(m_channels); + while (it.hasNext()) + { + it.next(); + const int* roi = m_channels[it.key()].m_channelParam["roi"].getVal(); + int height = roi[3]; + int width = roi[2]; + retValue += m_channels[it.key()].m_channelParam["sizex"].setVal(width); + retValue += m_channels[it.key()].m_channelParam["sizey"].setVal(height); + + } + const int* roi = m_params["roi"].getVal(); + int height = roi[3]; + int width = roi[2]; + retValue += m_params["sizex"].setVal(width); + retValue += m_params["sizey"].setVal(height); + } + else + { + for (int i = 0; i < channelList.length(); i++) + { + const int* roi = m_channels[channelList[i]].m_channelParam["roi"].getVal(); + retValue += m_channels[channelList[i]].m_channelParam["sizex"].setVal(roi[2]); + retValue += m_channels[channelList[i]].m_channelParam["sizex"].setVal(roi[3]); + + } + if (channelList.contains(m_params["defaultChannel"].getVal())) + { + const int* roi = m_params["roi"].getVal(); + retValue += m_params["sizex"].setVal(roi[2]); + retValue += m_params["sizey"].setVal(roi[3]); + } + } + return retValue; + } + }//end namespace ito \ No newline at end of file From 6799013652a8bb4a5e460fbf98ae2e7017420386 Mon Sep 17 00:00:00 2001 From: robin92 Date: Thu, 1 Jul 2021 22:01:08 +0200 Subject: [PATCH 21/62] AddInMultiChannelGrabber: small fixes --- common/sources/addInMultiChannelGrabber.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index 2aad95c71..d819b4bd9 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -467,7 +467,17 @@ namespace ito } if (list.contains("roi")) //if key is roi sizex and sizey must be adapted { - updateSizeXY(); + if (!suffix.isEmpty()) + { + QByteArrayList channelList; + channelList.append(suffix.toLatin1()); + roiChanged(channelList); + } + else + { + roiChanged(); + } + } if (!retValue.containsError()) { @@ -796,7 +806,7 @@ namespace ito { const int* roi = m_channels[channelList[i]].m_channelParam["roi"].getVal(); retValue += m_channels[channelList[i]].m_channelParam["sizex"].setVal(roi[2]); - retValue += m_channels[channelList[i]].m_channelParam["sizex"].setVal(roi[3]); + retValue += m_channels[channelList[i]].m_channelParam["sizey"].setVal(roi[3]); } if (channelList.contains(m_params["defaultChannel"].getVal())) From 3e75988350f2a0021f51c6c8fe76f2d54b4ece53 Mon Sep 17 00:00:00 2001 From: robin92 Date: Mon, 1 Aug 2022 17:30:20 +0200 Subject: [PATCH 22/62] added new pixel formats to addInGrabber --- Qitom/widgets/figureWidget.cpp | 55 ++++++++++++---------- common/addInGrabber.h | 25 +++++++++- common/sources/addInGrabber.cpp | 66 +++++++++++++++++---------- python_unittests/multichannel_test.py | 20 ++++---- 4 files changed, 107 insertions(+), 59 deletions(-) diff --git a/Qitom/widgets/figureWidget.cpp b/Qitom/widgets/figureWidget.cpp index be781b3b9..195a7adb7 100644 --- a/Qitom/widgets/figureWidget.cpp +++ b/Qitom/widgets/figureWidget.cpp @@ -492,40 +492,47 @@ RetVal FigureWidget::liveImage( bool isLine = false; ito::AutoInterval bitRange (0.0, 1.0); - int bpp = 0; if (qobject_cast(cam)) { QSharedPointer paramFormat = getParamByInvoke(cam.data(), "pixelFormat", retval); const char * pixelFormat = paramFormat->getVal(); - bpp = AddInAbstractGrabber::pixelFormatStringToBpp(pixelFormat); - } - else // fall back for AddInGrabber - { - bpp = getParamByInvoke(cam.data(), "bpp", retval)->getVal(); - } - if (!retval.containsError()) - { - if (bpp == 8) + double min, max = 0.0; + bool ok = false; + AddInAbstractGrabber::integerPixelFormatStringToMinMaxValue(pixelFormat, min, max, ok); + if (ok) { + bitRange.setMaximum(max); + bitRange.setMinimum(min); setDepth = true; - bitRange.setMaximum(255.0); } - else if (bpp < 17) - { - setDepth = true; - bitRange.setMaximum((float)((1 << bpp)-1)); - } - else if (bpp == 32) - { - // ToDo define float32 and int32 behavior! - } - else if (bpp == 64) + + } + else // fall back for AddInGrabber + { + int bpp = getParamByInvoke(cam.data(), "bpp", retval)->getVal(); + if (!retval.containsError()) { - // ToDo define float64 behavior! + if (bpp == 8) + { + setDepth = true; + bitRange.setMaximum(255.0); + } + else if (bpp < 17) + { + setDepth = true; + bitRange.setMaximum((float)((1 << bpp) - 1)); + } + else if (bpp == 32) + { + // ToDo define float32 and int32 behavior! + } + else if (bpp == 64) + { + // ToDo define float64 behavior! + } } - } - + } //get size of camera image QSharedPointer sizex = getParamByInvoke(cam.data(), "sizex", retval); QSharedPointer sizey = getParamByInvoke(cam.data(), "sizey", retval); diff --git a/common/addInGrabber.h b/common/addInGrabber.h index 3324d72f7..5f16ea09b 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -50,10 +50,27 @@ namespace ito enum PixelFormat { mono8 = ito::tUInt8, + mono8s = ito::tInt8, mono10 = ito::tUInt16, + mono10Packed = ito::tUInt16, mono12 = ito::tUInt16, + mono12Packed = ito::tUInt16, + mono14 = ito::tUInt16, + mono14Packed = ito::tUInt16, mono16 = ito::tUInt16, - rgb32 = ito::tRGBA32, + rgb8 = ito::tRGBA32, + rgba8 = ito::tRGBA32, + rgb8Planar = ito::tUInt8, + rgb10Planar = ito::tUInt16, + rgb12Planar = ito::tUInt16, + rgb16Planar = ito::tUInt16, + rg8 = ito::tRGBA32, + rg8Packed = ito::tRGBA32, + gb8 = ito::tRGBA32, + float32 = ito::tFloat32, + float64 = ito::tFloat64, + complex64 = ito::tComplex64, + complex128 = ito::tComplex128, }; #if QT_VERSION < 0x050500 //for >= Qt 5.5.0 see Q_ENUM definition below @@ -123,7 +140,11 @@ namespace ito } public: - static int pixelFormatStringToBpp(const char* val); /*!< this method returns the size of a pixel for a given pixelFormat */ + static void integerPixelFormatStringToMinMaxValue( + const char* val, + double& min, + double& max, + bool& ok); /*!< this method gives the value range pixel for a given integer pixelFormat */ static int pixelFormatStringToEnum(const QByteArray &val, bool* ok); /*!< this method maps a string to a value of pixelFormat */ AddInAbstractGrabber(); ~AddInAbstractGrabber(); diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index 535eb4192..ff5e178dc 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -77,33 +77,53 @@ namespace ito } //---------------------------------------------------------------------------------------------------------------------------------- - //! this method returns the size of a pixel for a given pixelFormat. - int AddInAbstractGrabber::pixelFormatStringToBpp(const char* val) + //! this method gives the value range pixel for a given integer pixelFormat. + void AddInAbstractGrabber::integerPixelFormatStringToMinMaxValue( + const char* val, double& min, double& max, bool& ok) { - bool ok; - int format = pixelFormatStringToEnum(val, &ok); - if (ok) + ok = false; + const QByteArray formatString(val); + QByteArray lowerByteArray = formatString.toLower(); + if (lowerByteArray == "mono8" || lowerByteArray == "rgb8" || lowerByteArray == "rgba8" || + lowerByteArray == "rgb8planar" || lowerByteArray == "rg8" || + lowerByteArray == "rg8packed" || lowerByteArray == "gb8") { - if (format == mono8) - { - return 8; - } - else if (format == mono10 || format == mono12 || format == mono16) - { - return 16; - } - else if(format == rgb32) - { - return 40; - } - else - { - return -1; - } + min = 0.0; + max = 255.0; + ok = true; } - else + else if (lowerByteArray == "mono8s") + { + min = -128.0; + max = 127.0; + ok = true; + } + else if ( + lowerByteArray == "mono10" || lowerByteArray == "mono10packed" || lowerByteArray == "rgb10planar") + { + min = 0.0; + max = 1023.0; + ok = true; + } + else if ( + lowerByteArray == "mono12" || lowerByteArray == "mono12packed" || lowerByteArray == "rgb12planar") + { + min = 0.0; + max = 4095.0; + ok = true; + } + else if (lowerByteArray == "mono14" || lowerByteArray == "mono14packed") + { + min = 0.0; + max = 16383.0; + ok = true; + } + else if ( + lowerByteArray == "mono16" || lowerByteArray == "rgb16planar") { - return -1; + min = 0.0; + max = 65535.0; + ok = true; } } diff --git a/python_unittests/multichannel_test.py b/python_unittests/multichannel_test.py index cf7566d5b..98221a827 100644 --- a/python_unittests/multichannel_test.py +++ b/python_unittests/multichannel_test.py @@ -17,12 +17,12 @@ def setUpClass(cls): def test_setAndGetParamViaSuffix(self): cam = dataIO("DummyMultiChannelGrabber") - cam.setParam('defaultChannel', 'Channel_0') + cam.setParam('defaultChannel', 'channel_0') originalRoi = cam.getParam('roi') - cam.setParam('roi:Channel_1', [0, 0, 20, 20]) + cam.setParam('roi:channel_1', [0, 0, 20, 20]) roiDefaultChannel = cam.getParam('roi') - roiChannel0 = cam.getParam('roi:Channel_0') - roiChannel1 = cam.getParam('roi:Channel_1') + roiChannel0 = cam.getParam('roi:channel_0') + roiChannel1 = cam.getParam('roi:channel_1') self.assertEqual(originalRoi, roiChannel0) self.assertNotEquals(originalRoi, roiChannel1) @@ -31,13 +31,13 @@ def test_setAndGetParamViaSuffix(self): def test_setAndGetParamViaDefaultChannel(self): cam = dataIO("DummyMultiChannelGrabber") - cam.setParam('defaultChannel', 'Channel_0') + cam.setParam('defaultChannel', 'channel_0') originalRoi = cam.getParam('roi') - cam.setParam('defaultChannel', 'Channel_1') + cam.setParam('defaultChannel', 'channel_1') cam.setParam('roi', [0,0,40,40]) - cam.setParam('defaultChannel', 'Channel_0') + cam.setParam('defaultChannel', 'channel_0') channel0Roi = cam.getParam('roi') - cam.setParam('defaultChannel', 'Channel_1') + cam.setParam('defaultChannel', 'channel_1') channel1Roi = cam.getParam('roi') self.assertEqual(originalRoi, channel0Roi) @@ -45,9 +45,9 @@ def test_setAndGetParamViaDefaultChannel(self): def test_channelSwitchAfterSuffixUsage(self): cam = dataIO("DummyMultiChannelGrabber") - cam.setParam('defaultChannel', 'Channel_0') + cam.setParam('defaultChannel', 'channel_0') originalChannel = cam.getParam('defaultChannel') - cam.setParam('roi:Channel_1', (0, 0, 40, 40)) + cam.setParam('roi:channel_1', (0, 0, 40, 40)) afterSuffixUsage = cam.getParam('defaultChannel') self.assertEqual(originalChannel, afterSuffixUsage) From de2d82f01680c1d8e283d3ba486bd78caf37ecd3 Mon Sep 17 00:00:00 2001 From: robin92 Date: Tue, 2 Aug 2022 11:26:49 +0200 Subject: [PATCH 23/62] MultiChannelGrabber: further improvements --- CMakeLists.txt | 2 +- Qitom/widgets/figureWidget.cpp | 2 +- common/addInGrabber.h | 4 +- common/sources/addInGrabber.cpp | 557 ++++++++++++++------------ python_unittests/multichannel_test.py | 2 +- 5 files changed, 299 insertions(+), 268 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 42284bfa0..adcfe5a02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,7 @@ # # You should have received a copy of the GNU Library General Public License # along with itom. If not, see . - + cmake_minimum_required(VERSION 3.1) project(itom) diff --git a/Qitom/widgets/figureWidget.cpp b/Qitom/widgets/figureWidget.cpp index 195a7adb7..b6a8e05f2 100644 --- a/Qitom/widgets/figureWidget.cpp +++ b/Qitom/widgets/figureWidget.cpp @@ -496,7 +496,7 @@ RetVal FigureWidget::liveImage( { QSharedPointer paramFormat = getParamByInvoke(cam.data(), "pixelFormat", retval); const char * pixelFormat = paramFormat->getVal(); - double min, max = 0.0; + int min, max = 0; bool ok = false; AddInAbstractGrabber::integerPixelFormatStringToMinMaxValue(pixelFormat, min, max, ok); if (ok) diff --git a/common/addInGrabber.h b/common/addInGrabber.h index 5f16ea09b..140262797 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -142,8 +142,8 @@ namespace ito public: static void integerPixelFormatStringToMinMaxValue( const char* val, - double& min, - double& max, + int& min, + int& max, bool& ok); /*!< this method gives the value range pixel for a given integer pixelFormat */ static int pixelFormatStringToEnum(const QByteArray &val, bool* ok); /*!< this method maps a string to a value of pixelFormat */ AddInAbstractGrabber(); diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index ff5e178dc..535198549 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -10,7 +10,7 @@ under the terms of the GNU Library General Public Licence as published by the Free Software Foundation; either version 2 of the Licence, or (at your option) any later version. - + In addition, as a special exception, the Institut fuer Technische Optik (ITO) gives you certain additional rights. These rights are described in the ITO LGPL Exception version 1.0, @@ -27,341 +27,372 @@ #include "AddInGrabber.h" -#include +#include "common/helperCommon.h" #include -#include #include -#include "common/helperCommon.h" - +#include +#include namespace ito { - class AddInAbstractGrabberPrivate +class AddInAbstractGrabberPrivate +{ + public: + int m_nrLiveImageErrors; // number of consecutive errors when automatically grabbing the next image. If this number + // becomes bigger than a threshold, auto grabbing will be disabled. +}; +class AddInGrabberPrivate +{ +}; +class AddInMultiChannelGrabberPrivate +{ +}; + +/*! +\class AddInAbstractGrabber +\brief Inherit from AddInAbstractGrabber if you write a camera/grabber plugin. Please call the constructor of +AddInAbstractGrabber within your plugin constructor. + +This class contains important variables and helper methods which simplify the creation of a camera plugin. Please +consider that you should implement the methods checkImage() and retriveImage() (pure virtual in this class) in your own +class. + +\see checkImage(), retrieveImage() +*/ + +//---------------------------------------------------------------------------------------------------------------------------------- +//! constructor +AddInAbstractGrabber::AddInAbstractGrabber() : AddInDataIO(), m_started(0) +{ + dd = new AddInAbstractGrabberPrivate(); + dd->m_nrLiveImageErrors = 0; +} + +//---------------------------------------------------------------------------------------------------------------------------------- +//! destructor +AddInAbstractGrabber::~AddInAbstractGrabber() +{ + DELETE_AND_SET_NULL(dd); +} + +//---------------------------------------------------------------------------------------------------------------------------------- +//! this method gives the value range pixel for a given integer pixelFormat. +void AddInAbstractGrabber::integerPixelFormatStringToMinMaxValue(const char *val, int &min, int &max, bool &ok) +{ + ok = false; + const QByteArray formatString(val); + QByteArray lowerByteArray = formatString.toLower(); + if (lowerByteArray == "mono8" || lowerByteArray == "rgb8" || lowerByteArray == "rgba8" || + lowerByteArray == "rgb8planar" || lowerByteArray == "rg8" || lowerByteArray == "rg8packed" || + lowerByteArray == "gb8") { - public: - int m_nrLiveImageErrors; //number of consecutive errors when automatically grabbing the next image. If this number becomes bigger than a threshold, auto grabbing will be disabled. - }; - class AddInGrabberPrivate + min = 0.0; + max = 255.0; + ok = true; + } + else if (lowerByteArray == "mono8s") { - - }; - class AddInMultiChannelGrabberPrivate + min = -128.0; + max = 127.0; + ok = true; + } + else if (lowerByteArray == "mono10" || lowerByteArray == "mono10packed" || lowerByteArray == "rgb10planar") { - }; - - /*! - \class AddInAbstractGrabber - \brief Inherit from AddInAbstractGrabber if you write a camera/grabber plugin. Please call the constructor of AddInAbstractGrabber within your plugin constructor. - - This class contains important variables and helper methods which simplify the creation of a camera plugin. Please consider that you should implement - the methods checkImage() and retriveImage() (pure virtual in this class) in your own class. - - \see checkImage(), retrieveImage() - */ - - //---------------------------------------------------------------------------------------------------------------------------------- - //! constructor - AddInAbstractGrabber::AddInAbstractGrabber() : - AddInDataIO(), - m_started(0) + min = 0.0; + max = 1023.0; + ok = true; + } + else if (lowerByteArray == "mono12" || lowerByteArray == "mono12packed" || lowerByteArray == "rgb12planar") { - dd = new AddInAbstractGrabberPrivate(); - dd->m_nrLiveImageErrors = 0; + min = 0.0; + max = 4095.0; + ok = true; } - - //---------------------------------------------------------------------------------------------------------------------------------- - //! destructor - AddInAbstractGrabber::~AddInAbstractGrabber() + else if (lowerByteArray == "mono14" || lowerByteArray == "mono14packed") { - DELETE_AND_SET_NULL(dd); + min = 0.0; + max = 16383.0; + ok = true; } - - //---------------------------------------------------------------------------------------------------------------------------------- - //! this method gives the value range pixel for a given integer pixelFormat. - void AddInAbstractGrabber::integerPixelFormatStringToMinMaxValue( - const char* val, double& min, double& max, bool& ok) + else if (lowerByteArray == "mono16" || lowerByteArray == "rgb16planar") { - ok = false; - const QByteArray formatString(val); - QByteArray lowerByteArray = formatString.toLower(); - if (lowerByteArray == "mono8" || lowerByteArray == "rgb8" || lowerByteArray == "rgba8" || - lowerByteArray == "rgb8planar" || lowerByteArray == "rg8" || - lowerByteArray == "rg8packed" || lowerByteArray == "gb8") - { - min = 0.0; - max = 255.0; - ok = true; - } - else if (lowerByteArray == "mono8s") - { - min = -128.0; - max = 127.0; - ok = true; - } - else if ( - lowerByteArray == "mono10" || lowerByteArray == "mono10packed" || lowerByteArray == "rgb10planar") - { - min = 0.0; - max = 1023.0; - ok = true; - } - else if ( - lowerByteArray == "mono12" || lowerByteArray == "mono12packed" || lowerByteArray == "rgb12planar") - { - min = 0.0; - max = 4095.0; - ok = true; - } - else if (lowerByteArray == "mono14" || lowerByteArray == "mono14packed") - { - min = 0.0; - max = 16383.0; - ok = true; - } - else if ( - lowerByteArray == "mono16" || lowerByteArray == "rgb16planar") - { - min = 0.0; - max = 65535.0; - ok = true; - } - + min = 0.0; + max = 65535.0; + ok = true; } - //---------------------------------------------------------------------------------------------------------------------------------- - /*! - \class AddInAbstractGrabber - \brief This method maps a string to a value of pixelFormat. +} +//---------------------------------------------------------------------------------------------------------------------------------- +/*! +\class AddInAbstractGrabber +\brief This method maps a string to a value of pixelFormat. - This function maps a string to a pixel format by using QMetaType. - */ +This function maps a string to a pixel format by using QMetaType. +*/ - int AddInAbstractGrabber::pixelFormatStringToEnum(const QByteArray &val, bool* ok) - { +int AddInAbstractGrabber::pixelFormatStringToEnum(const QByteArray &val, bool *ok) +{ #if QT_VERSION >= 0x050500 - const QMetaObject mo = staticMetaObject; + const QMetaObject mo = staticMetaObject; #else - const QMetaObject mo = StaticQtMetaObject::get(); + const QMetaObject mo = StaticQtMetaObject::get(); #endif - const QByteArray lowerByte = val.toLower(); - const char* val_ = lowerByte.data(); - QMetaEnum me = mo.enumerator(mo.indexOfEnumerator("PixelFormat")); - int pixelFormat = me.keyToValue(val_, ok); - return pixelFormat; - } - //---------------------------------------------------------------------------------------------------------------------------------- - //! if any live image has been connected to this camera, this event will be regularly fired. - /*! - This event is continoulsy fired if auto grabbing is enabled. At first, the image is acquired (method acquire). Then - the image is retrieved (retrieveImage) and finally the newly grabbed image is send to all registered listeners (sendImagetoListeners) - */ - void AddInAbstractGrabber::timerEvent(QTimerEvent * /*event*/) + const QByteArray lowerByte = val.toLower(); + const char *val_ = lowerByte.data(); + QMetaEnum me = mo.enumerator(mo.indexOfEnumerator("PixelFormat")); + int pixelFormat = me.keyToValue(val_, ok); + return pixelFormat; +} +//---------------------------------------------------------------------------------------------------------------------------------- +//! if any live image has been connected to this camera, this event will be regularly fired. +/*! + This event is continoulsy fired if auto grabbing is enabled. At first, the image is acquired (method acquire). Then + the image is retrieved (retrieveImage) and finally the newly grabbed image is send to all registered listeners + (sendImagetoListeners) +*/ +void AddInAbstractGrabber::timerEvent(QTimerEvent * /*event*/) +{ + QCoreApplication::sendPostedEvents(this, 0); + ito::RetVal retValue = ito::retOk; + + if (m_autoGrabbingListeners.size() > 0) // verify that any liveImage is listening { - QCoreApplication::sendPostedEvents(this,0); - ito::RetVal retValue = ito::retOk; + retValue += acquire(0, NULL); - if (m_autoGrabbingListeners.size() > 0) //verify that any liveImage is listening + if (!retValue.containsError()) { - retValue += acquire(0,NULL); + retValue += retrieveData(); + } - if (!retValue.containsError()) + if (!retValue.containsError()) + { + retValue += sendDataToListeners(200); + } + + if (retValue.containsWarning()) + { + if (retValue.hasErrorMessage()) { - retValue += retrieveData(); + std::cout << "warning while sending live image: " << retValue.errorMessage() << "\n" << std::endl; } - - if (!retValue.containsError()) + else { - retValue += sendDataToListeners(200); + std::cout << "warning while sending live image." + << "\n" + << std::endl; } - if (retValue.containsWarning()) + dd->m_nrLiveImageErrors = 0; + } + else if (retValue.containsError()) + { + if (retValue.hasErrorMessage()) { - if (retValue.hasErrorMessage()) - { - std::cout << "warning while sending live image: " << retValue.errorMessage() << "\n" << std::endl; - } - else - { - std::cout << "warning while sending live image." << "\n" << std::endl; - } - - dd->m_nrLiveImageErrors = 0; + std::cout << "error while sending live image: " << retValue.errorMessage() << "\n" << std::endl; } - else if (retValue.containsError()) + else { - if (retValue.hasErrorMessage()) - { - std::cout << "error while sending live image: " << retValue.errorMessage() << "\n" << std::endl; - } - else - { - std::cout << "error while sending live image." << "\n" << std::endl; - } - - dd->m_nrLiveImageErrors++; - - if (dd->m_nrLiveImageErrors > 10) - { - disableAutoGrabbing(); - dd->m_nrLiveImageErrors = 0; - std::cout << "Auto grabbing of grabber " << this->getIdentifier().toLatin1().data() << " was stopped due to consecutive errors in the previous tries\n" << std::endl; - } + std::cout << "error while sending live image." + << "\n" + << std::endl; } - else + + dd->m_nrLiveImageErrors++; + + if (dd->m_nrLiveImageErrors > 10) { + disableAutoGrabbing(); dd->m_nrLiveImageErrors = 0; + std::cout << "Auto grabbing of grabber " << this->getIdentifier().toLatin1().data() + << " was stopped due to consecutive errors in the previous tries\n" + << std::endl; } } + else + { + dd->m_nrLiveImageErrors = 0; + } + } +} +//---------------------------------------------------------------------------------------------------------------------------------- +//! constructor +AddInGrabber::AddInGrabber() : AddInAbstractGrabber() +{ + dd = new AddInGrabberPrivate(); +} + +//---------------------------------------------------------------------------------------------------------------------------------- +//! destructor +AddInGrabber::~AddInGrabber() +{ + DELETE_AND_SET_NULL(dd); +} +//---------------------------------------------------------------------------------------------------------------------------------- +ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) +{ + int futureHeight = m_params["sizey"].getVal(); + int futureWidth = m_params["sizex"].getVal(); + int futureType; + + int bpp = m_params["bpp"].getVal(); + if (bpp <= 8) + { + futureType = ito::tUInt8; } - //---------------------------------------------------------------------------------------------------------------------------------- - //! constructor - AddInGrabber::AddInGrabber() : - AddInAbstractGrabber() + else if (bpp <= 16) { - dd = new AddInGrabberPrivate(); + futureType = ito::tUInt16; } - - //---------------------------------------------------------------------------------------------------------------------------------- - //! destructor - AddInGrabber::~AddInGrabber() + else if (bpp <= 32) { - DELETE_AND_SET_NULL(dd); + futureType = ito::tInt32; } - //---------------------------------------------------------------------------------------------------------------------------------- - ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) + else + { + futureType = ito::tFloat64; + } + if (!m_params.contains("sizez")) { - int futureHeight = m_params["sizey"].getVal(); - int futureWidth = m_params["sizex"].getVal(); - int futureType; - int bpp = m_params["bpp"].getVal(); - if (bpp <= 8) + if (externalDataObject == NULL) { - futureType = ito::tUInt8; - } - else if (bpp <= 16) - { - futureType = ito::tUInt16; - } - else if (bpp <= 32) - { - futureType = ito::tInt32; + if (m_data.getDims() < 2 || m_data.getSize(0) != (unsigned int)futureHeight || + m_data.getSize(1) != (unsigned int)futureWidth || m_data.getType() != futureType) + { + m_data = ito::DataObject(futureHeight, futureWidth, futureType); + } } else { - futureType = ito::tFloat64; - } - if (!m_params.contains("sizez")) - { - - if (externalDataObject == NULL) + int dims = externalDataObject->getDims(); + if (externalDataObject->getDims() == 0) { - if (m_data.getDims() < 2 || m_data.getSize(0) != (unsigned int)futureHeight || m_data.getSize(1) != (unsigned int)futureWidth || m_data.getType() != futureType) - { - m_data = ito::DataObject(futureHeight, futureWidth, futureType); - } + *externalDataObject = ito::DataObject(futureHeight, futureWidth, futureType); } - else + else if (externalDataObject->calcNumMats() != 1) { - int dims = externalDataObject->getDims(); - if (externalDataObject->getDims() == 0) - { - *externalDataObject = ito::DataObject(futureHeight, futureWidth, futureType); - } - else if (externalDataObject->calcNumMats() != 1) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object has more or less than 1 plane. It must be of right size and type or an uninitilized image.").toLatin1().data()); - } - else if (externalDataObject->getSize(dims - 2) != (unsigned int)futureHeight || externalDataObject->getSize(dims - 1) != (unsigned int)futureWidth || externalDataObject->getType() != futureType) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); - } + return ito::RetVal(ito::retError, 0, + tr("Error during check data, external dataObject invalid. Object has more or less " + "than 1 plane. It must be of right size and type or an uninitilized image.") + .toLatin1() + .data()); + } + else if (externalDataObject->getSize(dims - 2) != (unsigned int)futureHeight || + externalDataObject->getSize(dims - 1) != (unsigned int)futureWidth || + externalDataObject->getType() != futureType) + { + return ito::RetVal(ito::retError, 0, + tr("Error during check data, external dataObject invalid. Object must be of right " + "size and type or an uninitilized image.") + .toLatin1() + .data()); + } + } + } + else + { + int numChannel = m_params["sizez"].getVal(); + if (externalDataObject == NULL) + { + if (m_data.getDims() < 3 || m_data.getSize(0) != (unsigned int)numChannel || + m_data.getSize(1) != (unsigned int)futureHeight || m_data.getSize(2) != (unsigned int)futureWidth || + m_data.getType() != futureType) + { + m_data = ito::DataObject(numChannel, futureHeight, futureWidth, futureType); } } else { - int numChannel = m_params["sizez"].getVal(); - if (externalDataObject == NULL) + int dims = externalDataObject->getDims(); + if (externalDataObject->getDims() == 0) { - if (m_data.getDims() < 3 || m_data.getSize(0) != (unsigned int)numChannel || m_data.getSize(1) != (unsigned int)futureHeight || m_data.getSize(2) != (unsigned int)futureWidth || m_data.getType() != futureType) - { - m_data = ito::DataObject(numChannel, futureHeight, futureWidth, futureType); - } + *externalDataObject = ito::DataObject(numChannel, futureHeight, futureWidth, futureType); } - else + else if (externalDataObject->getSize(dims - 3) != (unsigned int)numChannel || + externalDataObject->getSize(dims - 2) != (unsigned int)futureHeight || + externalDataObject->getSize(dims - 1) != (unsigned int)futureWidth || + externalDataObject->getType() != futureType) { - int dims = externalDataObject->getDims(); - if (externalDataObject->getDims() == 0) - { - *externalDataObject = ito::DataObject(numChannel, futureHeight, futureWidth, futureType); - } - else if (externalDataObject->getSize(dims - 3) != (unsigned int)numChannel || externalDataObject->getSize(dims - 2) != (unsigned int)futureHeight || externalDataObject->getSize(dims - 1) != (unsigned int)futureWidth || externalDataObject->getType() != futureType) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); - } + return ito::RetVal(ito::retError, 0, + tr("Error during check data, external dataObject invalid. Object must be of right " + "size and type or an uninitilized image.") + .toLatin1() + .data()); } } - - return ito::retOk; } - //---------------------------------------------------------------------------------------------------------------------------------- - //! sends m_image to all registered listeners. - /*! - This method is continuously called from timerEvent. Also call this method from your getVal-Method (usually with 0-timeout) - - \param [in] waitMS indicates the time (in ms) that should be waiting until every registered live image source node received m_image. 0: no wait, -1: infinit waiting time, else time in milliseconds - \return retOk if everything was ok, retWarning if live image could not be invoked - */ - ito::RetVal AddInGrabber::sendDataToListeners(int waitMS) - { - QObject *obj; - ito::RetVal retValue = ito::retOk; - // int i=0; - int size = m_autoGrabbingListeners.size(); - if (waitMS == 0) + return ito::retOk; +} +//---------------------------------------------------------------------------------------------------------------------------------- +//! sends m_image to all registered listeners. +/*! +This method is continuously called from timerEvent. Also call this method from your getVal-Method (usually with +0-timeout) + +\param [in] waitMS indicates the time (in ms) that should be waiting until every registered live image source node +received m_image. 0: no wait, -1: infinit waiting time, else time in milliseconds \return retOk if everything was ok, +retWarning if live image could not be invoked +*/ +ito::RetVal AddInGrabber::sendDataToListeners(int waitMS) +{ + QObject *obj; + ito::RetVal retValue = ito::retOk; + // int i=0; + int size = m_autoGrabbingListeners.size(); + + if (waitMS == 0) + { + foreach (obj, m_autoGrabbingListeners) { - foreach(obj, m_autoGrabbingListeners) + if (!QMetaObject::invokeMethod(obj, "setSource", + Q_ARG(QSharedPointer, + QSharedPointer(new ito::DataObject(m_data))), + Q_ARG(ItomSharedSemaphore *, NULL))) { - if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_data))), Q_ARG(ItomSharedSemaphore*, NULL))) - { - retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); - } + retValue += + ito::RetVal(ito::retWarning, 1001, + tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); } } - else if (m_autoGrabbingListeners.size() > 0) - { - ItomSharedSemaphore** waitConds = new ItomSharedSemaphore*[size]; - int i = 0; + } + else if (m_autoGrabbingListeners.size() > 0) + { + ItomSharedSemaphore **waitConds = new ItomSharedSemaphore *[size]; + int i = 0; - foreach(obj, m_autoGrabbingListeners) + foreach (obj, m_autoGrabbingListeners) + { + waitConds[i] = new ItomSharedSemaphore(); + // \todo On Linux a crash occurs here when closing the liveImage ... maybe the same reason why we get an + // error message on windows? + if (!QMetaObject::invokeMethod(obj, "setSource", + Q_ARG(QSharedPointer, + QSharedPointer(new ito::DataObject(m_data))), + Q_ARG(ItomSharedSemaphore *, waitConds[i]))) { - waitConds[i] = new ItomSharedSemaphore(); - // \todo On Linux a crash occurs here when closing the liveImage ... maybe the same reason why we get an error message on windows? - if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) - { - retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); - } - - i++; + retValue += + ito::RetVal(ito::retWarning, 1001, + tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); } - for (i = 0; i < size; i++) + i++; + } + + for (i = 0; i < size; i++) + { + if (!waitConds[i]->wait(waitMS)) { - if (!waitConds[i]->wait(waitMS)) - { - qDebug() << "timeout in number: " << i << "number of items: " << size; - } - waitConds[i]->deleteSemaphore(); - waitConds[i] = NULL; + qDebug() << "timeout in number: " << i << "number of items: " << size; } - - delete[] waitConds; - waitConds = NULL; + waitConds[i]->deleteSemaphore(); + waitConds[i] = NULL; } - return retValue; + delete[] waitConds; + waitConds = NULL; } - -} //end namespace ito + return retValue; +} +} // end namespace ito diff --git a/python_unittests/multichannel_test.py b/python_unittests/multichannel_test.py index 98221a827..d557d8315 100644 --- a/python_unittests/multichannel_test.py +++ b/python_unittests/multichannel_test.py @@ -25,7 +25,7 @@ def test_setAndGetParamViaSuffix(self): roiChannel1 = cam.getParam('roi:channel_1') self.assertEqual(originalRoi, roiChannel0) - self.assertNotEquals(originalRoi, roiChannel1) + self.assertNotEqual(originalRoi, roiChannel1) self.assertEqual(roiChannel1, (0, 0, 20, 20)) self.assertEqual(roiDefaultChannel, roiChannel0) From b75de2e57da9c3f34dd272579c7eb232ebf3a0c1 Mon Sep 17 00:00:00 2001 From: robin92 Date: Thu, 15 Sep 2022 08:14:32 +0200 Subject: [PATCH 24/62] initial work of a multichannel copyVal function --- Qitom/python/pythonPlugins.cpp | 54 ++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/Qitom/python/pythonPlugins.cpp b/Qitom/python/pythonPlugins.cpp index d36da63c8..0ef6c57b8 100644 --- a/Qitom/python/pythonPlugins.cpp +++ b/Qitom/python/pythonPlugins.cpp @@ -3949,7 +3949,6 @@ PyObject* PythonPlugins::PyDataIOPlugin_stop(PyDataIOPlugin *self) Py_RETURN_NONE; } - //------------------------------------------------------------------------------------- PyDoc_STRVAR(PyDataIOPlugin_getVal_doc,"getVal(dataObj) -> None \\\n\ getVal(buffer, length = INT_MAX) -> int \n\ @@ -4040,6 +4039,57 @@ PyObject* PythonPlugins::PyDataIOPlugin_getVal(PyDataIOPlugin *self, PyObject *a invokeMethod = 1; } + else if (PyErr_Clear(), PyArg_ParseTuple(args, "O!", &PyDict_Type, &bufferObj)) + { + PyObject *key, *value, *repr, *str; + Py_ssize_t pos = 0; + ito::DataObject* channelDataObj; + QMap channelMap; + while (PyDict_Next(bufferObj, &pos, &key, &value)) + { + if (PyUnicode_Check(key)) + { + + if ((Py_TYPE(value) == &PythonDataObject::PyDataObjectType)) + { + repr = PyObject_Repr(key); + str = PyUnicode_AsEncodedString(repr, "utf-8", "strict"); + if (((PythonDataObject::PyDataObject*)value)->dataObject) + { + channelMap[QString(PyBytes_AS_STRING(str))] = + ((PythonDataObject::PyDataObject*)value)->dataObject; + } + else + { + Py_XDECREF(repr); + Py_XDECREF(str); + PyErr_SetString( + PyExc_RuntimeError, + "given data object of at least one data object is empty (internal dataObject-pointer is NULL)"); + return NULL; + } + + if (channelMap.size()!=0) + { + + } + + } + else + { + PyErr_SetString( + PyExc_RuntimeError, "The value of at least one item isn't a data object"); + return NULL; + } + } + else + { + PyErr_SetString(PyExc_RuntimeError, "The key of at least one item isn't a string"); + return NULL; + } + } + + } else if (PyErr_Clear(), PyArg_ParseTuple(args, "O|i", &bufferObj, &length)) { if (PyByteArray_Check(bufferObj)) @@ -4085,7 +4135,7 @@ PyObject* PythonPlugins::PyDataIOPlugin_getVal(PyDataIOPlugin *self, PyObject *a PyErr_Clear(); PyErr_SetString( PyExc_RuntimeError, - "arguments of method must be either one data object, byte array or " + "arguments of method must be either one data object, a dictionary containing data objects, a byte array or a " "byte object."); return NULL; } From 4a5800bd02f5a6f5ce0bcfd6630a5bd9cf63f1d3 Mon Sep 17 00:00:00 2001 From: robin92 Date: Mon, 19 Sep 2022 15:42:09 +0200 Subject: [PATCH 25/62] further work on multichannel getVal --- AddInManager/addInManager.cpp | 1 + Qitom/python/pythonPlugins.cpp | 19 +- common/addInInterface.h | 2043 ++++++++++++++++------------- common/sources/addInInterface.cpp | 24 + 4 files changed, 1158 insertions(+), 929 deletions(-) diff --git a/AddInManager/addInManager.cpp b/AddInManager/addInManager.cpp index f2b4a7fad..76c463cda 100644 --- a/AddInManager/addInManager.cpp +++ b/AddInManager/addInManager.cpp @@ -829,6 +829,7 @@ AddInManager::AddInManager(QString itomSettingsFile, void **apiFuncsGraph, QObje qRegisterMetaType >("QMap"); qRegisterMetaType > >("QSharedPointer >"); qRegisterMetaType > >("QVector >"); + qRegisterMetaType > >("QSharedPointer >"); #if ITOM_POINTCLOUDLIBRARY > 0 qRegisterMetaType("ito::PCLPointCloud"); diff --git a/Qitom/python/pythonPlugins.cpp b/Qitom/python/pythonPlugins.cpp index 0ef6c57b8..162940fdb 100644 --- a/Qitom/python/pythonPlugins.cpp +++ b/Qitom/python/pythonPlugins.cpp @@ -4044,7 +4044,7 @@ PyObject* PythonPlugins::PyDataIOPlugin_getVal(PyDataIOPlugin *self, PyObject *a PyObject *key, *value, *repr, *str; Py_ssize_t pos = 0; ito::DataObject* channelDataObj; - QMap channelMap; + QSharedPointer> channelMap(new QMap); while (PyDict_Next(bufferObj, &pos, &key, &value)) { if (PyUnicode_Check(key)) @@ -4056,8 +4056,9 @@ PyObject* PythonPlugins::PyDataIOPlugin_getVal(PyDataIOPlugin *self, PyObject *a str = PyUnicode_AsEncodedString(repr, "utf-8", "strict"); if (((PythonDataObject::PyDataObject*)value)->dataObject) { - channelMap[QString(PyBytes_AS_STRING(str))] = + (*channelMap)[QString(PyBytes_AS_STRING(str))] = ((PythonDataObject::PyDataObject*)value)->dataObject; + std::cout << PyBytes_AS_STRING(str) << "\n"; } else { @@ -4068,12 +4069,6 @@ PyObject* PythonPlugins::PyDataIOPlugin_getVal(PyDataIOPlugin *self, PyObject *a "given data object of at least one data object is empty (internal dataObject-pointer is NULL)"); return NULL; } - - if (channelMap.size()!=0) - { - - } - } else { @@ -4088,6 +4083,14 @@ PyObject* PythonPlugins::PyDataIOPlugin_getVal(PyDataIOPlugin *self, PyObject *a return NULL; } } + locker = (new ItomSharedSemaphore()); + + QMetaObject::invokeMethod( + self->dataIOObj, "getVal", Q_ARG(ItomSharedSemaphore*, locker.getSemaphore())); + QMetaObject::invokeMethod( + self->dataIOObj, "getVal", + QArgument > >("QSharedPointer >",channelMap), + Q_ARG(ItomSharedSemaphore*, locker.getSemaphore())); } else if (PyErr_Clear(), PyArg_ParseTuple(args, "O|i", &bufferObj, &length)) diff --git a/common/addInInterface.h b/common/addInInterface.h index 3854c1932..885bcea82 100755 --- a/common/addInInterface.h +++ b/common/addInInterface.h @@ -30,29 +30,29 @@ along with itom. If not, see . #include "commonGlobal.h" -#include "apiFunctionsInc.h" #include "apiFunctionsGraphInc.h" +#include "apiFunctionsInc.h" #include "addInInterfaceVersion.h" -#include "sharedStructuresQt.h" -#include "sharedStructures.h" #include "functionCancellationAndObserver.h" +#include "sharedStructures.h" +#include "sharedStructuresQt.h" +#include +#include #include #include +#include #include +#include #include -#include #include -#include -#include -#include -#include +#include -//plugins define VISUAL_LEAK_DETECTOR_CMAKE in their CMake configuration file -#if defined _DEBUG && defined(_MSC_VER) && defined(VISUAL_LEAK_DETECTOR_CMAKE) +// plugins define VISUAL_LEAK_DETECTOR_CMAKE in their CMake configuration file +#if defined _DEBUG && defined(_MSC_VER) && defined(VISUAL_LEAK_DETECTOR_CMAKE) #ifndef NOMINAX -#define NOMINMAX //instead min, max is defined as macro in winDef.h, included by vld.h +#define NOMINMAX // instead min, max is defined as macro in winDef.h, included by vld.h #include "vld.h" #undef NOMINMAX #else @@ -60,17 +60,18 @@ along with itom. If not, see . #endif #endif -#if !defined(Q_MOC_RUN) || defined(ITOMCOMMONQT_MOC) //only moc this file in itomCommonQtLib but not in other libraries or executables linking against this itomCommonQtLib +#if !defined(Q_MOC_RUN) || defined(ITOMCOMMONQT_MOC) // only moc this file in itomCommonQtLib but not in other libraries + // or executables linking against this itomCommonQtLib //! macro to create a new plugin instance in the method getAddInInst of any plugin /*! Insert this macro at the first line of the method getAddInInst of your plugin. Pass the name of the corresponding plugin class (not its interface class) */ -#define NEW_PLUGININSTANCE(PluginClass) \ - PluginClass* newInst = new PluginClass(); \ - newInst->setBasePlugin(this); \ - *addInInst = qobject_cast(newInst); \ +#define NEW_PLUGININSTANCE(PluginClass) \ + PluginClass *newInst = new PluginClass(); \ + newInst->setBasePlugin(this); \ + *addInInst = qobject_cast(newInst); \ m_InstList.append(*addInInst); //! macro to delete a plugin instance in the method closeThisInst of any plugin @@ -79,39 +80,46 @@ Insert this macro at the first line of the method closeThisInst of your plugin. Pass the name of the corresponding plugin class (not its interface class). This macro is the opposite of NEW_PLUGININSTANCE */ -#define REMOVE_PLUGININSTANCE(PluginClass) \ - if (*addInInst) \ - { \ - (*addInInst)->deleteLater(); \ - m_InstList.removeOne(*addInInst); \ - } +#define REMOVE_PLUGININSTANCE(PluginClass) \ + if (*addInInst) \ + { \ + (*addInInst)->deleteLater(); \ + m_InstList.removeOne(*addInInst); \ + } //! macro to set the pointer of the plugin to all its defined filters and widgets /*! Insert this macro right after NEW_PLUGININSTANCE in all plugins that are algo plugins. */ -#define REGISTER_FILTERS_AND_WIDGETS \ - foreach(ito::AddInAlgo::FilterDef *f, newInst->m_filterList) \ - { \ - f->m_pBasePlugin = this; \ - } \ - foreach(ito::AddInAlgo::AlgoWidgetDef *w, newInst->m_algoWidgetList) \ - { \ - w->m_pBasePlugin = this; \ - } - -//write this macro right after Q_INTERFACE(...) in your interface class definition -#define PLUGIN_ITOM_API \ - protected: \ - void importItomApi(void** apiPtr) \ - {ito::ITOM_API_FUNCS = apiPtr;} \ - void importItomApiGraph(void** apiPtr) \ - { ito::ITOM_API_FUNCS_GRAPH = apiPtr;} \ - public: \ - virtual int getAddInInterfaceVersion() const \ - { return ITOM_ADDININTERFACE_VERSION; } \ - //. +#define REGISTER_FILTERS_AND_WIDGETS \ + foreach (ito::AddInAlgo::FilterDef *f, newInst->m_filterList) \ + { \ + f->m_pBasePlugin = this; \ + } \ + foreach (ito::AddInAlgo::AlgoWidgetDef *w, newInst->m_algoWidgetList) \ + { \ + w->m_pBasePlugin = this; \ + } + +// write this macro right after Q_INTERFACE(...) in your interface class definition +#define PLUGIN_ITOM_API \ + protected: \ + void importItomApi(void **apiPtr) \ + { \ + ito::ITOM_API_FUNCS = apiPtr; \ + } \ + void importItomApiGraph(void **apiPtr) \ + { \ + ito::ITOM_API_FUNCS_GRAPH = apiPtr; \ + } \ + \ + public: \ + virtual int getAddInInterfaceVersion() const \ + { \ + return ITOM_ADDININTERFACE_VERSION; \ + } \ + //. QT_BEGIN_NAMESPACE class QPluginLoader; @@ -119,994 +127,1187 @@ QT_END_NAMESPACE namespace ito { - //---------------------------------------------------------------------------------------------------------------------------------- - //! tPluginType enumeration - /*! - used to describe the plugin type and subtype (in case of DataIO main type) - e.g. typeDataIO|typeGrabber for a frame grabber - */ - enum tPluginType +//---------------------------------------------------------------------------------------------------------------------------------- +//! tPluginType enumeration +/*! +used to describe the plugin type and subtype (in case of DataIO main type) +e.g. typeDataIO|typeGrabber for a frame grabber +*/ +enum tPluginType +{ + typeDataIO = 0x1, /*!< base type for data input and output (cameras, AD-converter, display windows...) */ + typeActuator = 0x2, /*!< base type for actuators and motors */ + typeAlgo = 0x4, /*!< base type for algorithm plugin */ + typeGrabber = 0x80, /*!< subtype of dataIO for cameras (grabbers), use this type in combination with typeDataIO + (OR-combination) */ + typeADDA = 0x100, /*!< subtype of dataIO for AD and DA-converters, use this type in combination with typeDataIO + (OR-combination) */ + typeRawIO = 0x200 /*!< subtype of dataIO for further input-output-devices (like display windows), use this type in + combination with typeDataIO (OR-combination) */ +}; + +//! tActuatorStatus enumeration +/*! +flags used for describing the status of one axis of an actuator plugin. + +These flags are intended to be combined in the status bitmask. +Usually the bitmask for each mask is saved in the vector ito::AddInActuator::m_currentStatus +of an actuator plugin. + +The bitmask is divided into different topical areas (moving flags, switches, general status). +*/ +enum tActuatorStatus +{ + // moving flags + actuatorUnknown = 0x0001, /*!< moving status of axis is unknown */ + actuatorInterrupted = 0x0002, /*!< movement has been interrupted by the user, axis is immediately stopped */ + actuatorMoving = 0x0004, /*!< axis is currently moving */ + actuatorAtTarget = 0x0008, /*!< axis reached target */ + actuatorTimeout = 0x0010, /*!< no signal from axis, timeout */ + // switches + actuatorEndSwitch = 0x0100, /*!< axis reached an undefined end switch */ + actuatorLeftEndSwitch = + 0x0200, /*!< axis reached the specified left end switch (if set, also set actuatorEndSwitch), deprecated */ + actuatorRightEndSwitch = + 0x0400, /*!< axis reached the specified right end switch (if set, also set actuatorEndSwitch), deprecated */ + actuatorEndSwitch1 = 0x0200, /*!< axis reached the specified left end switch (if set, also set actuatorEndSwitch) */ + actuatorEndSwitch2 = 0x0400, /*!< axis reached the specified left end switch (if set, also set actuatorEndSwitch) */ + actuatorRefSwitch = 0x0800, /*!< axis reached an undefined reference switch */ + actuatorLeftRefSwitch = 0x1000, /*!< axis reached the specified left reference switch (if set, also set + actuatorRefSwitch), deprecated */ + actuatorRightRefSwitch = 0x2000, /*!< axis reached the specified right reference switch (if set, also set + actuatorRefSwitch), deprecated */ + actuatorRefSwitch1 = + 0x1000, /*!< axis reached the specified right reference switch (if set, also set actuatorRefSwitch)*/ + actuatorRefSwitch2 = + 0x2000, /*!< axis reached the specified right reference switch (if set, also set actuatorRefSwitch)*/ + + // status flags + actuatorAvailable = 0x4000, /*!< axis is generally available */ + actuatorEnabled = 0x8000, /*!< axis is enabled for movements */ + actuatorError = 0x10000, /*axis has encountered error/reports error*/ + + actMovingMask = actuatorUnknown | actuatorInterrupted | actuatorMoving | actuatorAtTarget | + actuatorTimeout, /*!< bitmask that marks all bits related to the movement */ + + actEndSwitchMask = actuatorEndSwitch | actuatorEndSwitch1 | + actuatorEndSwitch2, /*!< bitmask that marks all bits related to end switches */ + + actRefSwitchMask = actuatorRefSwitch | actuatorRefSwitch1 | + actuatorRefSwitch2, /*!< bitmask that marks all bits related to reference switches */ + + actSwitchesMask = + actEndSwitchMask | actRefSwitchMask, /*!< bitmask that marks all bits related to reference and end switches */ + + actStatusMask = actuatorAvailable | actuatorEnabled | actuatorError /*!< bitmask that marks all status flags */ +}; + +enum tAutoLoadPolicy +{ + autoLoadAlways = 0x1, /*!< always loads xml file by addInManager */ + autoLoadNever = 0x2, /*!< never automatically loads parameters from xml-file (default) */ + autoLoadKeywordDefined = 0x4 /*!< only loads parameters if keyword autoLoadParams=1 exists in python-constructor */ +}; + +enum tAutoSavePolicy +{ + autoSaveAlways = 0x1, /*!< always saves parameters to xml-file at shutdown */ + autoSaveNever = 0x2 /*!< never saves parameters to xml-file at shutdown (default) */ +}; + +struct ExecFuncParams +{ + ExecFuncParams() : infoString("") { - typeDataIO = 0x1, /*!< base type for data input and output (cameras, AD-converter, display windows...) */ - typeActuator = 0x2, /*!< base type for actuators and motors */ - typeAlgo = 0x4, /*!< base type for algorithm plugin */ - typeGrabber = 0x80, /*!< subtype of dataIO for cameras (grabbers), use this type in combination with typeDataIO (OR-combination) */ - typeADDA = 0x100, /*!< subtype of dataIO for AD and DA-converters, use this type in combination with typeDataIO (OR-combination) */ - typeRawIO = 0x200 /*!< subtype of dataIO for further input-output-devices (like display windows), use this type in combination with typeDataIO (OR-combination) */ - }; + } + QVector paramsMand; /*!< mandatory parameters (default set), must have flag In or In|Out */ + QVector paramsOpt; /*!< optional parameters (default set), must have flag In or In|Out */ + QVector paramsOut; /*!< return parameters (default set), must have Out. Only types + Int,Char,Double,String,IntArray,CharArray or DoubleArray are allowed. */ + QString infoString; +}; + +struct FilterParams +{ + QVector paramsMand; + QVector paramsOpt; + QVector paramsOut; +}; + +class AddInBase; //!< forward declaration +class DataObject; +class AddInBasePrivate; //!< forward declaration to private container class of AddInBase +class AddInInterfaceBasePrivate; //!< forward declaration to private container class of AddInInterfaceBase +class AddInActuatorPrivate; //!< forward declaration to private container class of AddInActuator +class AddInDataIOPrivate; //!< forward declaration to private container class of AddInDataIO +class AddInAlgoPrivate; //!< forward declaration to private container class of AddInAlog + +//---------------------------------------------------------------------------------------------------------------------------------- +/** @class AddInInterfaceBase + * @brief class of the AddIn - Library (DLL) - Interface + * + * The measurement program can (and should) be expanded with additional functionality by "plugins". The aim of + * separating part of the program into plugins is to speed up developement and to reduce complexity for plugin + * developers. The main program holds the necessary functionality to load and use plugins with either the integrated + * python interpreter or within c/c++ functions. All plugins are divded into two parts: + * - the AddInInterfaceBase + * - the AddIn (derived from the specific addIn-type that should be created which is derived from AddInBase + * + * The Interface is a small light weight class which is used when loading the dll into the main program. It holds + * information about the plugin itself, e.g. name, version, parameters and so on. When loading the plugin is tested for + * compability with the current version of the main program based on the information in the interface class. The + * AddInXXX class provides the plugin functionality. Instances of this class are only created when the plugin "is used" + * either by python or within other functions. For a description about the loading, using and unloading process see \ref + * AddInBase, \ref AddInActuator, \ref AddInDataIO and \ref AddInAlgo. The instantiation of an AddIn class is a two step + * process. At first the necessary and optional parameter values as well as the plugin's reference number are retrieved + * from the AddInManager using the getInitParams \ref getInitParams method. Then a new instance is obtained using one of + * the initAddIn \ref initAddIn methods. Which first create a new instance, move the instance to a new thread and at + * last call the classes init method + */ +class ITOMCOMMONQT_EXPORT AddInInterfaceBase : public QObject +{ + Q_OBJECT + + private: + //!< internal function used within the closing process + virtual ito::RetVal closeThisInst(ito::AddInBase **addInInst) = 0; + + QScopedPointer + d_ptr; //!> self-managed pointer to the private class container (deletes itself if d_ptr is destroyed) + Q_DECLARE_PRIVATE(AddInInterfaceBase); + + protected: + int m_type; //!< plugin type + int m_version; //!< plugin version + QString m_filename; //!< plugin (library) filename on the disc + int m_maxItomVer; //!< minimum required version of the main program + int m_minItomVer; //!< maximum supported version of the main program + QString m_author; //!< the plugin author + QString m_description; //!< a brief descrition of the plugin + QString m_detaildescription; //!< a detail descrition of the plugin + QString m_license; //!< a short license string for the plugin, default value is "LGPL with ITO itom-exception" + QString m_aboutThis; + QList m_InstList; //!< vector holding a list of the actual instantiated classes of the plugin + QVector + m_initParamsMand; //!< vector with the mandatory initialisation parameters, please only read this vector within + //!< the init-method of AddInBase (afterwards it might have been changed) + QVector + m_initParamsOpt; //!< vector with the optional initialisation parameters, please only read this vector within + //!< the init-method of AddInBase (afterwards it might have been changed) + tAutoLoadPolicy m_autoLoadPolicy; /*!< defines the auto-load policy for automatic loading of parameters from + xml-file at startup of any instance */ + tAutoSavePolicy m_autoSavePolicy; /*!< defines the auto-save policy for automatic saving of parameters in xml-file + at shutdown of any instance */ + bool m_callInitInNewThread; /*!< true (default): the init-method of addIn will be called after that the + plugin-instance has been moved to new thread (my addInManager). false: the + init-method is called in main(gui)-thread, and will be moved to new thread afterwards + (this should only be chosen, if not otherwise feasible) */ + + virtual void importItomApi( + void **apiPtr) = 0; // this methods are implemented in the plugin itsself. Therefore place ITOM_API right after + // Q_INTERFACE in the header file and replace Q_EXPORT_PLUGIN2 by Q_EXPORT_PLUGIN2_ITOM in + // the source file. + virtual void importItomApiGraph(void **apiPtr) = 0; + + //!> check if we have gui support + inline bool hasGuiSupport() + { + if (qobject_cast(QCoreApplication::instance())) + { + return true; + } + else + { + return false; + } + } - //! tActuatorStatus enumeration - /*! - flags used for describing the status of one axis of an actuator plugin. + public: + void **m_apiFunctionsBasePtr; + void **m_apiFunctionsGraphBasePtr; + + //! destructor + virtual ~AddInInterfaceBase(); - These flags are intended to be combined in the status bitmask. - Usually the bitmask for each mask is saved in the vector ito::AddInActuator::m_currentStatus - of an actuator plugin. + //! default constructor + AddInInterfaceBase(); - The bitmask is divided into different topical areas (moving flags, switches, general status). + //! pure virtual function that returns the addin interface version of the plugin + /* This method is automatically implemented by the PLUGIN_ITOM_API macro. + The definition is 0xAABBCC where AA is the major, BB the minor and CC the patch. */ - enum tActuatorStatus + virtual int getAddInInterfaceVersion() const = 0; + + //! returns addIn type + inline int getType(void) const { - //moving flags - actuatorUnknown = 0x0001, /*!< moving status of axis is unknown */ - actuatorInterrupted = 0x0002, /*!< movement has been interrupted by the user, axis is immediately stopped */ - actuatorMoving = 0x0004, /*!< axis is currently moving */ - actuatorAtTarget = 0x0008, /*!< axis reached target */ - actuatorTimeout = 0x0010, /*!< no signal from axis, timeout */ - //switches - actuatorEndSwitch = 0x0100, /*!< axis reached an undefined end switch */ - actuatorLeftEndSwitch = 0x0200, /*!< axis reached the specified left end switch (if set, also set actuatorEndSwitch), deprecated */ - actuatorRightEndSwitch = 0x0400, /*!< axis reached the specified right end switch (if set, also set actuatorEndSwitch), deprecated */ - actuatorEndSwitch1 = 0x0200,/*!< axis reached the specified left end switch (if set, also set actuatorEndSwitch) */ - actuatorEndSwitch2 = 0x0400, /*!< axis reached the specified left end switch (if set, also set actuatorEndSwitch) */ - actuatorRefSwitch = 0x0800, /*!< axis reached an undefined reference switch */ - actuatorLeftRefSwitch = 0x1000, /*!< axis reached the specified left reference switch (if set, also set actuatorRefSwitch), deprecated */ - actuatorRightRefSwitch = 0x2000, /*!< axis reached the specified right reference switch (if set, also set actuatorRefSwitch), deprecated */ - actuatorRefSwitch1 = 0x1000,/*!< axis reached the specified right reference switch (if set, also set actuatorRefSwitch)*/ - actuatorRefSwitch2 = 0x2000,/*!< axis reached the specified right reference switch (if set, also set actuatorRefSwitch)*/ - - //status flags - actuatorAvailable = 0x4000, /*!< axis is generally available */ - actuatorEnabled = 0x8000, /*!< axis is enabled for movements */ - actuatorError = 0x10000,/*axis has encountered error/reports error*/ - - actMovingMask = actuatorUnknown | actuatorInterrupted | actuatorMoving | actuatorAtTarget | actuatorTimeout, /*!< bitmask that marks all bits related to the movement */ - - actEndSwitchMask = actuatorEndSwitch \ - | actuatorEndSwitch1 | actuatorEndSwitch2, /*!< bitmask that marks all bits related to end switches */ - - actRefSwitchMask = \ - actuatorRefSwitch \ - | actuatorRefSwitch1 | actuatorRefSwitch2, /*!< bitmask that marks all bits related to reference switches */ - - actSwitchesMask = actEndSwitchMask | actRefSwitchMask, /*!< bitmask that marks all bits related to reference and end switches */ - - actStatusMask = actuatorAvailable | actuatorEnabled | actuatorError /*!< bitmask that marks all status flags */ - }; + return m_type; + } + //! returns addIn version + inline int getVersion(void) const + { + return m_version; + } + //! returns minimum required version of main program + inline int getMinItomVer(void) const + { + return m_minItomVer; + } + //! returns maximum supported version of main program + inline int getMaxItomVer(void) const + { + return m_maxItomVer; + } - enum tAutoLoadPolicy + //! returns whether init-method should be called in new thread (default) or still in main thread + inline bool getCallInitInNewThread(void) const { - autoLoadAlways = 0x1, /*!< always loads xml file by addInManager */ - autoLoadNever = 0x2, /*!< never automatically loads parameters from xml-file (default) */ - autoLoadKeywordDefined = 0x4 /*!< only loads parameters if keyword autoLoadParams=1 exists in python-constructor */ - }; + return m_callInitInNewThread; + } - enum tAutoSavePolicy + //! returns true if the plugin allows his own parameter load to be autoloaded by addin manager + inline tAutoLoadPolicy getAutoLoadPolicy(void) const { - autoSaveAlways = 0x1, /*!< always saves parameters to xml-file at shutdown */ - autoSaveNever = 0x2 /*!< never saves parameters to xml-file at shutdown (default) */ - }; + return m_autoLoadPolicy; + } - struct ExecFuncParams + //! returns true if the plugin allows his own parameter save to be autoloaded by addin manager + inline tAutoSavePolicy getAutoSavePolicy(void) const { - ExecFuncParams() : infoString("") {} - QVector paramsMand; /*!< mandatory parameters (default set), must have flag In or In|Out */ - QVector paramsOpt; /*!< optional parameters (default set), must have flag In or In|Out */ - QVector paramsOut; /*!< return parameters (default set), must have Out. Only types Int,Char,Double,String,IntArray,CharArray or DoubleArray are allowed. */ - QString infoString; - }; + return m_autoSavePolicy; + } - struct FilterParams + //! returns plugin author + const QString getAuthor(void) const { - QVector paramsMand; - QVector paramsOpt; - QVector paramsOut; - }; + return m_author; + } + //! returns a brief description of the plugin + const QString getDescription(void) const + { + return m_description; + } + //! returns a detailed description of the plugin + const QString getDetailDescription(void) const + { + return m_detaildescription; + } + //! returns a detailed description of the plugin license + const QString getLicenseInfo(void) const + { + return m_license; + } + //! returns a detailed description of the plugin compile informations + const QString getAboutInfo(void) const + { + return m_aboutThis; + } + //! returns the plugin's filename + const QString getFilename(void) const + { + return m_filename; + } - class AddInBase; //!< forward declaration - class DataObject; - class AddInBasePrivate; //!< forward declaration to private container class of AddInBase - class AddInInterfaceBasePrivate; //!< forward declaration to private container class of AddInInterfaceBase - class AddInActuatorPrivate; //!< forward declaration to private container class of AddInActuator - class AddInDataIOPrivate; //!< forward declaration to private container class of AddInDataIO - class AddInAlgoPrivate; //!< forward declaration to private container class of AddInAlog - - //---------------------------------------------------------------------------------------------------------------------------------- - /** @class AddInInterfaceBase - * @brief class of the AddIn - Library (DLL) - Interface - * - * The measurement program can (and should) be expanded with additional functionality by "plugins". The aim of separating - * part of the program into plugins is to speed up developement and to reduce complexity for plugin developers. - * The main program holds the necessary functionality to load and use plugins with either the integrated python interpreter - * or within c/c++ functions. - * All plugins are divded into two parts: - * - the AddInInterfaceBase - * - the AddIn (derived from the specific addIn-type that should be created which is derived from AddInBase - * - * The Interface is a small light weight class which is used when loading the dll into the main program. It holds information - * about the plugin itself, e.g. name, version, parameters and so on. - * When loading the plugin is tested for compability with the current version of the main program based on the information in the - * interface class. - * The AddInXXX class provides the plugin functionality. Instances of this class are only created when the plugin "is used" either - * by python or within other functions. For a description about the loading, using and unloading process see \ref AddInBase, \ref AddInActuator, - * \ref AddInDataIO and \ref AddInAlgo. - * The instantiation of an AddIn class is a two step process. At first the necessary and optional parameter values as well as the - * plugin's reference number are retrieved from the AddInManager using the getInitParams \ref getInitParams method. Then a new instance - * is obtained using one of the initAddIn \ref initAddIn methods. Which first create a new instance, move the instance to a new thread - * and at last call the classes init method - */ - class ITOMCOMMONQT_EXPORT AddInInterfaceBase : public QObject + const ito::RetVal setFilename(const QString &name) + { + m_filename = name; + return ito::retOk; + } + //! returns a list of the actual intantiated classes from this plugin + inline QList getInstList(void) + { + return m_InstList; + } + inline const QList getInstList(void) const { - Q_OBJECT - - private: - //!< internal function used within the closing process - virtual ito::RetVal closeThisInst(ito::AddInBase **addInInst) = 0; - - QScopedPointer d_ptr; //!> self-managed pointer to the private class container (deletes itself if d_ptr is destroyed) - Q_DECLARE_PRIVATE(AddInInterfaceBase); - - protected: - int m_type; //!< plugin type - int m_version; //!< plugin version - QString m_filename; //!< plugin (library) filename on the disc - int m_maxItomVer; //!< minimum required version of the main program - int m_minItomVer; //!< maximum supported version of the main program - QString m_author; //!< the plugin author - QString m_description; //!< a brief descrition of the plugin - QString m_detaildescription; //!< a detail descrition of the plugin - QString m_license; //!< a short license string for the plugin, default value is "LGPL with ITO itom-exception" - QString m_aboutThis; - QList m_InstList; //!< vector holding a list of the actual instantiated classes of the plugin - QVector m_initParamsMand; //!< vector with the mandatory initialisation parameters, please only read this vector within the init-method of AddInBase (afterwards it might have been changed) - QVector m_initParamsOpt; //!< vector with the optional initialisation parameters, please only read this vector within the init-method of AddInBase (afterwards it might have been changed) - tAutoLoadPolicy m_autoLoadPolicy; /*!< defines the auto-load policy for automatic loading of parameters from xml-file at startup of any instance */ - tAutoSavePolicy m_autoSavePolicy; /*!< defines the auto-save policy for automatic saving of parameters in xml-file at shutdown of any instance */ - bool m_callInitInNewThread; /*!< true (default): the init-method of addIn will be called after that the plugin-instance has been moved to new thread (my addInManager). false: the init-method is called in main(gui)-thread, and will be moved to new thread afterwards (this should only be chosen, if not otherwise feasible) */ - - - virtual void importItomApi(void** apiPtr) = 0; //this methods are implemented in the plugin itsself. Therefore place ITOM_API right after Q_INTERFACE in the header file and replace Q_EXPORT_PLUGIN2 by Q_EXPORT_PLUGIN2_ITOM in the source file. - virtual void importItomApiGraph(void** apiPtr) = 0; - - //!> check if we have gui support - inline bool hasGuiSupport() + return m_InstList; + } + //! method for closing an instance + ito::RetVal closeInst(ito::AddInBase **addInInst); + //! returns a vector with the mandatory initialisation parameters + virtual QVector *getInitParamsMand(void) + { + return &m_initParamsMand; + } + //! returns a vector with the optional initialisation parameters + virtual QVector *getInitParamsOpt(void) + { + return &m_initParamsOpt; + } + //! method to instantiate a new class of the plugin + virtual ito::RetVal getAddInInst(ito::AddInBase **addInInst) = 0; + //! increment use reference + void incRef(ito::AddInBase *addIn); + //! decrement use reference + void decRef(ito::AddInBase *addIn); + //! get reference counter + int getRef(ito::AddInBase *addIn); + //! get number instantiated plugins + int getInstCount() + { + return m_InstList.length(); + } + //! set api function pointer + void setApiFunctions(void **apiFunctions); + void setApiFunctionsGraph(void **apiFunctionsGraph); + + void setLoader(QPluginLoader *loader); + QPluginLoader *getLoader(void) const; + + bool event(QEvent *e); +}; + +//---------------------------------------------------------------------------------------------------------------------------------- +/** @class AddInBase + * @brief Base class for all plugins. + * + * The common methods and members are defined here. The available plugin type (actuator \ref AddInActuator, + * dataIO \ref AddInDataIO and algo \ref AddInAlgo) are derived from this class. At the main program startup all + * available plugins located in the plugin directory are searched and matched against the current plugin interface + * version. Then all compatible plugins can be check with the AddInManager. Up to that stage for each plugin only a + * lightweight AddInInterface \ref AddInInterfaceBase class has been loaded. To use a plugin instances of the plugin + * class have to be instantiated. The AddInInterface is run in the calling thread whilst the plugin classes are run in + * separate threads. Therefore the plugin functions are implemented as slots which can be used e.g. with the + * invokeMethod function. The base functionality included in this base class is getting the plugin's parameter list, + * getting the classes uniqueID (which is used e.g. for saveing the parameter values) and optinally to bring up a + * configuration dialog. + */ +class ITOMCOMMONQT_EXPORT AddInBase : public QObject +{ + Q_OBJECT + + public: + struct AddInRef + { + AddInRef() : type(-1), ptr(0) { - if (qobject_cast(QCoreApplication::instance())) - { - return true; - } - else - { - return false; - } } - - public: - void **m_apiFunctionsBasePtr; - void **m_apiFunctionsGraphBasePtr; - - //! destructor - virtual ~AddInInterfaceBase(); - - //! default constructor - AddInInterfaceBase(); - - //! pure virtual function that returns the addin interface version of the plugin - /* This method is automatically implemented by the PLUGIN_ITOM_API macro. - The definition is 0xAABBCC where AA is the major, BB the minor and CC the patch. - */ - virtual int getAddInInterfaceVersion() const = 0; - - //! returns addIn type - inline int getType(void) const { return m_type; } - //! returns addIn version - inline int getVersion(void) const { return m_version; } - //! returns minimum required version of main program - inline int getMinItomVer(void) const { return m_minItomVer; } - //! returns maximum supported version of main program - inline int getMaxItomVer(void) const { return m_maxItomVer; } - - //! returns whether init-method should be called in new thread (default) or still in main thread - inline bool getCallInitInNewThread(void) const { return m_callInitInNewThread; } - - //! returns true if the plugin allows his own parameter load to be autoloaded by addin manager - inline tAutoLoadPolicy getAutoLoadPolicy(void) const { return m_autoLoadPolicy; } - - //! returns true if the plugin allows his own parameter save to be autoloaded by addin manager - inline tAutoSavePolicy getAutoSavePolicy(void) const { return m_autoSavePolicy; } - - //! returns plugin author - const QString getAuthor(void) const { return m_author; } - //! returns a brief description of the plugin - const QString getDescription(void) const { return m_description; } - //! returns a detailed description of the plugin - const QString getDetailDescription(void) const { return m_detaildescription; } - //! returns a detailed description of the plugin license - const QString getLicenseInfo(void) const { return m_license; } - //! returns a detailed description of the plugin compile informations - const QString getAboutInfo(void) const { return m_aboutThis; } - //! returns the plugin's filename - const QString getFilename(void) const { return m_filename; } - - const ito::RetVal setFilename(const QString &name) { m_filename = name; return ito::retOk; } - //! returns a list of the actual intantiated classes from this plugin - inline QList getInstList(void) { return m_InstList; } - inline const QList getInstList(void) const { return m_InstList; } - //! method for closing an instance - ito::RetVal closeInst(ito::AddInBase **addInInst); - //! returns a vector with the mandatory initialisation parameters - virtual QVector* getInitParamsMand(void) { return &m_initParamsMand; } - //! returns a vector with the optional initialisation parameters - virtual QVector* getInitParamsOpt(void) { return &m_initParamsOpt; } - //! method to instantiate a new class of the plugin - virtual ito::RetVal getAddInInst(ito::AddInBase **addInInst) = 0; - //! increment use reference - void incRef(ito::AddInBase *addIn); - //! decrement use reference - void decRef(ito::AddInBase *addIn); - //! get reference counter - int getRef(ito::AddInBase *addIn); - //! get number instantiated plugins - int getInstCount() { return m_InstList.length(); } - //! set api function pointer - void setApiFunctions(void **apiFunctions); - void setApiFunctionsGraph(void ** apiFunctionsGraph); - - void setLoader(QPluginLoader *loader); - QPluginLoader * getLoader(void) const; - - bool event(QEvent *e); + AddInRef(void *p, int t) : type(t), ptr(p) + { + } + int type; + void *ptr; }; - //---------------------------------------------------------------------------------------------------------------------------------- - /** @class AddInBase - * @brief Base class for all plugins. - * - * The common methods and members are defined here. The available plugin type (actuator \ref AddInActuator, - * dataIO \ref AddInDataIO and algo \ref AddInAlgo) are derived from this class. At the main program startup all available plugins - * located in the plugin directory are searched and matched against the current plugin interface version. Then all compatible - * plugins can be check with the AddInManager. Up to that stage for each plugin only a lightweight AddInInterface \ref AddInInterfaceBase - * class has been loaded. To use a plugin instances of the plugin class have to be instantiated. The AddInInterface is run in the - * calling thread whilst the plugin classes are run in separate threads. Therefore the plugin functions are implemented as slots which can be - * used e.g. with the invokeMethod function. - * The base functionality included in this base class is getting the plugin's parameter list, getting the classes uniqueID (which is - * used e.g. for saveing the parameter values) and optinally to bring up a configuration dialog. + //! method to retrieve a parameter from the parameter map (m_params) + const Param getParamRec(const QString name, bool *nameCheckOk = NULL) const; + + //! returns the interface of this instance. \sa AddInInterfaceBase + AddInInterfaceBase *getBasePlugin(void) const; + + //! creates new thread for the class instance and moves this instance to the new thread + ito::RetVal MoveToThread(void); + + //! returns a map with the parameters of this plugin. + /* + Use the method setParam in order to change any parameter. + + \param paramNames [out]. The pointer contains a pointer to the map after the call of this function + \return RetVal returns retOk. */ - class ITOMCOMMONQT_EXPORT AddInBase : public QObject + inline const ito::RetVal getParamList(QMap **paramNames) { - Q_OBJECT - - public: - - struct AddInRef { - AddInRef() : type(-1), ptr(0) {} - AddInRef(void *p, int t) : type(t), ptr(p) {} - int type; - void *ptr; - }; - - //! method to retrieve a parameter from the parameter map (m_params) - const Param getParamRec(const QString name, bool *nameCheckOk = NULL) const; - - //! returns the interface of this instance. \sa AddInInterfaceBase - AddInInterfaceBase* getBasePlugin(void) const; - - //! creates new thread for the class instance and moves this instance to the new thread - ito::RetVal MoveToThread(void); - - //! returns a map with the parameters of this plugin. - /* - Use the method setParam in order to change any parameter. - - \param paramNames [out]. The pointer contains a pointer to the map after the call of this function - \return RetVal returns retOk. - */ - inline const ito::RetVal getParamList(QMap **paramNames) { *paramNames = &m_params; return ito::retOk; } - - //! returns list of registered additional functions - /* - \param [out] funcs is the pointer to a map, that points to the internal map of additional functions after the method-call. - \return retOk - \sa registerExecFunc - */ - inline const ito::RetVal getExecFuncList(QMap **funcs) { *funcs = &m_execFuncList; return ito::retOk; } - - //! retrieve the uniqueID of this instance - int getID() const; - - //! retrieve the unique identifier of this instance - inline QString getIdentifier() const { return m_identifier; } - - //! determine if a configuration dialog is available - virtual int hasConfDialog(void); - - //! open configuration dialog - virtual const ito::RetVal showConfDialog(void); - - //! returns true if this instance has firstly been created by the GUI - int createdByGUI() const; - - //! method to set whether this instance has been firstly created by the GUI (true) or by any other component (Python, C++, other plugin,..) (false) - void setCreatedByGUI(int value); + *paramNames = &m_params; + return ito::retOk; + } + + //! returns list of registered additional functions + /* + \param [out] funcs is the pointer to a map, that points to the internal map of additional functions after the + method-call. \return retOk \sa registerExecFunc + */ + inline const ito::RetVal getExecFuncList(QMap **funcs) + { + *funcs = &m_execFuncList; + return ito::retOk; + } - //! Returns the reference counter of this instance. - /* - The reference counter is zero-based, hence, the value zero means that one reference is pointing to this instance - */ - int getRefCount(void) const; + //! retrieve the uniqueID of this instance + int getID() const; - //! Returns true if this plugin provides a dock widget, that can be shown in the main window. - /* - \sa getDockWidget - */ - bool hasDockWidget(void) const; + //! retrieve the unique identifier of this instance + inline QString getIdentifier() const + { + return m_identifier; + } + + //! determine if a configuration dialog is available + virtual int hasConfDialog(void); + + //! open configuration dialog + virtual const ito::RetVal showConfDialog(void); + + //! returns true if this instance has firstly been created by the GUI + int createdByGUI() const; + + //! method to set whether this instance has been firstly created by the GUI (true) or by any other component + //! (Python, C++, other plugin,..) (false) + void setCreatedByGUI(int value); + + //! Returns the reference counter of this instance. + /* + The reference counter is zero-based, hence, the value zero means that one reference is pointing to this instance + */ + int getRefCount(void) const; + + //! Returns true if this plugin provides a dock widget, that can be shown in the main window. + /* + \sa getDockWidget + */ + bool hasDockWidget(void) const; + + //! Returns the reference to the dock widget of this plugin or NULL, if no dock widget is provided or if it is + //! already deleted. + /* + \sa hasDockWidget + */ + QDockWidget *getDockWidget(void) const; - //! Returns the reference to the dock widget of this plugin or NULL, if no dock widget is provided or if it is already deleted. - /* - \sa hasDockWidget - */ - QDockWidget* getDockWidget(void) const; + // doc in source + virtual void dockWidgetDefaultStyle(bool &floating, bool &visible, Qt::DockWidgetArea &defaultArea) const; - // doc in source - virtual void dockWidgetDefaultStyle(bool &floating, bool &visible, Qt::DockWidgetArea &defaultArea) const; + //! returns the alive-flag of this plugin + /* + Any time-consuming operation of the plugin should regularly set the alive-flag to true + by calling setAlive. The state of this flag is returned by this method and afterwards + reset to 0. This method is thread-safe. - //! returns the alive-flag of this plugin - /* - Any time-consuming operation of the plugin should regularly set the alive-flag to true - by calling setAlive. The state of this flag is returned by this method and afterwards - reset to 0. This method is thread-safe. + \return current status of alive-flag (1 if "still alive", else 0) + \sa setAlive + */ + int isAlive(void); - \return current status of alive-flag (1 if "still alive", else 0) - \sa setAlive - */ - int isAlive(void); + //! sets the alive-flag to 1 ("still alive") + /* + This method is thread-safe. - //! sets the alive-flag to 1 ("still alive") - /* - This method is thread-safe. + \sa isAlive + */ + void setAlive(void); - \sa isAlive - */ - void setAlive(void); + //! returns in a thread-safe way the status of the m_initialized-member variable. This variable should be set to + //! true at the end of the init-method. + bool isInitialized(void) const; - //! returns in a thread-safe way the status of the m_initialized-member variable. This variable should be set to true at the end of the init-method. - bool isInitialized(void) const; + //! sets in a thread-safe way the status of the m_initialized-member + /* + \param [in] initialized is the value to set + */ + void setInitialized(bool initialized); - //! sets in a thread-safe way the status of the m_initialized-member - /* - \param [in] initialized is the value to set - */ - void setInitialized(bool initialized); + //! returns vector of AddInRef instances. + /* + This vector contains all plugin-instances, that have been passed to the init + method of this plugin. The reference counter of these plugin is incremented at + initialization of this plugin and decremented if this plugin will be destroyed. - //! returns vector of AddInRef instances. - /* - This vector contains all plugin-instances, that have been passed to the init - method of this plugin. The reference counter of these plugin is incremented at - initialization of this plugin and decremented if this plugin will be destroyed. + \sa AddInRef, init + */ + QVector *getArgAddIns(void) + { + return &m_hwDecList; + } + + //! returns the user mutex of this plugin, that can be used for user-defined purposes. + /* This mutex has no designed task in the plugin, however it can be used by + the user to for instance protect a sequence of different calls to this plugin. + + This can be important, if the plugin is for instance a communication object, + that is used by different other hardware instances (e.g. a SerialIO to + an arduino, that controls different motors, sensors etc.). Then, it might + be important, that every hardware plugin object, that uses the serialIO + plugin, can protect a setVal / getVal sequence without that any other + plugin instance interrupts its. However, it is the task of the user to + implement that protection. This mutex can only help for this. + */ + QMutex &getUserMutex(); - \sa AddInRef, init - */ - QVector * getArgAddIns(void) { return &m_hwDecList; } + static int getMaximumThreadCount(); - //! returns the user mutex of this plugin, that can be used for user-defined purposes. - /* This mutex has no designed task in the plugin, however it can be used by - the user to for instance protect a sequence of different calls to this plugin. - - This can be important, if the plugin is for instance a communication object, - that is used by different other hardware instances (e.g. a SerialIO to - an arduino, that controls different motors, sensors etc.). Then, it might - be important, that every hardware plugin object, that uses the serialIO - plugin, can protect a setVal / getVal sequence without that any other - plugin instance interrupts its. However, it is the task of the user to - implement that protection. This mutex can only help for this. - */ - QMutex& getUserMutex(); + static RetVal setMaximumThreadCount(int threadCount); - static int getMaximumThreadCount(); - - static RetVal setMaximumThreadCount(int threadCount); + protected: + // constructor (doc in source) + AddInBase(); - protected: - // constructor (doc in source) - AddInBase(); + // destructor (doc in source) + virtual ~AddInBase(); - // destructor (doc in source) - virtual ~AddInBase(); + //! sets the identifier of the plugin. The slot AbstractAddInDockWidget::identifierChanged is invoked if a + //! corresponding dock widget is available. + void setIdentifier(const QString &identifier); - //! sets the identifier of the plugin. The slot AbstractAddInDockWidget::identifierChanged is invoked if a corresponding dock widget is available. - void setIdentifier(const QString &identifier); + // doc in source + void createDockWidget(QString title, QDockWidget::DockWidgetFeatures features, + Qt::DockWidgetAreas allowedAreas = Qt::AllDockWidgetAreas, QWidget *content = NULL); - //doc in source - void createDockWidget(QString title, QDockWidget::DockWidgetFeatures features, Qt::DockWidgetAreas allowedAreas = Qt::AllDockWidgetAreas, QWidget *content = NULL); + // doc in source + ito::RetVal registerExecFunc(const QString funcName, const QVector ¶msMand, + const QVector ¶msOpt, const QVector ¶msOut, + const QString infoString); - // doc in source - ito::RetVal registerExecFunc(const QString funcName, const QVector ¶msMand, const QVector ¶msOpt, const QVector ¶msOut, const QString infoString); + //! sets the interface of this instance to base. \sa AddInInterfaceBase + void setBasePlugin(AddInInterfaceBase *base); - //! sets the interface of this instance to base. \sa AddInInterfaceBase - void setBasePlugin(AddInInterfaceBase *base); + QMap m_params; //!< map of the available parameters - QMap m_params; //!< map of the available parameters - - QString m_identifier; //!< unique identifier (serial number, com-port...) + QString m_identifier; //!< unique identifier (serial number, com-port...) - //! check if we have gui support - inline bool hasGuiSupport() + //! check if we have gui support + inline bool hasGuiSupport() + { + if (qobject_cast(QCoreApplication::instance())) + { + return true; + } + else { - if (qobject_cast(QCoreApplication::instance())) - { - return true; - } - else - { - return false; - } + return false; } + } - private: - Q_DISABLE_COPY(AddInBase) + private: + Q_DISABLE_COPY(AddInBase) - //! increments reference counter of this plugin (thread-safe) - void incRefCount(void); + //! increments reference counter of this plugin (thread-safe) + void incRefCount(void); - //! decrements reference counter of this plugin (thread-safe) - void decRefCount(void); + //! decrements reference counter of this plugin (thread-safe) + void decRefCount(void); - QVector m_hwDecList; //!< list of hardware that was passed to the plugin on initialisation and whose refcounter was incremented - QMap m_execFuncList; //!< map with registered additional functions. funcExec-name -> (default mandParams, default optParams, default outParams, infoString) - - QScopedPointer d_ptr; //!> self-managed pointer to the private class container (deletes itself if d_ptr is destroyed). pointer to private class of AddInBase defined in AddInInterface.cpp. This container is used to allow flexible changes in the interface without destroying the binary compatibility - Q_DECLARE_PRIVATE(AddInBase); + QVector m_hwDecList; //!< list of hardware that was passed to the plugin on + //!< initialisation and whose refcounter was incremented + QMap + m_execFuncList; //!< map with registered additional functions. funcExec-name -> (default mandParams, default + //!< optParams, default outParams, infoString) - friend class AddInInterfaceBase; //!< AddInBase is friend with AddInInterfaceBase, such that the interface can access methods like the protected constructor or destructor of this plugin class. + QScopedPointer + d_ptr; //!> self-managed pointer to the private class container (deletes itself if d_ptr is destroyed). pointer + //!to private class of AddInBase defined in AddInInterface.cpp. This container is used to allow flexible + //!changes in the interface without destroying the binary compatibility + Q_DECLARE_PRIVATE(AddInBase); - static int m_instCounter; - static int maxThreadCount; //!< maximum number of threads algorithms can use e.g. with OpenMP parallelization. This is a number between 1 and QThread::idealThreadCount() + friend class AddInInterfaceBase; //!< AddInBase is friend with AddInInterfaceBase, such that the interface can + //!< access methods like the protected constructor or destructor of this plugin + //!< class. - Q_SIGNALS: - //! This signal usually is emitted if the vector m_params is changed. - /*! - Emit this signal for instance in setParam if the parameter has been changed in order - to inform connected dock-widgets... about the change. This signal is also emitted - if you invoke the slot sendParameterRequest. + static int m_instCounter; + static int maxThreadCount; //!< maximum number of threads algorithms can use e.g. with OpenMP parallelization. This + //!< is a number between 1 and QThread::idealThreadCount() - \param params is the parameter-vector to send (usually m_params) - \sa m_params, sendParameterRequest - */ - void parametersChanged(QMap params); + Q_SIGNALS: + //! This signal usually is emitted if the vector m_params is changed. + /*! + Emit this signal for instance in setParam if the parameter has been changed in order + to inform connected dock-widgets... about the change. This signal is also emitted + if you invoke the slot sendParameterRequest. - public Q_SLOTS: - //! method for the initialisation of a new instance of the class (must be overwritten) - virtual ito::RetVal init(QVector *paramsMand, QVector *paramsOpt, ItomSharedSemaphore *waitCond = NULL) = 0; - //! method for closing an instance (must be overwritten) - virtual ito::RetVal close(ItomSharedSemaphore *waitCond) = 0; + \param params is the parameter-vector to send (usually m_params) + \sa m_params, sendParameterRequest + */ + void parametersChanged(QMap params); + + public Q_SLOTS: + //! method for the initialisation of a new instance of the class (must be overwritten) + virtual ito::RetVal init(QVector *paramsMand, QVector *paramsOpt, + ItomSharedSemaphore *waitCond = NULL) = 0; + //! method for closing an instance (must be overwritten) + virtual ito::RetVal close(ItomSharedSemaphore *waitCond) = 0; + + //! method for the retrieval of a parameter. The actual value is always passed as ito::Param (must be overwritten). + //! See also \ref setParam + virtual ito::RetVal getParam(QSharedPointer val, ItomSharedSemaphore *waitCond = NULL) = 0; + //! method to set a parameter. The actual value is always passed as ito::ParamBase (must be overwritten). See also + //! \ref getParam + virtual ito::RetVal setParam(QSharedPointer val, ItomSharedSemaphore *waitCond = NULL) = 0; + + //! method for setting various parameters (can be used instead of multiple calls to setParam, this can safe multiple + //! invocations) + ito::RetVal setParamVector(const QVector> values, + ItomSharedSemaphore *waitCond = NULL); + + //! method for getting various parameters (can be used instead of multiple calls to getParam, this can safe multiple + //! invocations) + ito::RetVal getParamVector(const QVector> values, ItomSharedSemaphore *waitCond = NULL); + + //! overwrite this function if you registered exec funcs. Once the exec function is called, this method is executed. + virtual ito::RetVal execFunc(const QString funcName, QSharedPointer> paramsMand, + QSharedPointer> paramsOpt, + QSharedPointer> paramsOut, + ItomSharedSemaphore *waitCond = NULL); + + //! method invoked by AddInManager if the plugin should be pulled back to the main thread of itom. (not for direct + //! use in plugins) + ito::RetVal moveBackToApplicationThread(ItomSharedSemaphore *waitCond = NULL); + + //! immediately emits the signal parametersChanged + /*! + call or invoke this method for instance after creating a configuration dialog for the plugin. + Then the dialog gets the current parameter map m_params, if it has been connected to the signal + parametersChanged (must be done before). - //! method for the retrieval of a parameter. The actual value is always passed as ito::Param (must be overwritten). See also \ref setParam - virtual ito::RetVal getParam(QSharedPointer val, ItomSharedSemaphore *waitCond = NULL) = 0; - //! method to set a parameter. The actual value is always passed as ito::ParamBase (must be overwritten). See also \ref getParam - virtual ito::RetVal setParam(QSharedPointer val, ItomSharedSemaphore *waitCond = NULL) = 0; + \sa parametersChanged, m_params + */ + void sendParameterRequest() + { + emit parametersChanged(m_params); + }; - //! method for setting various parameters (can be used instead of multiple calls to setParam, this can safe multiple invocations) - ito::RetVal setParamVector(const QVector > values, ItomSharedSemaphore *waitCond = NULL); + private Q_SLOTS: - //! method for getting various parameters (can be used instead of multiple calls to getParam, this can safe multiple invocations) - ito::RetVal getParamVector(const QVector > values, ItomSharedSemaphore *waitCond = NULL); + //! overwrite this slot if you want to get informed when the dock-widget of the plugin becomes (in)visible + /*! + It is recommended to use this method, in order to connect the widget to signals like parametersChanged, + actuatorStatusChanged or targetChanged (both actuator only) if the dock-widget becomes visible and disconnect + them if it is hidden. This is useful in order to avoid intense function calls if the dock-widget is not + visible. - //! overwrite this function if you registered exec funcs. Once the exec function is called, this method is executed. - virtual ito::RetVal execFunc(const QString funcName, QSharedPointer > paramsMand, QSharedPointer > paramsOpt, QSharedPointer > paramsOut, ItomSharedSemaphore *waitCond = NULL); + \sa parametersChanged + */ + virtual void dockWidgetVisibilityChanged(bool /*visible*/){}; +}; + +//---------------------------------------------------------------------------------------------------------------------------------- +/** @class AddInDataIO + * @brief base class for all dataIO plugin classes + * + * This class is one step further down the line from \ref AddInBase. DataIO plugins must be derived from this class + * which is derived from AddInBase. In this class only the methods specific to dataIO plugins are declared. A dataIO + * device (e.g. a framegrabber / camera) should use this sequence to operate: + * 1. startDevice - device is now ready to acquire data + * 2. acquire - now a data set is freezed and prepared for retrieval + * 3. getVal - method to retrieve the previously freezed data (shallow copy, if you want to work with this data, make + * a deep copy) + * 4. stopDevice - acquisition is stopped, device is no longer ready to record data + * + * the steps 2. and 3. can be repeated until the desired number of "frames" has been read. The device + * should be only started once before the first acquisition of a sequence and stop only at their end. + * The device itself MUST NOT allocate memory for the data to be stored. This HAS TO BE DONE in the main programm + * or in the calling method! + * + * If a live image is listening this device, its source node calls startDeviceAndRegisterListener. If the + * autoGrabbing-flag is enabled, a timer will be started, which triggers the method 'timerEvent' (should be implemented + * by any camera). If this flag is disabled, the live image is registered, but no images will be regularily aquired. In + * this case, only manually taken images will be passed to any registered source node. If the flag is enabled again, the + * timer is restarted and every live image will automatically get new images. This is done by invoking the slot + * 'setSource' of every registered source node. + * + * Every camera will only return shallow copies of its internal image both to the live image and to the user. This + * image can be read by everybody. If the user wants to change values in this image, he should make a deep copy first. + * + */ +class ITOMCOMMONQT_EXPORT AddInDataIO : public AddInBase +{ + Q_OBJECT - //! method invoked by AddInManager if the plugin should be pulled back to the main thread of itom. (not for direct use in plugins) - ito::RetVal moveBackToApplicationThread(ItomSharedSemaphore *waitCond = NULL); + private: + Q_DISABLE_COPY(AddInDataIO) - //! immediately emits the signal parametersChanged - /*! - call or invoke this method for instance after creating a configuration dialog for the plugin. - Then the dialog gets the current parameter map m_params, if it has been connected to the signal - parametersChanged (must be done before). + QScopedPointer + d_ptr; //!> self-managed pointer to the private class container (deletes itself if d_ptr is destroyed) + Q_DECLARE_PRIVATE(AddInDataIO); - \sa parametersChanged, m_params - */ - void sendParameterRequest(){ emit parametersChanged(m_params); }; + protected: + virtual ~AddInDataIO(); + AddInDataIO(); - private Q_SLOTS: + void runStatusChanged(bool deviceStarted); - //! overwrite this slot if you want to get informed when the dock-widget of the plugin becomes (in)visible - /*! - It is recommended to use this method, in order to connect the widget to signals like parametersChanged, - actuatorStatusChanged or targetChanged (both actuator only) if the dock-widget becomes visible and disconnect - them if it is hidden. This is useful in order to avoid intense function calls if the dock-widget is not - visible. + // void timerEvent (QTimerEvent *event) = 0; //implement this event in your plugin, if you are a device, which is + // accessible by any liveImage!!! - \sa parametersChanged - */ - virtual void dockWidgetVisibilityChanged(bool /*visible*/) {}; - }; + QMultiMap + m_autoGrabbingListeners; /*!< MultiMap of listeners (live image source nodes), which want to have updates from + this camera. The String indicates the channel. */ + int m_timerID; /*!< internal ID of the timer, which acquires images for any live view (if allowed) */ + int m_timerIntervalMS; /*!< timer interval (in ms)*/ + bool m_autoGrabbingEnabled; /*!< defines, whether the auto-grabbing timer for any live image can be activated. If + this variable becomes false and any timer is activated, this timer is killed.*/ - //---------------------------------------------------------------------------------------------------------------------------------- - /** @class AddInDataIO - * @brief base class for all dataIO plugin classes - * - * This class is one step further down the line from \ref AddInBase. DataIO plugins must be derived from this class which - * is derived from AddInBase. In this class only the methods specific to dataIO plugins are declared. A dataIO - * device (e.g. a framegrabber / camera) should use this sequence to operate: - * 1. startDevice - device is now ready to acquire data - * 2. acquire - now a data set is freezed and prepared for retrieval - * 3. getVal - method to retrieve the previously freezed data (shallow copy, if you want to work with this data, make a deep copy) - * 4. stopDevice - acquisition is stopped, device is no longer ready to record data - * - * the steps 2. and 3. can be repeated until the desired number of "frames" has been read. The device - * should be only started once before the first acquisition of a sequence and stop only at their end. - * The device itself MUST NOT allocate memory for the data to be stored. This HAS TO BE DONE in the main programm - * or in the calling method! - * - * If a live image is listening this device, its source node calls startDeviceAndRegisterListener. If the autoGrabbing-flag is enabled, - * a timer will be started, which triggers the method 'timerEvent' (should be implemented by any camera). If this flag is disabled, the - * live image is registered, but no images will be regularily aquired. In this case, only manually taken images will be passed to any registered - * source node. If the flag is enabled again, the timer is restarted and every live image will automatically get new images. This is done by - * invoking the slot 'setSource' of every registered source node. - * - * Every camera will only return shallow copies of its internal image both to the live image and to the user. This image can be read by everybody. - * If the user wants to change values in this image, he should make a deep copy first. - * - */ - class ITOMCOMMONQT_EXPORT AddInDataIO : public AddInBase + public: + inline int getAutoGrabbing() { - Q_OBJECT + return m_autoGrabbingEnabled; + } /*!< returns the state of m_autoGrabbingEnabled; consider this method as final */ + + Q_SIGNALS: + + public Q_SLOTS: + //! method to start the device - i.e. get ready to record data + virtual ito::RetVal startDevice(ItomSharedSemaphore *waitCond); + + //! method to stop the device, it is no longer possible to acquire data + virtual ito::RetVal stopDevice(ItomSharedSemaphore *waitCond); + + //! freeze the current data and prepare it for retrieval + virtual ito::RetVal acquire(const int trigger, ItomSharedSemaphore *waitCond = NULL); + + //! stops a continuous acquisition (usually only required by AD/DA converters). This method has not to be + //! implemented in every plugin. New from itom.AddIn.Interface/4.0.0 on + virtual ito::RetVal stop(ItomSharedSemaphore *waitCond = NULL); + + //! read data from the device into a dataObject (which is passed as void pointer actually). Output is a shallow-copy + //! to the grabber internal buffer-object. + virtual ito::RetVal getVal(void *data, ItomSharedSemaphore *waitCond = NULL); + + //! read data from the device into a "raw data pointer" (in this case a char * is passed, pointing to the start of + //! the preallocated memory) + virtual ito::RetVal getVal(QSharedPointer data, QSharedPointer length, + ItomSharedSemaphore *waitCond = NULL); + + //! read data from the device into a dataObject (which is passed as void pointer actually). The map contains + //! dataObjects for different channels. Output is a shallow-copy to the grabber internal buffer-object. + virtual ito::RetVal getVal(QSharedPointer> dataObjMap, + ItomSharedSemaphore *waitCond = NULL); + + virtual ito::RetVal getVal(ItomSharedSemaphore* waitCond = NULL); + //! read data from the device into a dataObject (which is passed as void pointer actually). Output is a deep-copy to + //! the grabber internal object. + virtual ito::RetVal copyVal(void *dObj, ItomSharedSemaphore *waitCond); + + //! write data, e.g. to the DA part of an ADDA card + virtual ito::RetVal setVal(const char *data, const int length, ItomSharedSemaphore *waitCond = NULL); + + //! enables the timer for auto grabbing (live image), if any live image has signed on (usually this method must not + //! be overwritten) + ito::RetVal enableAutoGrabbing(ItomSharedSemaphore *waitCond = NULL); // consider this method as final + + //! disables the timer for auto grabbing (live image) (usually this method must not be overwritten) + ito::RetVal disableAutoGrabbing(ItomSharedSemaphore *waitCond = NULL); // consider this method as final + + //! sets a new interval for the auto-grabbing timer (in ms). If interval <= 0 is passed, nothing is changed, but the + //! current interval is returned. This method does not enable or disable the timer. + ito::RetVal setAutoGrabbingInterval(QSharedPointer interval, + ItomSharedSemaphore *waitCond = NULL); // consider this method as final + + //! starts device and registers obj as listener (live image). This listener must have a slot void + //! setSource(QSharedPointer, ItomSaredSemaphore). + ito::RetVal startDeviceAndRegisterListener(QObject *obj, + ItomSharedSemaphore *waitCond = NULL); // consider this method as final + + //! stops device and unregisters obj (live image). + ito::RetVal stopDeviceAndUnregisterListener(QObject *obj, + ItomSharedSemaphore *waitCond = NULL); // consider this method as final +}; + +//---------------------------------------------------------------------------------------------------------------------------------- + +/** @class AddInActuator + * @brief base class for all actuator plugin classes + * + * This class is one step further down the line from \ref AddInBase. Actuator plugins must be derived from this class + * which is derived from AddInBase. In this class only the methods specific to actuator plugins are declared. + */ +class ITOMCOMMONQT_EXPORT AddInActuator : public AddInBase +{ + Q_OBJECT + + private: + Q_DISABLE_COPY(AddInActuator) + + QScopedPointer + d_ptr; //!> self-managed pointer to the private class container (deletes itself if d_ptr is destroyed) + Q_DECLARE_PRIVATE(AddInActuator); + + protected: + virtual ~AddInActuator(); + AddInActuator(); + + QVector m_currentStatus; /*!< vector (same length than number of axes) containing the status of every axis. The + status is a combination of enumeration ito::tActuatorStatus. */ + QVector m_currentPos; /*!< vector (same length than number of axes) containing the current position (mm or + degree) of every axis. The current position should be updated with a reasonable + frequency (depending on the actuator and situation)*/ + QVector m_targetPos; /*!< vector (same length than number of axes) containing the target position (mm or + degree) of every axis */ + + //! checks whether any axis is still moving (moving flag is set) + bool isMotorMoving() const; + + void sendStatusUpdate( + const bool statusOnly = + false); /* emits actuatorStatusChanged signal with the vector of currentStatus (and currentPos if statusOnly + = false) to notify connected listeners about the current status (and position)*/ + void sendTargetUpdate(); /* emits targetChanged with the vector of targetPositions to notify connected listeners + about the change of the target position(s) */ + + //! this method must be overwritten. + /*! + WaitForDone should wait for a moving motor until the indicated axes (or all axes of nothing is indicated) have + stopped or a timeout or user interruption occurred. The timeout can be given in milliseconds, or -1 if no timeout + should be considered. The flag-parameter can be used for your own purpose. + */ + virtual ito::RetVal waitForDone(const int timeoutMS = -1, + const QVector axis = QVector() /*if empty -> all axis*/, + const int flags = 0 /*for your use*/) = 0; - private: - Q_DISABLE_COPY(AddInDataIO) + //! sets status flags of given status variable + /*! + Use this small inline method in order to set the status of given status variable. The status is an OR-combination of + the enumeration ito::tActuatorStatus. You can assign a mask (keepMask). Bits whithin this mask will be unchanged. - QScopedPointer d_ptr; //!> self-managed pointer to the private class container (deletes itself if d_ptr is destroyed) - Q_DECLARE_PRIVATE(AddInDataIO); + \param [in,out] status is the status variable which is changed. + \param [in] newFlags is an OR-combination of ito::tActuatorStatus which is assigned to status. + \param [in] keepMask is a mask whose bits are not deleted if they are not contained in newFlags. - protected: - virtual ~AddInDataIO(); - AddInDataIO(); + \sa tActuatorStatus + */ + void setStatus(int &status, const int newFlags, const int keepMask = 0); - void runStatusChanged(bool deviceStarted); + //! sets status flags of the status of the given axes + /*! + This method calls setStatus for the status of every given axis-number. The status is directly changed in the member + variable m_currentStatus. For further information see the description of method setStatus (for one single status + variable) - //void timerEvent (QTimerEvent *event) = 0; //implement this event in your plugin, if you are a device, which is accessible by any liveImage!!! + \param [in] axis is the vector with axis-numbers. + \param [in] newFlags is an OR-combination of ito::tActuatorStatus which is assigned to status. + \param [in] keepMask is a mask whose bits are not deleted if they are not contained in newFlags. - QMultiMap m_autoGrabbingListeners; /*!< MultiMap of listeners (live image source nodes), which want to have updates from this camera. The String indicates the channel. */ - int m_timerID; /*!< internal ID of the timer, which acquires images for any live view (if allowed) */ - int m_timerIntervalMS; /*!< timer interval (in ms)*/ - bool m_autoGrabbingEnabled; /*!< defines, whether the auto-grabbing timer for any live image can be activated. If this variable becomes false and any timer is activated, this timer is killed.*/ + \sa setStatus + */ + void setStatus(const QVector &axis, const int newFlags, const int keepMask = 0); - public: - inline int getAutoGrabbing() { return m_autoGrabbingEnabled; } /*!< returns the state of m_autoGrabbingEnabled; consider this method as final */ + //! changes the status bit of the given status value from one existing to a new value. + /*! + If the given existingFlag bitmask of the status-value is set, it is completely replaced by the flags set by + replaceFlag. - Q_SIGNALS: + \param [in,out] status is the status variable which is changed. + \param [in] existingFlag is the bitmask which must be set and is replace by replaceFlag + \param [in] replaceFlag is the bitmask which is used for the replacement. - public Q_SLOTS: - //! method to start the device - i.e. get ready to record data - virtual ito::RetVal startDevice(ItomSharedSemaphore *waitCond); + \sa tActuatorStatus + */ + void replaceStatus(int &status, const int existingFlag, const int replaceFlag); - //! method to stop the device, it is no longer possible to acquire data - virtual ito::RetVal stopDevice(ItomSharedSemaphore *waitCond); + //! changes the status flags of the status of the given axes from one existing to a new value + /*! + This method calls replaceStatus for the status of every given axis-number. The status is directly changed in the + member variable m_currentStatus. For further information see the description of method replaceStatus (for one single + status variable) - //! freeze the current data and prepare it for retrieval - virtual ito::RetVal acquire(const int trigger, ItomSharedSemaphore *waitCond = NULL); + \param [in] axis is the vector with axis-numbers. + \param [in] existingFlag is the bitmask which must be set and is replace by replaceFlag + \param [in] replaceFlag is the bitmask which is used for the replacement. - //! stops a continuous acquisition (usually only required by AD/DA converters). This method has not to be implemented in every plugin. New from itom.AddIn.Interface/4.0.0 on - virtual ito::RetVal stop(ItomSharedSemaphore *waitCond = NULL); + \sa replaceStatus + */ + void replaceStatus(const QVector &axis, const int existingFlag, const int replaceFlag); - //! read data from the device into a dataObject (which is passed as void pointer actually). Output is a shallow-copy to the grabber internal buffer-object. - virtual ito::RetVal getVal(void* data, ItomSharedSemaphore *waitCond = NULL); + //! initializes the current status, current position and target position vectors to the same size and the given + //! start values + /*! + If sendUpdateSignals is true, the signals targetChanged and actuatorStatusChanged are emitted with the new size and + content. In any case, the last signalled states are set to these initial values, too. + */ + void initStatusAndPositions(int numAxes, int status, double currentPosition = 0.0, double targetPosition = 0.0, + bool sendUpdateSignals = true); - //! read data from the device into a "raw data pointer" (in this case a char * is passed, pointing to the start of the preallocated memory) - virtual ito::RetVal getVal(QSharedPointer data, QSharedPointer length, ItomSharedSemaphore *waitCond = NULL); + //! returns interrupt flag (thread-safe) + /*! + This methods returns true if the interrupt flag has been set using setInterrupt. Once this method is called, the + interrupt flag is reset. - //! read data from the device into a dataObject (which is passed as void pointer actually). Output is a deep-copy to the grabber internal object. - virtual ito::RetVal copyVal(void *dObj, ItomSharedSemaphore *waitCond); + \return true if interrupt flag has been set, else false. + \sa setInterrupt + */ + bool isInterrupted(); - //! write data, e.g. to the DA part of an ADDA card - virtual ito::RetVal setVal(const char *data, const int length, ItomSharedSemaphore *waitCond = NULL); + public: + //! set interrupt flag (thread-safe) + /*! + call this method (even direct call from different thread is possible) if you want to set the interrupt flag in order + to stop a moving actuator. This flag has to be continously be checked in waitForDone using the method isInterrupted, + since this method only sets the flag without initiating further actions. + + \sa waitForDone, isInterrupted + */ + void setInterrupt(); - //! enables the timer for auto grabbing (live image), if any live image has signed on (usually this method must not be overwritten) - ito::RetVal enableAutoGrabbing(ItomSharedSemaphore *waitCond = NULL); //consider this method as final + //! resets the interrupt flag (thread-safe) + /*! + call this method (even direct call from different thread is possible) if you want to reset the interrupt flag. + This method is called if setOrigin, setPosAbs or setPosRel is called from Python since the interrupt flag can be set + if a Python script is interrupted (depending on itom property). + */ + void resetInterrupt(); - //! disables the timer for auto grabbing (live image) (usually this method must not be overwritten) - ito::RetVal disableAutoGrabbing(ItomSharedSemaphore *waitCond = NULL); //consider this method as final + //! put the latest signalled states (current status, position and target position) to the given arguments. + /*! + "last signalled" signifies that whenever the signal targetChanged or actuatorStatusChanged is emitted, + the current value of these states is stored and can be obtained by this method. - //! sets a new interval for the auto-grabbing timer (in ms). If interval <= 0 is passed, nothing is changed, but the current interval is returned. This method does not enable or disable the timer. - ito::RetVal setAutoGrabbingInterval(QSharedPointer interval, ItomSharedSemaphore *waitCond = NULL); //consider this method as final + The call to this method is thread-safe. - //! starts device and registers obj as listener (live image). This listener must have a slot void setSource(QSharedPointer, ItomSaredSemaphore). - ito::RetVal startDeviceAndRegisterListener(QObject* obj, ItomSharedSemaphore *waitCond = NULL); //consider this method as final + \return ito::retOk if all states could be read, ito::retError if no status or position value has been reported up to + now. + */ + ito::RetVal getLastSignalledStates(QVector &status, QVector ¤tPos, QVector &targetPos); - //! stops device and unregisters obj (live image). - ito::RetVal stopDeviceAndUnregisterListener(QObject* obj, ItomSharedSemaphore *waitCond = NULL); //consider this method as final - }; + Q_SIGNALS: + //! signal emitted if status or actual position of any axis has been changed. + /*! + Usually this signal can be sent using the method sendStatusUpdate(...). This method firstly checks if any slot has + been connected to this signal and only fires the signal of at least one slot is connected (e.g. any docking-widget). + + Usually the status and positions are taken from the member variables m_currentStatus and m_currentPos. + + \params status is a vector with the length of the number of axis and each value contains a OR-combination of + ito::tActuatorStatus \params actPosition is a vector with the length of the number of axis containing the actual + axis positions, or length 0, if no actual positions are sended. + */ + void actuatorStatusChanged(QVector status, QVector actPosition); + + //! signal emitted if target position of any axis has changed. + /*! + Usually this signal can be sent using the method sendTargetUpdate(). This method firstly checks if any slot has been + connected to this signal and only fires the signal of at least one slot is connected (e.g. any docking-widget). - //---------------------------------------------------------------------------------------------------------------------------------- + Usually the target is taken from the member variable m_targetPos. - /** @class AddInActuator - * @brief base class for all actuator plugin classes - * - * This class is one step further down the line from \ref AddInBase. Actuator plugins must be derived from this class which - * is derived from AddInBase. In this class only the methods specific to actuator plugins are declared. + \params targetPositions is a vector with the length of the number of axis containing the desired target positions + for ALL axis. */ - class ITOMCOMMONQT_EXPORT AddInActuator : public AddInBase + void targetChanged(QVector targetPositions); + + public Q_SLOTS: + //! method to calibrate a single axis + virtual ito::RetVal calib(const int axis, ItomSharedSemaphore *waitCond = NULL) = 0; + //! method to calibrate a number of axis. The axis' numbers are given in the axis vector + virtual ito::RetVal calib(const QVector axis, ItomSharedSemaphore *waitCond = NULL) = 0; + //! method to set the origin of one axis to the current position + virtual ito::RetVal setOrigin(const int axis, ItomSharedSemaphore *waitCond = NULL) = 0; + //! method to set the origin of a number of axis to their current positions. The axis' numbers are given in the axis + //! vector + virtual ito::RetVal setOrigin(const QVector axis, ItomSharedSemaphore *waitCond = NULL) = 0; + //! retrieve the status of the actuator + virtual ito::RetVal getStatus(QSharedPointer> status, ItomSharedSemaphore *waitCond) = 0; + //! retrieve the status of one axis of the actuator. By default, this method uses the general implementation of + //! getStatus and returns the requested axis only. + virtual ito::RetVal getStatus(const int axis, QSharedPointer status, ItomSharedSemaphore *waitCond); + //! read the position of one axis + virtual ito::RetVal getPos(const int axis, QSharedPointer pos, ItomSharedSemaphore *waitCond) = 0; + //! read the position of a number of axis. The axis' numbers are given in the axis vector + virtual ito::RetVal getPos(const QVector axis, QSharedPointer> pos, + ItomSharedSemaphore *waitCond) = 0; + //! move a single axis to a new absolute position + virtual ito::RetVal setPosAbs(const int axis, const double pos, ItomSharedSemaphore *waitCond = NULL) = 0; + //! move a number of axis to a new absolute position. The axis' numbers are given in the axis vector + virtual ito::RetVal setPosAbs(const QVector axis, QVector pos, + ItomSharedSemaphore *waitCond = NULL) = 0; + //! increment/decrement a single axis by position value + virtual ito::RetVal setPosRel(const int axis, const double pos, ItomSharedSemaphore *waitCond = NULL) = 0; + //! increment/decrement a number of axis by position values. The axis' numbers are given in the axis vector + virtual ito::RetVal setPosRel(const QVector axis, QVector pos, + ItomSharedSemaphore *waitCond = NULL) = 0; + + //! overload this function to update the current status and position values, followed by calling sendStatusUpdate + //! and/or sendTargetUpdate + virtual ito::RetVal requestStatusAndPosition(bool sendCurrentPos, bool sendTargetPos); +}; + +//---------------------------------------------------------------------------------------------------------------------------------- +/** @class AddInAlgo + * @brief base class for all "algorithm" plugin classes + * + * This class is one step further down the line from \ref AddInBase. "Algorithm" plugins must be derived from this + * class which is derived from AddInBase. Compared to \ref AddInDataIO and \ref AddInActuator the AddInAlgo class is + * fairly simple. It does not have an init function or a close function. In the algo base class at the moment no further + * methods or variables are declared - it serves more as an organisation class, putting all actual plugins to the same + * level of inheritance. + */ +class ITOMCOMMONQT_EXPORT AddInAlgo : public AddInBase +{ + Q_OBJECT + + private: + Q_DISABLE_COPY(AddInAlgo) + + QScopedPointer + d_ptr; //!> self-managed pointer to the private class container (deletes itself if d_ptr is destroyed) + Q_DECLARE_PRIVATE(AddInAlgo); + + public: + typedef ito::RetVal (*t_filter)(QVector *paramsMand, QVector *paramsOpt, + QVector *paramsOut); + typedef ito::RetVal (*t_filterExt)(QVector *paramsMand, QVector *paramsOpt, + QVector *paramsOut, + QSharedPointer observer); + typedef QWidget *(*t_algoWidget)(QVector *paramsMand, QVector *paramsOpt, + ito::RetVal &retValue); + typedef ito::RetVal (*t_filterParam)(QVector *paramsMand, QVector *paramsOpt, + QVector *paramsOut); + + //!< possible categories for filter or widget-methods + enum tAlgoCategory { - Q_OBJECT - - private: - Q_DISABLE_COPY(AddInActuator) - - QScopedPointer d_ptr; //!> self-managed pointer to the private class container (deletes itself if d_ptr is destroyed) - Q_DECLARE_PRIVATE(AddInActuator); - - protected: - virtual ~AddInActuator(); - AddInActuator(); - - QVector m_currentStatus; /*!< vector (same length than number of axes) containing the status of every axis. The status is a combination of enumeration ito::tActuatorStatus. */ - QVector m_currentPos; /*!< vector (same length than number of axes) containing the current position (mm or degree) of every axis. The current position should be updated with a reasonable frequency (depending on the actuator and situation)*/ - QVector m_targetPos; /*!< vector (same length than number of axes) containing the target position (mm or degree) of every axis */ - - //! checks whether any axis is still moving (moving flag is set) - bool isMotorMoving() const; - - void sendStatusUpdate(const bool statusOnly = false); /* emits actuatorStatusChanged signal with the vector of currentStatus (and currentPos if statusOnly = false) to notify connected listeners about the current status (and position)*/ - void sendTargetUpdate(); /* emits targetChanged with the vector of targetPositions to notify connected listeners about the change of the target position(s) */ - - //! this method must be overwritten. - /*! - WaitForDone should wait for a moving motor until the indicated axes (or all axes of nothing is indicated) have stopped or a timeout or user interruption - occurred. The timeout can be given in milliseconds, or -1 if no timeout should be considered. The flag-parameter can be used for your own purpose. - */ - virtual ito::RetVal waitForDone(const int timeoutMS = -1, const QVector axis = QVector() /*if empty -> all axis*/, const int flags = 0 /*for your use*/) = 0; - - //! sets status flags of given status variable - /*! - Use this small inline method in order to set the status of given status variable. The status is an OR-combination of the enumeration ito::tActuatorStatus. - You can assign a mask (keepMask). Bits whithin this mask will be unchanged. - - \param [in,out] status is the status variable which is changed. - \param [in] newFlags is an OR-combination of ito::tActuatorStatus which is assigned to status. - \param [in] keepMask is a mask whose bits are not deleted if they are not contained in newFlags. - - \sa tActuatorStatus - */ - void setStatus(int &status, const int newFlags, const int keepMask = 0); - - //! sets status flags of the status of the given axes - /*! - This method calls setStatus for the status of every given axis-number. The status is directly changed in the member variable m_currentStatus. - For further information see the description of method setStatus (for one single status variable) - - \param [in] axis is the vector with axis-numbers. - \param [in] newFlags is an OR-combination of ito::tActuatorStatus which is assigned to status. - \param [in] keepMask is a mask whose bits are not deleted if they are not contained in newFlags. - - \sa setStatus - */ - void setStatus(const QVector &axis, const int newFlags, const int keepMask = 0); - - //! changes the status bit of the given status value from one existing to a new value. - /*! - If the given existingFlag bitmask of the status-value is set, it is completely replaced by the flags set by replaceFlag. - - \param [in,out] status is the status variable which is changed. - \param [in] existingFlag is the bitmask which must be set and is replace by replaceFlag - \param [in] replaceFlag is the bitmask which is used for the replacement. - - \sa tActuatorStatus - */ - void replaceStatus(int &status, const int existingFlag, const int replaceFlag); - - //! changes the status flags of the status of the given axes from one existing to a new value - /*! - This method calls replaceStatus for the status of every given axis-number. The status is directly changed in the member variable m_currentStatus. - For further information see the description of method replaceStatus (for one single status variable) - - \param [in] axis is the vector with axis-numbers. - \param [in] existingFlag is the bitmask which must be set and is replace by replaceFlag - \param [in] replaceFlag is the bitmask which is used for the replacement. - - \sa replaceStatus - */ - void replaceStatus(const QVector &axis, const int existingFlag, const int replaceFlag); - - //! initializes the current status, current position and target position vectors to the same size and the given start values - /*! - If sendUpdateSignals is true, the signals targetChanged and actuatorStatusChanged are emitted with the new size and content. - In any case, the last signalled states are set to these initial values, too. - */ - void initStatusAndPositions(int numAxes, int status, double currentPosition = 0.0, double targetPosition = 0.0, bool sendUpdateSignals = true); - - //! returns interrupt flag (thread-safe) - /*! - This methods returns true if the interrupt flag has been set using setInterrupt. Once this method is called, the interrupt flag is reset. - - \return true if interrupt flag has been set, else false. - \sa setInterrupt - */ - bool isInterrupted(); - - public: - //! set interrupt flag (thread-safe) - /*! - call this method (even direct call from different thread is possible) if you want to set the interrupt flag in order to stop a moving actuator. - This flag has to be continously be checked in waitForDone using the method isInterrupted, since this method only sets the flag without initiating - further actions. - - \sa waitForDone, isInterrupted - */ - void setInterrupt(); - - //! resets the interrupt flag (thread-safe) - /*! - call this method (even direct call from different thread is possible) if you want to reset the interrupt flag. - This method is called if setOrigin, setPosAbs or setPosRel is called from Python since the interrupt flag can be set if a Python - script is interrupted (depending on itom property). - */ - void resetInterrupt(); - - //! put the latest signalled states (current status, position and target position) to the given arguments. - /*! - "last signalled" signifies that whenever the signal targetChanged or actuatorStatusChanged is emitted, - the current value of these states is stored and can be obtained by this method. - - The call to this method is thread-safe. - - \return ito::retOk if all states could be read, ito::retError if no status or position value has been reported up to now. - */ - ito::RetVal getLastSignalledStates(QVector &status, QVector ¤tPos, QVector &targetPos); - - Q_SIGNALS: - //! signal emitted if status or actual position of any axis has been changed. - /*! - Usually this signal can be sent using the method sendStatusUpdate(...). This method firstly checks if any slot has been connected to this signal - and only fires the signal of at least one slot is connected (e.g. any docking-widget). - - Usually the status and positions are taken from the member variables m_currentStatus and m_currentPos. - - \params status is a vector with the length of the number of axis and each value contains a OR-combination of ito::tActuatorStatus - \params actPosition is a vector with the length of the number of axis containing the actual axis positions, or length 0, if no actual positions are sended. - */ - void actuatorStatusChanged(QVector status, QVector actPosition); - - //! signal emitted if target position of any axis has changed. - /*! - Usually this signal can be sent using the method sendTargetUpdate(). This method firstly checks if any slot has been connected to this signal - and only fires the signal of at least one slot is connected (e.g. any docking-widget). - - Usually the target is taken from the member variable m_targetPos. - - \params targetPositions is a vector with the length of the number of axis containing the desired target positions for ALL axis. - */ - void targetChanged(QVector targetPositions); - - public Q_SLOTS: - //! method to calibrate a single axis - virtual ito::RetVal calib(const int axis, ItomSharedSemaphore *waitCond = NULL) = 0; - //! method to calibrate a number of axis. The axis' numbers are given in the axis vector - virtual ito::RetVal calib(const QVector axis, ItomSharedSemaphore *waitCond = NULL) = 0; - //! method to set the origin of one axis to the current position - virtual ito::RetVal setOrigin(const int axis, ItomSharedSemaphore *waitCond = NULL) = 0; - //! method to set the origin of a number of axis to their current positions. The axis' numbers are given in the axis vector - virtual ito::RetVal setOrigin(const QVector axis, ItomSharedSemaphore *waitCond = NULL) = 0; - //! retrieve the status of the actuator - virtual ito::RetVal getStatus(QSharedPointer > status, ItomSharedSemaphore *waitCond) = 0; - //! retrieve the status of one axis of the actuator. By default, this method uses the general implementation of getStatus and returns the requested axis only. - virtual ito::RetVal getStatus(const int axis, QSharedPointer status, ItomSharedSemaphore *waitCond); - //! read the position of one axis - virtual ito::RetVal getPos(const int axis, QSharedPointer pos, ItomSharedSemaphore *waitCond) = 0; - //! read the position of a number of axis. The axis' numbers are given in the axis vector - virtual ito::RetVal getPos(const QVector axis, QSharedPointer > pos, ItomSharedSemaphore *waitCond) = 0; - //! move a single axis to a new absolute position - virtual ito::RetVal setPosAbs(const int axis, const double pos, ItomSharedSemaphore *waitCond = NULL) = 0; - //! move a number of axis to a new absolute position. The axis' numbers are given in the axis vector - virtual ito::RetVal setPosAbs(const QVector axis, QVector pos, ItomSharedSemaphore *waitCond = NULL) = 0; - //! increment/decrement a single axis by position value - virtual ito::RetVal setPosRel(const int axis, const double pos, ItomSharedSemaphore *waitCond = NULL) = 0; - //! increment/decrement a number of axis by position values. The axis' numbers are given in the axis vector - virtual ito::RetVal setPosRel(const QVector axis, QVector pos, ItomSharedSemaphore *waitCond = NULL) = 0; - - //! overload this function to update the current status and position values, followed by calling sendStatusUpdate and/or sendTargetUpdate - virtual ito::RetVal requestStatusAndPosition(bool sendCurrentPos, bool sendTargetPos); + catNone = 0x0000, //!< default: no category + catDiskIO = 0x0001, //!< category for saving or loading data from hard drive + catAnalyseDataObject = 0x0002, //!< category for methods analysing data objects + catPlotDataObject = 0x0004 //!< category for methods plotting data objects }; - //---------------------------------------------------------------------------------------------------------------------------------- - /** @class AddInAlgo - * @brief base class for all "algorithm" plugin classes - * - * This class is one step further down the line from \ref AddInBase. "Algorithm" plugins must be derived from this class which - * is derived from AddInBase. Compared to \ref AddInDataIO and \ref AddInActuator the AddInAlgo class is fairly simple. It does - * not have an init function or a close function. In the algo base class at the moment no further methods or variables are declared - - * it serves more as an organisation class, putting all actual plugins to the same level of inheritance. - */ - class ITOMCOMMONQT_EXPORT AddInAlgo : public AddInBase + //!< possible algorithm interfaces + enum tAlgoInterface { - Q_OBJECT + iNotSpecified = 0x0000, //!< default: filter or widget does not fit to any interface + iReadDataObject = 0x0001, //!< interface for loading content of files into a data object + iWriteDataObject = 0x0002, //!< interface for saving data object to file + iReadPointCloud = 0x0004, //!< interface for loading content of files into a point cloud + iWritePointCloud = 0x0008, //!< interface for saving point cloud to file + iReadPolygonMesh = 0x0010, //!< interface for loading content of files into a polygon mesh + iWritePolygonMesh = 0x0020, //!< interface for saving polygon mesh to file + iPlotSingleObject = 0x0040 //!< interface for ploting dataObjects via the GUI + }; - private: - Q_DISABLE_COPY(AddInAlgo) + // Q_ENUM exposes a meta object to the enumeration types, such that the key names for the enumeration + // values are always accessible. + Q_ENUM(tAlgoCategory) + Q_ENUM(tAlgoInterface) - QScopedPointer d_ptr; //!> self-managed pointer to the private class container (deletes itself if d_ptr is destroyed) - Q_DECLARE_PRIVATE(AddInAlgo); + //! container for publishing filters provided by any plugin + class FilterDef + { + public: + //!< empty, default constructor + FilterDef() + : m_filterFunc(NULL), m_paramFunc(NULL), m_pBasePlugin(NULL), m_category(ito::AddInAlgo::catNone), + m_interface(ito::AddInAlgo::iNotSpecified) + { + } - public: - typedef ito::RetVal (*t_filter) (QVector *paramsMand, QVector *paramsOpt, QVector *paramsOut); - typedef ito::RetVal (*t_filterExt) (QVector *paramsMand, QVector *paramsOpt, QVector *paramsOut, QSharedPointer observer); - typedef QWidget* (*t_algoWidget) (QVector *paramsMand, QVector *paramsOpt, ito::RetVal &retValue); - typedef ito::RetVal (*t_filterParam)(QVector *paramsMand, QVector *paramsOpt, QVector *paramsOut); + //!< constructor with all necessary arguments. + FilterDef(AddInAlgo::t_filter filterFunc, AddInAlgo::t_filterParam filterParamFunc, + QString description = QString(), ito::AddInAlgo::tAlgoCategory category = ito::AddInAlgo::catNone, + ito::AddInAlgo::tAlgoInterface interf = ito::AddInAlgo::iNotSpecified, + QString interfaceMeta = QString()) + : m_filterFunc(filterFunc), m_paramFunc(filterParamFunc), m_pBasePlugin(NULL), m_description(description), + m_category(category), m_interface(interf), m_interfaceMeta(interfaceMeta) + { + } - //!< possible categories for filter or widget-methods - enum tAlgoCategory + virtual ~FilterDef() { - catNone = 0x0000, //!< default: no category - catDiskIO = 0x0001, //!< category for saving or loading data from hard drive - catAnalyseDataObject = 0x0002, //!< category for methods analysing data objects - catPlotDataObject = 0x0004 //!< category for methods plotting data objects - }; - - //!< possible algorithm interfaces - enum tAlgoInterface + } + + t_filter m_filterFunc; //!< function pointer (unbounded, static) for filter-method + t_filterParam m_paramFunc; //!< function pointer (unbounded, static) for filter's default parameter method + ito::AddInInterfaceBase + *m_pBasePlugin; //!< interface (factory) instance of this plugin (will be automatically filled) + QString m_name; //!< name of filter + QString m_description; //!< description of filter + ito::AddInAlgo::tAlgoCategory m_category; //!< category, filter belongs to (default: catNone) + ito::AddInAlgo::tAlgoInterface m_interface; //!< algorithm interface, filter fits to (default: iNotSpecified) + QString m_interfaceMeta; //!< meta information if required by algorithm interface + private: + FilterDef(const FilterDef & /*p*/); // disable copy constructor + }; + + //! extended FilterDef (derived from FilterDef) with a filterFunc of type f_filterExt instead of t_filter. This + //! method has an additional argument of type FunctionCancellationAndObserver + class FilterDefExt : public FilterDef + { + public: + //!< empty, default constructor + FilterDefExt() : FilterDef(), m_filterFuncExt(NULL) { - iNotSpecified = 0x0000, //!< default: filter or widget does not fit to any interface - iReadDataObject = 0x0001, //!< interface for loading content of files into a data object - iWriteDataObject = 0x0002, //!< interface for saving data object to file - iReadPointCloud = 0x0004, //!< interface for loading content of files into a point cloud - iWritePointCloud = 0x0008, //!< interface for saving point cloud to file - iReadPolygonMesh = 0x0010, //!< interface for loading content of files into a polygon mesh - iWritePolygonMesh = 0x0020, //!< interface for saving polygon mesh to file - iPlotSingleObject = 0x0040 //!< interface for ploting dataObjects via the GUI - }; - - //Q_ENUM exposes a meta object to the enumeration types, such that the key names for the enumeration - //values are always accessible. - Q_ENUM(tAlgoCategory) - Q_ENUM(tAlgoInterface) - - //! container for publishing filters provided by any plugin - class FilterDef + } + + //!< constructor with all necessary arguments. + FilterDefExt(AddInAlgo::t_filterExt filterFuncExt, AddInAlgo::t_filterParam filterParamFunc, + QString description = QString(), ito::AddInAlgo::tAlgoCategory category = ito::AddInAlgo::catNone, + ito::AddInAlgo::tAlgoInterface interf = ito::AddInAlgo::iNotSpecified, + QString interfaceMeta = QString(), bool hasStatusInfo = true, bool isCancellable = true) + : FilterDef(NULL, filterParamFunc, description, category, interf, interfaceMeta), + m_filterFuncExt(filterFuncExt), m_hasStatusInformation(hasStatusInfo), m_isCancellable(isCancellable) { - public: - //!< empty, default constructor - FilterDef() : - m_filterFunc(NULL), - m_paramFunc(NULL), - m_pBasePlugin(NULL), - m_category(ito::AddInAlgo::catNone), - m_interface(ito::AddInAlgo::iNotSpecified) - {} - - //!< constructor with all necessary arguments. - FilterDef(AddInAlgo::t_filter filterFunc, AddInAlgo::t_filterParam filterParamFunc, - QString description = QString(), ito::AddInAlgo::tAlgoCategory category = ito::AddInAlgo::catNone, - ito::AddInAlgo::tAlgoInterface interf = ito::AddInAlgo::iNotSpecified, - QString interfaceMeta = QString()) : - m_filterFunc(filterFunc), - m_paramFunc(filterParamFunc), - m_pBasePlugin(NULL), - m_description(description), - m_category(category), - m_interface(interf), - m_interfaceMeta(interfaceMeta) - {} - - virtual ~FilterDef() {} - - t_filter m_filterFunc; //!< function pointer (unbounded, static) for filter-method - t_filterParam m_paramFunc; //!< function pointer (unbounded, static) for filter's default parameter method - ito::AddInInterfaceBase *m_pBasePlugin; //!< interface (factory) instance of this plugin (will be automatically filled) - QString m_name; //!< name of filter - QString m_description; //!< description of filter - ito::AddInAlgo::tAlgoCategory m_category; //!< category, filter belongs to (default: catNone) - ito::AddInAlgo::tAlgoInterface m_interface; //!< algorithm interface, filter fits to (default: iNotSpecified) - QString m_interfaceMeta; //!< meta information if required by algorithm interface - private: - FilterDef(const FilterDef & /*p*/); //disable copy constructor - }; - - //! extended FilterDef (derived from FilterDef) with a filterFunc of type f_filterExt instead of t_filter. This method has an additional argument of type FunctionCancellationAndObserver - class FilterDefExt : public FilterDef + } + + virtual ~FilterDefExt() { - public: - //!< empty, default constructor - FilterDefExt() : - FilterDef(), - m_filterFuncExt(NULL) - {} - - //!< constructor with all necessary arguments. - FilterDefExt(AddInAlgo::t_filterExt filterFuncExt, AddInAlgo::t_filterParam filterParamFunc, - QString description = QString(), ito::AddInAlgo::tAlgoCategory category = ito::AddInAlgo::catNone, - ito::AddInAlgo::tAlgoInterface interf = ito::AddInAlgo::iNotSpecified, - QString interfaceMeta = QString(), bool hasStatusInfo = true, bool isCancellable = true) : - FilterDef(NULL, filterParamFunc, description, category, interf, interfaceMeta), - m_filterFuncExt(filterFuncExt), - m_hasStatusInformation(hasStatusInfo), - m_isCancellable(isCancellable) - {} - - virtual ~FilterDefExt() {} - - t_filterExt m_filterFuncExt; //!< extended function pointer (unbounded, static) for filter-method - bool m_hasStatusInformation; //!< true, if filter updates status information to the optional observer - bool m_isCancellable; //!< true, if filter listens to a possible interrupt flag in the optional observer and cancels the execution if set - - private: - FilterDefExt(const FilterDefExt & /*p*/); //disable copy constructor - }; - - //! container for publishing widgets provided by any plugin - class AlgoWidgetDef + } + + t_filterExt m_filterFuncExt; //!< extended function pointer (unbounded, static) for filter-method + bool m_hasStatusInformation; //!< true, if filter updates status information to the optional observer + bool m_isCancellable; //!< true, if filter listens to a possible interrupt flag in the optional observer and + //!< cancels the execution if set + + private: + FilterDefExt(const FilterDefExt & /*p*/); // disable copy constructor + }; + + //! container for publishing widgets provided by any plugin + class AlgoWidgetDef + { + public: + //!< empty, default constructor + AlgoWidgetDef() + : m_widgetFunc(NULL), m_paramFunc(NULL), m_pBasePlugin(NULL), m_category(ito::AddInAlgo::catNone), + m_interface(ito::AddInAlgo::iNotSpecified) { - public: - //!< empty, default constructor - AlgoWidgetDef() : - m_widgetFunc(NULL), - m_paramFunc(NULL), - m_pBasePlugin(NULL), - m_category(ito::AddInAlgo::catNone), - m_interface(ito::AddInAlgo::iNotSpecified) - {} - - //!< constructor with all necessary arguments. - AlgoWidgetDef(AddInAlgo::t_algoWidget algoWidgetFunc, AddInAlgo::t_filterParam algoWidgetParamFunc, QString description = QString(), ito::AddInAlgo::tAlgoCategory category = ito::AddInAlgo::catNone, ito::AddInAlgo::tAlgoInterface interf = ito::AddInAlgo::iNotSpecified, QString interfaceMeta = QString()) : - m_widgetFunc(algoWidgetFunc), - m_paramFunc(algoWidgetParamFunc), - m_pBasePlugin(NULL), - m_description(description), - m_category(category), - m_interface(interf), - m_interfaceMeta(interfaceMeta) - {} - - virtual ~AlgoWidgetDef() {} //!< destructor - - t_algoWidget m_widgetFunc; //!< function pointer (unbounded, static) for widget-method - t_filterParam m_paramFunc; //!< function pointer (unbounded, static) for widget's default parameter method - ito::AddInInterfaceBase *m_pBasePlugin; //!< interface (factory) instance of this plugin (will be automatically filled) - QString m_name; //!< name of widget - QString m_description; //!< description of widget - ito::AddInAlgo::tAlgoCategory m_category; //!< category, widget belongs to (default: catNone) - ito::AddInAlgo::tAlgoInterface m_interface; //!< algorithm interface, widget fits to (default: iNotSpecified) - QString m_interfaceMeta; //!< meta information if required by algorithm interface - - private: - AlgoWidgetDef(const AlgoWidgetDef & /*p*/); //disable copy constructor - }; - - ito::RetVal getFilterList(QHash &fList) const; - ito::RetVal getAlgoWidgetList(QHash &awList) const; - ito::RetVal rejectFilter(const QString &name); - ito::RetVal rejectAlgoWidget(const QString &name); - - protected: - virtual ~AddInAlgo(); - AddInAlgo(); - QHash m_filterList; - QHash m_algoWidgetList; - - //! small check and cleaning of all parameter vectors (can be used in filterParam methods) - static ito::RetVal prepareParamVectors(QVector *paramsMand, QVector *paramsOpt, QVector *paramsOut); - - public Q_SLOTS: - virtual ito::RetVal getParam(QSharedPointer /*val*/, ItomSharedSemaphore * /*waitCond*/ = NULL) { return ito::retOk; } - virtual ito::RetVal setParam(QSharedPointer /*val*/, ItomSharedSemaphore * /*waitCond*/ = NULL) { return ito::retOk; } + } + + //!< constructor with all necessary arguments. + AlgoWidgetDef(AddInAlgo::t_algoWidget algoWidgetFunc, AddInAlgo::t_filterParam algoWidgetParamFunc, + QString description = QString(), ito::AddInAlgo::tAlgoCategory category = ito::AddInAlgo::catNone, + ito::AddInAlgo::tAlgoInterface interf = ito::AddInAlgo::iNotSpecified, + QString interfaceMeta = QString()) + : m_widgetFunc(algoWidgetFunc), m_paramFunc(algoWidgetParamFunc), m_pBasePlugin(NULL), + m_description(description), m_category(category), m_interface(interf), m_interfaceMeta(interfaceMeta) + { + } + + virtual ~AlgoWidgetDef() + { + } //!< destructor + + t_algoWidget m_widgetFunc; //!< function pointer (unbounded, static) for widget-method + t_filterParam m_paramFunc; //!< function pointer (unbounded, static) for widget's default parameter method + ito::AddInInterfaceBase + *m_pBasePlugin; //!< interface (factory) instance of this plugin (will be automatically filled) + QString m_name; //!< name of widget + QString m_description; //!< description of widget + ito::AddInAlgo::tAlgoCategory m_category; //!< category, widget belongs to (default: catNone) + ito::AddInAlgo::tAlgoInterface m_interface; //!< algorithm interface, widget fits to (default: iNotSpecified) + QString m_interfaceMeta; //!< meta information if required by algorithm interface + + private: + AlgoWidgetDef(const AlgoWidgetDef & /*p*/); // disable copy constructor }; - //---------------------------------------------------------------------------------------------------------------------------------- + ito::RetVal getFilterList(QHash &fList) const; + ito::RetVal getAlgoWidgetList(QHash &awList) const; + ito::RetVal rejectFilter(const QString &name); + ito::RetVal rejectAlgoWidget(const QString &name); + + protected: + virtual ~AddInAlgo(); + AddInAlgo(); + QHash m_filterList; + QHash m_algoWidgetList; + + //! small check and cleaning of all parameter vectors (can be used in filterParam methods) + static ito::RetVal prepareParamVectors(QVector *paramsMand, QVector *paramsOpt, + QVector *paramsOut); + + public Q_SLOTS: + virtual ito::RetVal getParam(QSharedPointer /*val*/, ItomSharedSemaphore * /*waitCond*/ = NULL) + { + return ito::retOk; + } + virtual ito::RetVal setParam(QSharedPointer /*val*/, ItomSharedSemaphore * /*waitCond*/ = NULL) + { + return ito::retOk; + } +}; + +//---------------------------------------------------------------------------------------------------------------------------------- } // namespace ito -#endif //#if !defined(Q_MOC_RUN) || defined(ITOMCOMMONQT_MOC) +#endif // #if !defined(Q_MOC_RUN) || defined(ITOMCOMMONQT_MOC) //! must be out of namespace ito, otherwise it results in a strange compiler error (template ...) Q_DECLARE_INTERFACE(ito::AddInInterfaceBase, ito_AddInInterface_CurrentVersion /*"ito.AddIn.InterfaceBase/4"*/) - - #endif diff --git a/common/sources/addInInterface.cpp b/common/sources/addInInterface.cpp index fbf43c0c9..eb8c14061 100644 --- a/common/sources/addInInterface.cpp +++ b/common/sources/addInInterface.cpp @@ -1154,7 +1154,31 @@ namespace ito return ito::retError; } } + //---------------------------------------------------------------------------------------------------------------------------------- + ito::RetVal AddInDataIO::getVal(QSharedPointer> dataObjMap, ItomSharedSemaphore* waitCond) + { + if (waitCond) + { + waitCond->returnValue += ito::RetVal( + ito::retError, + 0, + tr("method getVal(QSharedPointer>, ItomSharedSemaphore*) " + "is not implemented in this plugin") + .toLatin1() + .data()); + waitCond->release(); + return waitCond->returnValue; + } + else + { + return ito::retError; + } + } + ito::RetVal AddInDataIO::getVal(ItomSharedSemaphore* waitCond) + { + return ito::retError; + } //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal AddInDataIO::getVal(QSharedPointer /*data*/, QSharedPointer /*length*/, ItomSharedSemaphore *waitCond) { From 591c481275c73ec413de00bba59d31da7a419578 Mon Sep 17 00:00:00 2001 From: robin92 Date: Tue, 18 Oct 2022 09:48:55 +0200 Subject: [PATCH 26/62] first implementation of getValByMap --- Qitom/python/pythonPlugins.cpp | 11 +++---- common/addInMultiChannelGrabber.h | 2 ++ common/sources/addInMultiChannelGrabber.cpp | 26 +++++++++++++++++ python_unittests/multichannel_test.py | 32 ++++++++++++++++++++- 4 files changed, 65 insertions(+), 6 deletions(-) diff --git a/Qitom/python/pythonPlugins.cpp b/Qitom/python/pythonPlugins.cpp index 162940fdb..0a68d5487 100644 --- a/Qitom/python/pythonPlugins.cpp +++ b/Qitom/python/pythonPlugins.cpp @@ -4056,9 +4056,13 @@ PyObject* PythonPlugins::PyDataIOPlugin_getVal(PyDataIOPlugin *self, PyObject *a str = PyUnicode_AsEncodedString(repr, "utf-8", "strict"); if (((PythonDataObject::PyDataObject*)value)->dataObject) { - (*channelMap)[QString(PyBytes_AS_STRING(str))] = + QString key = QString(PyBytes_AS_STRING(str)); + if (key[0] == '\'' && key[key.length() - 1] == '\'') + { + key = key.mid(1, key.length() - 2); + } + (*channelMap)[key] = ((PythonDataObject::PyDataObject*)value)->dataObject; - std::cout << PyBytes_AS_STRING(str) << "\n"; } else { @@ -4084,9 +4088,6 @@ PyObject* PythonPlugins::PyDataIOPlugin_getVal(PyDataIOPlugin *self, PyObject *a } } locker = (new ItomSharedSemaphore()); - - QMetaObject::invokeMethod( - self->dataIOObj, "getVal", Q_ARG(ItomSharedSemaphore*, locker.getSemaphore())); QMetaObject::invokeMethod( self->dataIOObj, "getVal", QArgument > >("QSharedPointer >",channelMap), diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index 62f5872fc..da9d32986 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -95,6 +95,7 @@ namespace ito //*/ virtual ito::RetVal setParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok, QStringList &pendingUpdate) = 0; virtual ito::RetVal getParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok) = 0; + virtual ito::RetVal getValByMap(QSharedPointer> dataObjMap) = 0; void updateSizeXY(); /*!< updates sizex und sizey*/ public: @@ -104,6 +105,7 @@ namespace ito ito::RetVal setParam(QSharedPointer val, ItomSharedSemaphore *waitCond = NULL) final; ito::RetVal getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) final; ito::RetVal changeChannelForListerners(const QString& newChannel, QObject* obj); + ito::RetVal getVal(QSharedPointer> dataObjMap, ItomSharedSemaphore* waitCond); }; } #endif diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index d819b4bd9..32ab17630 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -818,5 +818,31 @@ namespace ito } return retValue; } + ito::RetVal AddInMultiChannelGrabber::getVal(QSharedPointer> dataObjMap, ItomSharedSemaphore* waitCond) + { + + ito::RetVal retval(ito::retOk); + ItomSharedSemaphoreLocker locker(waitCond); + QMap::const_iterator it = (*dataObjMap).constBegin(); + bool validChannelNames = true; + while (it != (*dataObjMap).constEnd()) + { + if (!m_channels.contains(it.key())) + { + retval += ito::RetVal(ito::retError, 0, tr("The following channel is not a valid channel of the dataIO instance: %1").arg(it.key()).toLatin1().data()); + } + ++it; + } + if (!retval.containsError()) + { + retval = getValByMap(dataObjMap); + } + if (waitCond) + { + waitCond->returnValue = retval; + waitCond->release(); + } + return retval; + } }//end namespace ito \ No newline at end of file diff --git a/python_unittests/multichannel_test.py b/python_unittests/multichannel_test.py index d557d8315..c6ed997ba 100644 --- a/python_unittests/multichannel_test.py +++ b/python_unittests/multichannel_test.py @@ -1,5 +1,5 @@ import unittest -from itom import dataIO +from itom import dataIO, dataObject def channelSpecificFunc1(): cam = dataIO("DummyMultiChannelGrabber") @@ -81,6 +81,36 @@ def test_invalidSuffixUsage(self): testParamDict[elem] = cam.getParam(elem) self.assertEqual(originalParamDict, testParamDict) + def test_getValByDict(self): + cam=dataIO("DummyMultiChannelGrabber") + cam.startDevice() + cam.acquire() + channelList=cam.getParam('channelList') + roi={} + getValDict={} + for elem in channelList: + roi[elem] = cam.getParam('roi:'+elem) + getValDict[elem]=dataObject() + cam.getVal(getValDict) + for key in roi: + self.assertEqual(roi[key][-2], getValDict[key].shape[-1]) + self.assertEqual(roi[key][-1], getValDict[key].shape[-2]) + +def test_copyValByDict(self): + cam=dataIO("DummyMultiChannelGrabber") + cam.startDevice() + cam.acquire() + channelList=cam.getParam('channelList') + roi={} + getValDict={} + for elem in channelList: + roi[elem] = cam.getParam('roi:'+elem) + getValDict[elem]=dataObject() + cam.copyVal(getValDict) + for key in roi: + self.assertEqual(roi[key][-2], getValDict[key].shape[-1]) + self.assertEqual(roi[key][-1], getValDict[key].shape[-2]) + def test_channelSpecific(self): self.assertRaises(RuntimeError, channelSpecificFunc1) From 0dac1ce6938ab1bacf6fe21e9a0527156e3bd291 Mon Sep 17 00:00:00 2001 From: robin92 Date: Tue, 25 Oct 2022 11:38:38 +0200 Subject: [PATCH 27/62] Multichannelgrabber: added a QMap based version of copyVal --- Qitom/python/pythonPlugins.cpp | 125 ++++++++++++++++---- common/addInMultiChannelGrabber.h | 3 + common/sources/addInMultiChannelGrabber.cpp | 60 ++++++++++ python_unittests/multichannel_test.py | 28 ++--- 4 files changed, 178 insertions(+), 38 deletions(-) diff --git a/Qitom/python/pythonPlugins.cpp b/Qitom/python/pythonPlugins.cpp index 0a68d5487..6bfce4ffc 100644 --- a/Qitom/python/pythonPlugins.cpp +++ b/Qitom/python/pythonPlugins.cpp @@ -4221,6 +4221,7 @@ PyObject* PythonPlugins::PyDataIOPlugin_copyVal(PyDataIOPlugin *self, PyObject * { int length = PyTuple_Size(args); PyObject *tempObj = NULL; + PyObject* bufferObj = NULL; ito::RetVal ret = ito::retOk; if (self->dataIOObj->getBasePlugin()->getType() & ito::typeGrabber) @@ -4237,45 +4238,121 @@ PyObject* PythonPlugins::PyDataIOPlugin_copyVal(PyDataIOPlugin *self, PyObject * if ((Py_TYPE(tempObj) == &PythonDataObject::PyDataObjectType)) { dObj = ((PythonDataObject::PyDataObject *)tempObj)->dataObject; - } - else - { - PyErr_SetString(PyExc_TypeError, "argument must be of type itom.dataObject."); - return NULL; - } + if (dObj == NULL) + { + PyErr_SetString(PyExc_ValueError, "invalid dataObject"); + return NULL; + } - if (dObj == NULL) - { - PyErr_SetString(PyExc_ValueError, "invalid dataObject"); - return NULL; - } + ItomSharedSemaphoreLocker locker(new ItomSharedSemaphore()); - ItomSharedSemaphoreLocker locker(new ItomSharedSemaphore()); + if (QMetaObject::invokeMethod(self->dataIOObj, "copyVal", Q_ARG(void*, (void*)dObj), Q_ARG(ItomSharedSemaphore*, locker.getSemaphore()))) + { + bool timeout = false; - if (QMetaObject::invokeMethod(self->dataIOObj, "copyVal", Q_ARG(void*, (void *)dObj), Q_ARG(ItomSharedSemaphore*, locker.getSemaphore()))) - { - bool timeout = false; + while (!locker.getSemaphore()->wait(AppManagement::timeouts.pluginGeneral)) + { + if (!self->dataIOObj->isAlive()) + { + timeout = true; + ret += ito::RetVal(ito::retError, 0, QObject::tr("timeout while calling 'copyVal'").toLatin1().data()); + break; + } + } - while (!locker.getSemaphore()->wait(AppManagement::timeouts.pluginGeneral)) + if (!timeout) + { + ret += locker.getSemaphore()->returnValue; + } + } + else { - if (!self->dataIOObj->isAlive()) + ret += ito::RetVal(ito::retError, 0, QObject::tr("Member 'copyVal' of plugin could not be invoked (error in signal/slot connection).").toLatin1().data()); + } + } + else if (PyArg_ParseTuple(args, "O!", &PyDict_Type, &bufferObj)) + { + PyObject* key, * value, * repr, * str; + Py_ssize_t pos = 0; + ito::DataObject* channelDataObj; + QSharedPointer> channelMap(new QMap); + while (PyDict_Next(bufferObj, &pos, &key, &value)) + { + if (PyUnicode_Check(key)) { - timeout = true; - ret += ito::RetVal(ito::retError, 0, QObject::tr("timeout while calling 'copyVal'").toLatin1().data()); - break; + + if ((Py_TYPE(value) == &PythonDataObject::PyDataObjectType)) + { + repr = PyObject_Repr(key); + str = PyUnicode_AsEncodedString(repr, "utf-8", "strict"); + if (((PythonDataObject::PyDataObject*)value)->dataObject) + { + QString key = QString(PyBytes_AS_STRING(str)); + if (key[0] == '\'' && key[key.length() - 1] == '\'') + { + key = key.mid(1, key.length() - 2); + } + (*channelMap)[key] = + ((PythonDataObject::PyDataObject*)value)->dataObject; + } + else + { + Py_XDECREF(repr); + Py_XDECREF(str); + PyErr_SetString( + PyExc_RuntimeError, + "given data object of at least one data object is empty (internal dataObject-pointer is NULL)"); + return NULL; + } + } + else + { + PyErr_SetString( + PyExc_RuntimeError, "The value of at least one item isn't a data object"); + return NULL; + } + } + else + { + PyErr_SetString(PyExc_RuntimeError, "The key of at least one item isn't a string"); + return NULL; } } + ItomSharedSemaphoreLocker locker(new ItomSharedSemaphore()); - if (!timeout) + if (QMetaObject::invokeMethod( + self->dataIOObj, "copyVal", + QArgument > >("QSharedPointer >", channelMap), + Q_ARG(ItomSharedSemaphore*, locker.getSemaphore()))) { - ret += locker.getSemaphore()->returnValue; + bool timeout = false; + + while (!locker.getSemaphore()->wait(AppManagement::timeouts.pluginGeneral)) + { + if (!self->dataIOObj->isAlive()) + { + timeout = true; + ret += ito::RetVal(ito::retError, 0, QObject::tr("timeout while calling 'copyVal'").toLatin1().data()); + break; + } + } + + if (!timeout) + { + ret += locker.getSemaphore()->returnValue; + } + } + else + { + ret += ito::RetVal(ito::retError, 0, QObject::tr("Member 'copyVal' of plugin could not be invoked (error in signal/slot connection).").toLatin1().data()); } + } else { - ret += ito::RetVal(ito::retError, 0, QObject::tr("Member 'copyVal' of plugin could not be invoked (error in signal/slot connection).").toLatin1().data()); + PyErr_SetString(PyExc_TypeError, "argument must be of type itom.dataObject or dict."); + return NULL; } - } else if (self->dataIOObj->getBasePlugin()->getType() & ito::typeADDA) { diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index da9d32986..e3613e8b5 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -66,6 +66,7 @@ namespace ito }; QMap m_channels; /*!< Map for recently grabbed images of various channels*/ virtual ito::RetVal checkData(ito::DataObject *externalDataObject = NULL); + virtual ito::RetVal checkData(QMap& externalDataObject); virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ void addChannel(QString name); @@ -96,6 +97,7 @@ namespace ito virtual ito::RetVal setParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok, QStringList &pendingUpdate) = 0; virtual ito::RetVal getParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok) = 0; virtual ito::RetVal getValByMap(QSharedPointer> dataObjMap) = 0; + virtual ito::RetVal copyValByMap(QSharedPointer> dataObjMap) = 0; void updateSizeXY(); /*!< updates sizex und sizey*/ public: @@ -106,6 +108,7 @@ namespace ito ito::RetVal getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) final; ito::RetVal changeChannelForListerners(const QString& newChannel, QObject* obj); ito::RetVal getVal(QSharedPointer> dataObjMap, ItomSharedSemaphore* waitCond); + ito::RetVal copyVal(QSharedPointer> dataObjMap, ItomSharedSemaphore* waitCond); }; } #endif diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index 32ab17630..6ed139545 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -217,6 +217,40 @@ namespace ito return retValue; } + + ito::RetVal ito::AddInMultiChannelGrabber::checkData(QMap& externalDataObject) + { + assert(m_defaultConfigReady); + ito::RetVal retVal(ito::retOk); + unsigned int futureType = 0; + bool ok; + QMap::const_iterator it = externalDataObject.constBegin(); + while (it != externalDataObject.constEnd()) + { + futureType = pixelFormatStringToEnum(m_channels[it.key()].m_channelParam["pixelFormat"].getVal(), &ok); + if (ok) + { + int* roi = m_channels[it.key()].m_channelParam["roi"].getVal(); + int width = roi[2]; + int height = roi[3]; + if (it.value()->getDims() == 0) + { + *(it.value()) = ito::DataObject(height, width, futureType); + } + else if (it.value()->calcNumMats() != 1) + { + return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject for channel %1 is invalid. Object has more or less than 1 plane. It must be of right size and type or an uninitilized image.").arg(it.key()).toLatin1().data()); + } + else if (it.value()->getSize(it.value()->getDims() - 2) != height || it.value()->getSize(it.value()->getDims() - 1) != width || it.value()->getType() != futureType) + { + return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject for channel %1 is invalid. Object must be of right size and type or an uninitilized image.").arg(it.key()).toLatin1().data()); + } + } + ++it; + } + return retVal; + + } ito::RetVal ito::AddInMultiChannelGrabber::checkData(ito::DataObject *externalDataObject) { assert(m_defaultConfigReady); @@ -844,5 +878,31 @@ namespace ito } return retval; } + ito::RetVal AddInMultiChannelGrabber::copyVal(QSharedPointer> dataObjMap, ItomSharedSemaphore* waitCond) + { + + ito::RetVal retval(ito::retOk); + ItomSharedSemaphoreLocker locker(waitCond); + QMap::const_iterator it = (*dataObjMap).constBegin(); + bool validChannelNames = true; + while (it != (*dataObjMap).constEnd()) + { + if (!m_channels.contains(it.key())) + { + retval += ito::RetVal(ito::retError, 0, tr("The following channel is not a valid channel of the dataIO instance: %1").arg(it.key()).toLatin1().data()); + } + ++it; + } + if (!retval.containsError()) + { + retval = copyValByMap(dataObjMap); + } + if (waitCond) + { + waitCond->returnValue = retval; + waitCond->release(); + } + return retval; + } }//end namespace ito \ No newline at end of file diff --git a/python_unittests/multichannel_test.py b/python_unittests/multichannel_test.py index c6ed997ba..75d8cf755 100644 --- a/python_unittests/multichannel_test.py +++ b/python_unittests/multichannel_test.py @@ -96,20 +96,20 @@ def test_getValByDict(self): self.assertEqual(roi[key][-2], getValDict[key].shape[-1]) self.assertEqual(roi[key][-1], getValDict[key].shape[-2]) -def test_copyValByDict(self): - cam=dataIO("DummyMultiChannelGrabber") - cam.startDevice() - cam.acquire() - channelList=cam.getParam('channelList') - roi={} - getValDict={} - for elem in channelList: - roi[elem] = cam.getParam('roi:'+elem) - getValDict[elem]=dataObject() - cam.copyVal(getValDict) - for key in roi: - self.assertEqual(roi[key][-2], getValDict[key].shape[-1]) - self.assertEqual(roi[key][-1], getValDict[key].shape[-2]) + def test_copyValByDict(self): + cam=dataIO("DummyMultiChannelGrabber") + cam.startDevice() + cam.acquire() + channelList=cam.getParam('channelList') + roi={} + getValDict={} + for elem in channelList: + roi[elem] = cam.getParam('roi:'+elem) + getValDict[elem]=dataObject() + cam.copyVal(getValDict) + for key in roi: + self.assertEqual(roi[key][-2], getValDict[key].shape[-1]) + self.assertEqual(roi[key][-1], getValDict[key].shape[-2]) def test_channelSpecific(self): From c9859b038734c988b7bb3bd8e82c4374459a1825 Mon Sep 17 00:00:00 2001 From: Robin Hahn Date: Sat, 21 Jan 2023 17:09:34 +0100 Subject: [PATCH 28/62] implemented a new newGrabberData signal delivering a QMap of dataObjects to python --- AddInManager/addInManager.cpp | 1 - Qitom/python/pythonEngine.cpp | 2 +- Qitom/python/pythonQtConversion.cpp | 40 +++++++++++++++++++++++++++++ Qitom/python/pythonQtConversion.h | 2 ++ common/addInMultiChannelGrabber.h | 8 ++++-- 5 files changed, 49 insertions(+), 4 deletions(-) diff --git a/AddInManager/addInManager.cpp b/AddInManager/addInManager.cpp index 76c463cda..f2b4a7fad 100644 --- a/AddInManager/addInManager.cpp +++ b/AddInManager/addInManager.cpp @@ -829,7 +829,6 @@ AddInManager::AddInManager(QString itomSettingsFile, void **apiFuncsGraph, QObje qRegisterMetaType >("QMap"); qRegisterMetaType > >("QSharedPointer >"); qRegisterMetaType > >("QVector >"); - qRegisterMetaType > >("QSharedPointer >"); #if ITOM_POINTCLOUDLIBRARY > 0 qRegisterMetaType("ito::PCLPointCloud"); diff --git a/Qitom/python/pythonEngine.cpp b/Qitom/python/pythonEngine.cpp index 6dca0b7bc..5535f546d 100644 --- a/Qitom/python/pythonEngine.cpp +++ b/Qitom/python/pythonEngine.cpp @@ -263,7 +263,7 @@ PythonEngine::PythonEngine() : qRegisterMetaType("ito::JediAssignment"); qRegisterMetaType >("QVector"); qRegisterMetaType >("QSharedPointer"); - + qRegisterMetaType >>("QSharedPointer>"); m_autoReload.modAutoReload = NULL; m_autoReload.classAutoReload = NULL; m_autoReload.checkFctExec = false; diff --git a/Qitom/python/pythonQtConversion.cpp b/Qitom/python/pythonQtConversion.cpp index 0e4cfd99a..85b73c41b 100644 --- a/Qitom/python/pythonQtConversion.cpp +++ b/Qitom/python/pythonQtConversion.cpp @@ -3195,6 +3195,32 @@ PyObject* PythonQtConversion::QVariantListToPyObject(const QVariantList& l) return result; } +//------------------------------------------------------------------------------------- +//! conversion from given QMap to python-dictionary. +/*! + returns new reference to python-dict type. Each pair of a QString and a ito::DataObject is one pair in the dictionary. + The values are converted using \a DataObjectToPyObject and \a QStringToPyObject. + + \param m is reference to QMap + \return is the resulting PyObject* + \see DataObjectToPyObject, QStringToPyObject +*/ +PyObject* ito::PythonQtConversion::QMapToPyObject(const QMap& m) +{ + PyObject* result = PyDict_New(); + QMap::const_iterator it = m.constBegin(); + PyObject* key; + PyObject* val; + for (; it != m.constEnd(); it++) + { + key = PythonQtConversion::QStringToPyObject(it.key()); + val = PythonQtConversion::DataObjectToPyObject(it.value()); + PyDict_SetItem(result, key, val); + Py_DECREF(key); + Py_DECREF(val); + } + return result; +} //------------------------------------------------------------------------------------- //! method internally used for conversion from given type-id (QMetaType) and corresponding char*-pointer to PyObject* @@ -3430,6 +3456,20 @@ PyObject* PythonQtConversion::ConvertQtValueToPythonInternal(int type, const voi } return DataObjectToPyObject(*(sharedPtr->data())); } + else if (strcmp(name, "QSharedPointer >") == 0) + { + QSharedPointer >* sharedPtr = (QSharedPointer >*) data; + if (sharedPtr == NULL) + { + PyErr_SetString(PyExc_TypeError, "The given QSharedPointer is NULL"); + return NULL; + } + else + { + return QMapToPyObject(**sharedPtr); + } + + } else if (strcmp(name, "QPointer") == 0 || \ strcmp(name, "QPointer") == 0 || \ strcmp(name, "QPointer") == 0) diff --git a/Qitom/python/pythonQtConversion.h b/Qitom/python/pythonQtConversion.h index 133bb571b..9d6bb412c 100644 --- a/Qitom/python/pythonQtConversion.h +++ b/Qitom/python/pythonQtConversion.h @@ -149,6 +149,8 @@ class PythonQtConversion static PyObject* QVariantMapToPyObject(const QVariantMap& m); static PyObject* QVariantListToPyObject(const QVariantList& l); + static PyObject* QMapToPyObject(const QMap & m); + #if ITOM_POINTCLOUDLIBRARY > 0 static PyObject* PCLPointCloudToPyObject(const ito::PCLPointCloud& c); static PyObject* PCLPointToPyObject(const ito::PCLPoint& c); diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index e3613e8b5..2a78dc7df 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -107,8 +107,12 @@ namespace ito ito::RetVal setParam(QSharedPointer val, ItomSharedSemaphore *waitCond = NULL) final; ito::RetVal getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) final; ito::RetVal changeChannelForListerners(const QString& newChannel, QObject* obj); - ito::RetVal getVal(QSharedPointer> dataObjMap, ItomSharedSemaphore* waitCond); - ito::RetVal copyVal(QSharedPointer> dataObjMap, ItomSharedSemaphore* waitCond); + ito::RetVal getVal(QSharedPointer > dataObjMap, ItomSharedSemaphore* waitCond); + ito::RetVal copyVal(QSharedPointer > dataObjMap, ItomSharedSemaphore* waitCond); + + signals: + + void newGrabberData(QSharedPointer > dataObjMap); /*! Date: Sun, 22 Jan 2023 18:54:57 +0100 Subject: [PATCH 29/62] AddInManager: register qMetaType --- AddInManager/addInManager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/AddInManager/addInManager.cpp b/AddInManager/addInManager.cpp index f2b4a7fad..76c463cda 100644 --- a/AddInManager/addInManager.cpp +++ b/AddInManager/addInManager.cpp @@ -829,6 +829,7 @@ AddInManager::AddInManager(QString itomSettingsFile, void **apiFuncsGraph, QObje qRegisterMetaType >("QMap"); qRegisterMetaType > >("QSharedPointer >"); qRegisterMetaType > >("QVector >"); + qRegisterMetaType > >("QSharedPointer >"); #if ITOM_POINTCLOUDLIBRARY > 0 qRegisterMetaType("ito::PCLPointCloud"); From 2b3e2bd80e16de8709c2b2e7ed084f65cf366517 Mon Sep 17 00:00:00 2001 From: Robin Hahn Date: Mon, 30 Jan 2023 19:42:04 +0100 Subject: [PATCH 30/62] added a first version of the default parameters axisOffset and axisScale. The parameters are channel specific parameters. AxisScale and Offset are set to the dataObject in AddInMultiChannelGrabber::sendDataToListeners. Also added a unittest for setting a parameter by a suffix when the suffix specifies the current default channel. This test fails... --- common/addInMultiChannelGrabber.h | 10 +++++-- common/sources/addInMultiChannelGrabber.cpp | 33 +++++++++++++++++---- python_unittests/multichannel_test.py | 3 ++ 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index 2a78dc7df..08cf9b59e 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -55,13 +55,19 @@ namespace ito ito::DataObject data; QMap m_channelParam; ChannelContainer() {}; - ChannelContainer(ito::Param roi, ito::Param pixelFormat, ito::Param sizex, ito::Param sizey) + ChannelContainer(ito::Param roi, + ito::Param pixelFormat, + ito::Param sizex, + ito::Param sizey, + ito::Param axisOffset, + ito::Param axisScale) { m_channelParam.insert("pixelFormat", pixelFormat); m_channelParam.insert("roi", roi); m_channelParam.insert("sizex", sizex); m_channelParam.insert("sizey", sizey); - + m_channelParam.insert("axisOffset", axisOffset); + m_channelParam.insert("axisScale", axisScale); } }; QMap m_channels; /*!< Map for recently grabbed images of various channels*/ diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index 6ed139545..44a4c6f95 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -58,7 +58,6 @@ namespace ito paramVal = ito::Param("channelList", ito::ParamBase::StringList | ito::ParamBase::Readonly, {}, tr("names of the channels provided by the plugin").toLatin1().data()); m_params.insert(paramVal.getName(), paramVal); - //int roi[] = { 0, 0, 2048, 2048 }; //paramVal = ito::Param("roi", ito::ParamBase::IntArray, 4, roi, tr("ROI (x,y,width,height) [this replaces the values x0,x1,y0,y1]").toLatin1().data()); //ito::RectMeta *rm = new ito::RectMeta(ito::RangeMeta(roi[0], roi[0] + roi[2] - 1), ito::RangeMeta(roi[1], roi[1] + roi[3] - 1), "ImageFormatControl"); @@ -157,7 +156,7 @@ namespace ito ////---------------------------------------------------------------------------------------------------------------------------------- ////! sends m_image to all registered listeners. ///*! - //This method is continuously called from timerEvent. Also call this method from your getVal-Method (usually with 0-timeout) + //This method is continuously called from timerEvent. Also call this method from your getVal-Method (usually with 0-timeout). The function adds axis scale and axis unit to the dataObject. //\param [in] waitMS indicates the time (in ms) that should be waiting until every registered live image source node received m_image. 0: no wait, -1: infinit waiting time, else time in milliseconds //\return retOk if everything was ok, retWarning if live image could not be invoked @@ -172,7 +171,25 @@ namespace ito QMultiMap::iterator it = m_autoGrabbingListeners.begin(); while (it != m_autoGrabbingListeners.end()) { - if (!QMetaObject::invokeMethod(it.value(), "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[it.key().toLatin1().data()].data))), Q_ARG(ItomSharedSemaphore*, NULL))) + const ChannelContainer& container = m_channels[it.key().toLatin1().data()]; + QSharedPointer pDObj(new ito::DataObject(container.data)); + int numAxis = pDObj->getDims(); + if(container.m_channelParam["axisOffset"].getLen() == numAxis && container.m_channelParam["axisScale"].getLen() == numAxis) + { + const double* axisOffset = container.m_channelParam["axisOffset"].getVal(); + const double* axisScale = container.m_channelParam["axisScale"].getVal(); + for (unsigned int i = 0; i < numAxis; ++i) + { + pDObj->setAxisOffset(i, axisOffset[i]); + pDObj->setAxisScale(i, axisScale[i]); + } + } + else + { + retValue += ito::RetVal(ito::retWarning, 1001, tr("could not set axis scale or axis offset since the array length of at least one parameter does not fit to the dataObject size.").toLatin1().data()); + } + + if (!QMetaObject::invokeMethod(it.value(), "setSource", Q_ARG(QSharedPointer, pDObj), Q_ARG(ItomSharedSemaphore*, NULL))) { retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); } @@ -317,7 +334,7 @@ namespace ito void AddInMultiChannelGrabber::addChannel(QString name) { - ChannelContainer a(m_params["roi"], m_params["pixelFormat"], m_params["sizex"], m_params["sizey"]); + ChannelContainer a(m_params["roi"], m_params["pixelFormat"], m_params["sizex"], m_params["sizey"], m_params["axisOffset"], m_params["axisScale"]); m_channels[name] = a; const ByteArray* channelList = m_params["channelList"].getVal(); int len = 0; @@ -418,7 +435,12 @@ namespace ito } return retValue; } - //todo: update setParam... + //todo: modify setParam such that the if a value is set by a suffix the value gets copied to m_params if the suffix is the default channel. Right now the channelParam gets overridden by the m_param value. + //Maybe the functions needs to be splitted into different cases: + //1) a param is set without suffix -> if the param is a channelparam we need to update the channel param as well + //2) a param is set with a suffix -> we need to set the channelparam and update the m_params as well. If the suffix isn't the default param we do not have to update m_params + //3) a param wich isn't a channel param is set -> we just have to update m_params + //We want to create a list which clearly indicates if further params requrire a update and if so if the update is needed in channel param or m_param or both ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer val, ItomSharedSemaphore *waitCond/* = NULL*/) { assert(m_defaultConfigReady); @@ -634,7 +656,6 @@ namespace ito } return retVal; } - ////---------------------------------------------------------------------------------------------------------------------------------- ////! updates sizex and sizey ///*! diff --git a/python_unittests/multichannel_test.py b/python_unittests/multichannel_test.py index 75d8cf755..491722168 100644 --- a/python_unittests/multichannel_test.py +++ b/python_unittests/multichannel_test.py @@ -23,10 +23,13 @@ def test_setAndGetParamViaSuffix(self): roiDefaultChannel = cam.getParam('roi') roiChannel0 = cam.getParam('roi:channel_0') roiChannel1 = cam.getParam('roi:channel_1') + cam.setParam('roi:channel_0', [0, 0, 50, 50]) + roiChannel0Modified = cam.getParam('roi:channel_0') self.assertEqual(originalRoi, roiChannel0) self.assertNotEqual(originalRoi, roiChannel1) self.assertEqual(roiChannel1, (0, 0, 20, 20)) + self.assertEqual(roiChannel0Modified,(0,0,50,50)) self.assertEqual(roiDefaultChannel, roiChannel0) def test_setAndGetParamViaDefaultChannel(self): From a6ffe6f5c5a4237586199dad2e27222408f4fbd6 Mon Sep 17 00:00:00 2001 From: Robin Hahn Date: Sun, 26 Feb 2023 16:45:22 +0100 Subject: [PATCH 31/62] removed suffix support for setParam and getParam. To set a channel specific parameter the channel must be selected by the defaultChannel parameter. Updated some unit tests... Started to add some documentation about the new AddInMultiChannelGrabber. --- common/addInMultiChannelGrabber.h | 10 +- common/sources/addInMultiChannelGrabber.cpp | 271 +++++------------- .../07_plugins/development/plugin-dataIO.rst | 41 ++- python_unittests/multichannel_test.py | 54 +--- 4 files changed, 129 insertions(+), 247 deletions(-) diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index 08cf9b59e..03c2d7e77 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -48,13 +48,14 @@ namespace ito AddInMultiChannelGrabberPrivate *dd; bool m_defaultConfigReady; QMap m_paramChannelAvailabilityMap; + protected: struct ChannelContainer { ito::DataObject data; QMap m_channelParam; - ChannelContainer() {}; + ChannelContainer(); ChannelContainer(ito::Param roi, ito::Param pixelFormat, ito::Param sizex, @@ -77,13 +78,12 @@ namespace ito ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ void addChannel(QString name); virtual ito::RetVal switchDefaultChannel();/*!< synchronizes m_params with the params of default channel container */ - virtual ito::RetVal applyParamsToChannelParams(QStringList keyList = QStringList()); + virtual ito::RetVal applyParamsToChannelParams(const QStringList& keyList = QStringList()); void initializeDefaultConfiguration(const QMap& channelContainerMap, const QMap& nonChannelSpecificParams = QMap());/*!< sets the channel parameters.*/ - template ito::RetVal setParamVal(const QByteArray& paramName,const T& val, const QList& channelList = QList()); ito::RetVal setParamMeta(const QByteArray& paramName, ito::ParamMeta* meta, bool takeOwnerShip, const QList& channelList = QList()); ito::RetVal setParamFlags(const QByteArray& paramName, const unsigned int& flags, const QList& channelList = QList()); - ito::RetVal roiChanged(const QList& channelList = QList()); + ////! Specific function to set the parameters in the respective plugin class @@ -100,7 +100,7 @@ namespace ito //\param [in] add key of changed channel specific parameters to pendingUpdate. //\return retOk if everything was ok, else retError //*/ - virtual ito::RetVal setParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok, QStringList &pendingUpdate) = 0; + virtual ito::RetVal setParameter(QSharedPointer& val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok, QStringList &pendingUpdate) = 0; virtual ito::RetVal getParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok) = 0; virtual ito::RetVal getValByMap(QSharedPointer> dataObjMap) = 0; virtual ito::RetVal copyValByMap(QSharedPointer> dataObjMap) = 0; diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index 44a4c6f95..78630141f 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -37,6 +37,30 @@ namespace ito { + AddInMultiChannelGrabber::ChannelContainer::ChannelContainer() + { + ito::Param paramVal; + int roi[] = { 0, 0, 1, 1 }; + paramVal = ito::Param("roi", ito::ParamBase::IntArray, 4, roi, "roi"); + m_channelParam.insert("roi", paramVal); + + paramVal = ito::Param("sizex", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 1, 1, "sizex"); + m_channelParam.insert("sizex", paramVal); + + paramVal = ito::Param("sizey", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 1, 1, "sizey"); + m_channelParam.insert("sizey", paramVal); + + paramVal = ito::Param("pixelFormat", ito::ParamBase::String, "mono8", "pixelFormat"); + m_channelParam.insert("pixelFormat", paramVal); + + double axisOffset[] = { 0.0, 0.0 }; + paramVal = ito::Param("axisOffset", ito::ParamBase::DoubleArray, 2, axisOffset, "axis offset"); + m_channelParam.insert("axisOffset", paramVal); + + double axisScale[] = { 1.0, 1.0 }; + paramVal = ito::Param("axisScale", ito::ParamBase::DoubleArray, 2, axisScale, "axis scale"); + m_channelParam.insert("axisScale", paramVal); + } class AddInMultiChannelGrabberPrivate { }; @@ -370,21 +394,9 @@ namespace ito //parse the given parameter-name (if you support indexed or suffix-based parameters) retValue += apiParseParamName(val->getName(), key, hasIndex, index, suffix); - if (retValue == ito::retOk) + if (!retValue.containsError()) { - //gets the parameter key from m_params map (read-only is allowed, since we only want to get the value). - if (!suffix.isEmpty() && m_channels.contains(suffix)) - { - retValue += apiGetParamFromMapByKey(m_channels[suffix].m_channelParam, key, it, false); - if (retValue.containsError()) - { - retValue = ito::RetVal(ito::retError, 0, tr("an error occured while searching parameter \"%0\" for channel \"%1\". Maybe this is a channel specific parameter.").arg(key).arg(suffix).toLatin1().data()); - } - } - else - { retValue += apiGetParamFromMapByKey(m_params, key, it, false); - } } if (!retValue.containsError()) { @@ -435,12 +447,19 @@ namespace ito } return retValue; } - //todo: modify setParam such that the if a value is set by a suffix the value gets copied to m_params if the suffix is the default channel. Right now the channelParam gets overridden by the m_param value. - //Maybe the functions needs to be splitted into different cases: - //1) a param is set without suffix -> if the param is a channelparam we need to update the channel param as well - //2) a param is set with a suffix -> we need to set the channelparam and update the m_params as well. If the suffix isn't the default param we do not have to update m_params - //3) a param wich isn't a channel param is set -> we just have to update m_params - //We want to create a list which clearly indicates if further params requrire a update and if so if the update is needed in channel param or m_param or both + ////---------------------------------------------------------------------------------------------------------------------------------- + ////! Sets a new value to a parameter. + ///*! + // This function parses the given parameter and calls setParameter. If the bool parameter ok in the setParameter (to be implemented in the individual plugins) + // function returns false, it gets assumed that the plugin didn't process the parameter. In this case the value of the parameter gets copied here. + // If the parameter name is "roi" sizex and sizey gets updated by setParam. If the key of the parameter is "defaultChannel" the function "switchDefaultChannel" gets called. + // Both happens also if the "ok" value of setParameter is true. + // "applyParamsToChannelParams" is called to synchronize the parameters of the channel container follwed by a call of checkData. + + //\param [in] val is a QSharedPOinter of type ParamBase containing the paremeter to be set. + //\param [in] waitCond + //\return retOk if everything was ok, else retError + //*/ ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer val, ItomSharedSemaphore *waitCond/* = NULL*/) { assert(m_defaultConfigReady); @@ -449,102 +468,60 @@ namespace ito bool hasIndex, ok; int index; QString suffix, key; + QStringList paramUpdateList; ParamMapIterator it; - retValue += ito::parseParamName(val->getName(), key, hasIndex, index, suffix); int cntStartedDevices = grabberStartedCount(); + retValue += ito::parseParamName(val->getName(), key, hasIndex, index, suffix); + retValue += apiGetParamFromMapByKey(m_params, key, it, true); + retValue += apiValidateParam(*it, *val, false, true); if (!retValue.containsError()) { - if (!suffix.isEmpty() && m_channels.contains(suffix)) - { - retValue += apiGetParamFromMapByKey(m_channels[suffix].m_channelParam, key, it, true); - if (retValue.containsError()) - { - retValue = ito::RetVal(ito::retError, 0, tr("an error occured while searching parameter \"%0\" for channel \"%1\".Maybe this is a non channel specific parameter.").arg(key).arg(suffix).toLatin1().data()); - } - } - else - { - if (suffix.isEmpty()) - { - retValue += apiGetParamFromMapByKey(m_params, key, it, true); - } - else - { - retValue += ito::RetVal(ito::retError, 0, tr("unknown channel: %1").arg(suffix).toLatin1().data()); - } - } - } - if (!retValue.containsError()) - { - retValue += apiValidateParam(*it, *val, false, true); - } - if (!retValue.containsError()) - { - QStringList list; - retValue += setParameter(val, it, suffix, key, index, hasIndex, ok, list); + retValue += setParameter(val, it, suffix, key, index, hasIndex, ok, paramUpdateList); + if (!retValue.containsError() && !ok) { - if (key == "defaultChannel") - { - if (m_channels.find(val->getVal()) != m_channels.end()) - { - retValue += it->copyValueFrom(&(*val)); - retValue += switchDefaultChannel(); - //retValue += synchronizeParamswithChannelParams(previousChannel); - } - else - { - retValue += ito::RetVal(ito::retError, 0, tr("unknown channel: %1").arg(val->getVal()).toLatin1().data()); - } - } - else if (key == "roi") + + if (!retValue.containsError()) { - if (!hasIndex) + if (key != "defaultChannel") { retValue += it->copyValueFrom(&(*val)); - list << "roi"; + paramUpdateList << val->getName(); } else { - it->getVal()[index] = val->getVal(); - list << "roi"; - } - - } - else - { - retValue += it->copyValueFrom(&(*val)); // it seems that the plugin does not process the param therefore it is copied here - if (m_channels[m_params["defaultChannel"].getVal()].m_channelParam.contains(key)) - { - list << key; + if (m_channels.find(val->getVal()) != m_channels.end()) + { + retValue += it->copyValueFrom(&(*val)); + paramUpdateList << val->getName(); + } + else + { + retValue += retValue += ito::RetVal(ito::retError, 0, tr("could not switch to channel %1. The channel is unknown.").arg(val->getVal()).toLatin1().data()); + } } } } - if (list.contains("roi")) //if key is roi sizex and sizey must be adapted + if (!retValue.containsError()) { - if (!suffix.isEmpty()) + if (key == "roi" || paramUpdateList.contains("roi")) { - QByteArrayList channelList; - channelList.append(suffix.toLatin1()); - roiChanged(channelList); + updateSizeXY(); + paramUpdateList << "sizex" << "sizey"; } - else + if (key == "defaultChannel") { - roiChanged(); + retValue += switchDefaultChannel(); } - + retValue += applyParamsToChannelParams(paramUpdateList); + retValue += checkData(); } if (!retValue.containsError()) { - applyParamsToChannelParams(list); - checkData(); + emit parametersChanged(m_params); } } - if (!retValue.containsError()) - { - emit parametersChanged(m_params); - } if (cntStartedDevices < grabberStartedCount()) { if (cntStartedDevices != 0) @@ -563,12 +540,10 @@ namespace ito ////---------------------------------------------------------------------------------------------------------------------------------- ////! synchronizes m_params with the params of default channel container ///*! - //This method synchronizes the parameters from the current selected channel container with m_params. Call this function after changing the default parameter.Parameters which are not available for the current default channel are set to readonly + //This method synchronizes the parameters from the current selected channel container with m_params. Call this function after changing the defaultChannel parameter.Parameters which are not available for the current default channel are set to readonly - //\param [in] previousChannel indicates the name of the previous default channel. This is needed to check whether a parameter is no longer contained in the current channel, which was contained in the previous one. //\return retOk if everything was ok, else retError //*/ - //Todo: this function will be replaced by switchDefaultChannel ito::RetVal AddInMultiChannelGrabber::switchDefaultChannel() { assert(m_defaultConfigReady); @@ -602,13 +577,13 @@ namespace ito ////---------------------------------------------------------------------------------------------------------------------------------- ////! copies value m_params to the channel params of the current default channel ///*! - //This method copies params of m_params to the params of the channel container. This function is usally called after setParam to apply the changed entries of m_params to the corresponding channel container. + //This method copies params of m_params to the params of the channel container if the param is contained in the channel container . This function is usally called after setParam to apply the changed entries of m_params to the corresponding channel container. //If a parameter is not found in the channel container nothing happens. This function updates also sizex and sizey if roi or nothing is passed as key. //\param [in] keyList indicates which params are copied. If the List is empty all Parameters of the current channel are updated. //\return retOk if everything was ok, else retError //*/ - ito::RetVal AddInMultiChannelGrabber::applyParamsToChannelParams(QStringList keyList) + ito::RetVal AddInMultiChannelGrabber::applyParamsToChannelParams(const QStringList& keyList) { assert(m_defaultConfigReady); ito::RetVal retVal(ito::retOk); @@ -625,11 +600,6 @@ namespace ito if (m_params.contains(tmp)) { m_channels[currentChannel].m_channelParam[tmp] = m_params[tmp]; - if (tmp == "roi") - { - m_channels[currentChannel].m_channelParam["sizex"] = m_params["sizex"]; - m_channels[currentChannel].m_channelParam["sizey"] = m_params["sizey"]; - } } else { @@ -659,10 +629,9 @@ namespace ito ////---------------------------------------------------------------------------------------------------------------------------------- ////! updates sizex and sizey ///*! - //Call this function to update sizex and sizey. If the roi is changed via setParam this function will be call automatically. - //Do not forget to apply the changes to the channel parameters by calling applyParamsToChannelParams after calling this function. - - //\param [in] keyList indicates which params are copied. If the List is empty all Parameters of the current channel are updated. + //Call this function to update sizex and sizey. If the roi is changed via setParam this function will be called automatically. + //Note: Do not forget to apply the changes to the channel parameters by calling applyParamsToChannelParams after calling this function. + //\return retOk if everything was ok, else retError //*/ void AddInMultiChannelGrabber::updateSizeXY() @@ -675,61 +644,6 @@ namespace ito m_params["sizey"].setVal(height); } - template ito::RetVal ito::AddInMultiChannelGrabber::setParamVal( const QByteArray& paramName, const T & val, const QList& channelList /*=QList()*/) - { - assert(m_defaultConfigReady); - ito::RetVal retValue(ito::retOk); - if (m_paramChannelAvailabilityMap.contains(paramName) && m_params.contains(paramName)) - { - if (channelList.isEmpty()) //we want to update the param for all channels even if it is a global one - { - retValue = m_params[paramName].setVal(val); - QStringListIterator it (m_paramChannelAvailabilityMap[paramName]); - while (it.hasNext()) // update param for all channels - { - it.next(); - retValue += m_channels[it.value()].m_channelParam[paramName].setVal(val); - } - } - else // we only want to update the param for a list of channels - { - for (int i = 0; i < channelList.length(); i++) - { - if (m_channels.contains(channelList[i])) - { - if (m_paramChannelAvailabilityMap[paramName].contains(channelList[i])) - { - retValue += m_channels[channelList[i]].m_channelParam[paramName].setVal(val); - } - } - else - { - retValue += ito::RetVal(ito::retError, 0, QString("unknown channel %1").arg(channelList[i])); - } - - } - if (!retValue.containsError()) - { - //update m_params if the current default channel is listed in channelList or if the current default channel does not support the param (the param in m_params then is set to readonly) - if (channelList.contains(m_params["defaultChannel"].getVal()) || !m_paramChannelAvailabilityMap[paramName].contains(m_params["defaultChannel"].getVal())) - { - retValue += m_params[paramName].setVal(val); - } - } - } - - } - else - { - retValue += ito::RetVal(ito::retError, 0, QString("could not find parameter %1. Maybe the parameter is not registered").arg(paramName)); - } - if (paramName == "roi" && !retValue.containsError()) - { - retValue += roiChanged(channelList); - } - - return retValue; - } ito::RetVal AddInMultiChannelGrabber::setParamMeta(const QByteArray& paramName, ito::ParamMeta* meta, bool takeOwnerShip ,const QList& channelList/* = QList()*/) { @@ -832,47 +746,6 @@ namespace ito return retValue; } - - ito::RetVal AddInMultiChannelGrabber::roiChanged(const QList& channelList /*= QList()*/) - { - ito::RetVal retValue(ito::retOk); - if (channelList.isEmpty())//assume the roi changed for all channels - { - QMapIterator it(m_channels); - while (it.hasNext()) - { - it.next(); - const int* roi = m_channels[it.key()].m_channelParam["roi"].getVal(); - int height = roi[3]; - int width = roi[2]; - retValue += m_channels[it.key()].m_channelParam["sizex"].setVal(width); - retValue += m_channels[it.key()].m_channelParam["sizey"].setVal(height); - - } - const int* roi = m_params["roi"].getVal(); - int height = roi[3]; - int width = roi[2]; - retValue += m_params["sizex"].setVal(width); - retValue += m_params["sizey"].setVal(height); - } - else - { - for (int i = 0; i < channelList.length(); i++) - { - const int* roi = m_channels[channelList[i]].m_channelParam["roi"].getVal(); - retValue += m_channels[channelList[i]].m_channelParam["sizex"].setVal(roi[2]); - retValue += m_channels[channelList[i]].m_channelParam["sizey"].setVal(roi[3]); - - } - if (channelList.contains(m_params["defaultChannel"].getVal())) - { - const int* roi = m_params["roi"].getVal(); - retValue += m_params["sizex"].setVal(roi[2]); - retValue += m_params["sizey"].setVal(roi[3]); - } - } - return retValue; - } ito::RetVal AddInMultiChannelGrabber::getVal(QSharedPointer> dataObjMap, ItomSharedSemaphore* waitCond) { diff --git a/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst b/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst index 4248a94c8..06cfb149f 100644 --- a/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst +++ b/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst @@ -23,7 +23,7 @@ Base idea behind any DataIO Grabber plugin ------------------------------ -This is a subtype of DataIO for camera / framegrabber communication. Plugins of this type are inherited from **ito::AddInGrabber**. The data acquisition is managed as follows: +This is a subtype of DataIO for camera / framegrabber communication. Plugins of this type are inherited from **ito::AddInGrabber** or the newer **ito::AddInMultiChannelGrabber** section. For more information about the new **ito::AddInMultiChannelGrabber** interface please read the :ref:`addInMultiChannelGrabber` The data acquisition is managed as follows: * The methods **startDevice** and **stopDevice** open and close the capture logic of the devices to reduce CPU-load. For serial ports these functions are unnecessary. * The method **acquire** starts the DataIO grabbing a frame with the current parameters. The function returns after sending the trigger. The function should be callable several times without calling get-/copyVal(). @@ -154,6 +154,45 @@ If desired implement the following optional parameters in the map **m_params**: parameter **roi** which expects an array [left, top, width, height]. This parameter can easily be parametrized using the meta information ito::RectMeta and allows the direct configuration of the entire ROI or a single access to one of the four components, by passing the parametername *roi[0]*, *roi[1]*.... +.. _AddInMultiChannelGrabber: + +AddInMultiChannelGrabber +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This section describes the new AddInMultiChannelGrabber-Interface which replaces the previous AddInGrabber-Interface. The new interface allows the implementation +of grabbers with multiple channels like hyperspectral imagers or stereo-vision systems. To use the new interface a grabber plugin must be derived +from the class **ito::AddInMultiChannelGrabber**. + +By inheriting **ito::AddInMultiChannelGrabber** the plugin inherits a **QMap** called **m_channels**. Each element contained in **m_channels** represents +an individual channel. The **ChannelContainer** is a struct which looks as followed: + +.. code-block:: c++ + :linenos: + + struct ChannelContainer + { + ito::DataObject data; + QMap m_channelParam; + ChannelContainer() {}; + ChannelContainer(ito::Param roi, + ito::Param pixelFormat, + ito::Param sizex, + ito::Param sizey, + ito::Param axisOffset, + ito::Param axisScale) + { + m_channelParam.insert("pixelFormat", pixelFormat); + m_channelParam.insert("roi", roi); + m_channelParam.insert("sizex", sizex); + m_channelParam.insert("sizey", sizey); + m_channelParam.insert("axisOffset", axisOffset); + m_channelParam.insert("axisScale", axisScale); + } + }; + +As it can be seen each container has its own **ito::DataObject** called **data** for storing the captured data. Furthermore a **QMap** called **m_channelParam** for the storage +of channel specific parameters is included. By default the parameters **pixelFormat**, **roi**, **sizex**, **sizey**, **axisOffset** and **axisScale** are added to this Map. + AD-Converters diff --git a/python_unittests/multichannel_test.py b/python_unittests/multichannel_test.py index 491722168..55cd3e929 100644 --- a/python_unittests/multichannel_test.py +++ b/python_unittests/multichannel_test.py @@ -3,34 +3,22 @@ def channelSpecificFunc1(): cam = dataIO("DummyMultiChannelGrabber") - cam.setParam('defaultChannel','Channel_1') + cam.setParam('defaultChannel','channel_1') cam.setParam('channelSpecificParameter',200) -def channelSpecificFunc2(): +def test_invalidDefaultChannelErrorFunc(): cam = dataIO("DummyMultiChannelGrabber") - cam.setParam('channelSpecificParameter:Channel_1',200) + cam.setParam('defaultChannel', 'xyz') class MultiChannelDummyGrabberTest(unittest.TestCase): @classmethod def setUpClass(cls): pass - def test_setAndGetParamViaSuffix(self): + def channelSpecificFunc1(): cam = dataIO("DummyMultiChannelGrabber") - cam.setParam('defaultChannel', 'channel_0') - originalRoi = cam.getParam('roi') - cam.setParam('roi:channel_1', [0, 0, 20, 20]) - roiDefaultChannel = cam.getParam('roi') - roiChannel0 = cam.getParam('roi:channel_0') - roiChannel1 = cam.getParam('roi:channel_1') - cam.setParam('roi:channel_0', [0, 0, 50, 50]) - roiChannel0Modified = cam.getParam('roi:channel_0') - - self.assertEqual(originalRoi, roiChannel0) - self.assertNotEqual(originalRoi, roiChannel1) - self.assertEqual(roiChannel1, (0, 0, 20, 20)) - self.assertEqual(roiChannel0Modified,(0,0,50,50)) - self.assertEqual(roiDefaultChannel, roiChannel0) + cam.setParam('defaultChannel','Channel_1') + cam.setParam('channelSpecificParameter',200) def test_setAndGetParamViaDefaultChannel(self): cam = dataIO("DummyMultiChannelGrabber") @@ -46,13 +34,8 @@ def test_setAndGetParamViaDefaultChannel(self): self.assertEqual(originalRoi, channel0Roi) self.assertNotEqual(originalRoi, channel1Roi) - def test_channelSwitchAfterSuffixUsage(self): - cam = dataIO("DummyMultiChannelGrabber") - cam.setParam('defaultChannel', 'channel_0') - originalChannel = cam.getParam('defaultChannel') - cam.setParam('roi:channel_1', (0, 0, 40, 40)) - afterSuffixUsage = cam.getParam('defaultChannel') - self.assertEqual(originalChannel, afterSuffixUsage) + def test_invalidDefaultChannelErrorTest(self): + self.assertRaises(RuntimeError, test_invalidDefaultChannelErrorFunc) def test_invalidDefaultChannelTest(self): cam = dataIO("DummyMultiChannelGrabber") @@ -69,20 +52,6 @@ def test_invalidDefaultChannelTest(self): testParamDict[elem] = cam.getParam(elem) self.assertEqual(originalParamDict, testParamDict) - def test_invalidSuffixUsage(self): - cam = dataIO("DummyMultiChannelGrabber") - paramList = cam.getParamList() - originalParamDict = {} - for elem in paramList: - originalParamDict[elem] = cam.getParam(elem) - try: - cam.setParam('roi:channel_7', (0, 0, 40, 40)) - except RuntimeError: - pass - testParamDict = {} - for elem in paramList: - testParamDict[elem] = cam.getParam(elem) - self.assertEqual(originalParamDict, testParamDict) def test_getValByDict(self): cam=dataIO("DummyMultiChannelGrabber") @@ -92,7 +61,8 @@ def test_getValByDict(self): roi={} getValDict={} for elem in channelList: - roi[elem] = cam.getParam('roi:'+elem) + cam.setParam("defaultChannel", elem) + roi[elem] = cam.getParam('roi') getValDict[elem]=dataObject() cam.getVal(getValDict) for key in roi: @@ -107,7 +77,8 @@ def test_copyValByDict(self): roi={} getValDict={} for elem in channelList: - roi[elem] = cam.getParam('roi:'+elem) + cam.setParam('defaultChannel',elem) + roi[elem] = cam.getParam('roi') getValDict[elem]=dataObject() cam.copyVal(getValDict) for key in roi: @@ -117,7 +88,6 @@ def test_copyValByDict(self): def test_channelSpecific(self): self.assertRaises(RuntimeError, channelSpecificFunc1) - self.assertRaises(RuntimeError, channelSpecificFunc2) From 7f029967e7725bb00be980c39b6b89fd1e1bb5ed Mon Sep 17 00:00:00 2001 From: Robin Hahn Date: Sun, 26 Feb 2023 20:55:06 +0100 Subject: [PATCH 32/62] :books: some more documentation added --- .../07_plugins/development/plugin-dataIO.rst | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst b/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst index 06cfb149f..fa4b1cec3 100644 --- a/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst +++ b/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst @@ -193,6 +193,27 @@ an individual channel. The **ChannelContainer** is a struct which looks as follo As it can be seen each container has its own **ito::DataObject** called **data** for storing the captured data. Furthermore a **QMap** called **m_channelParam** for the storage of channel specific parameters is included. By default the parameters **pixelFormat**, **roi**, **sizex**, **sizey**, **axisOffset** and **axisScale** are added to this Map. +Like all plugins **ito::AddInMultiChannelGrabber** inherits from **ito::AddInBase** and therefore also contains a **m_params** member (**QMap**). This map contains all +parameters of all channels and also further global parameters. A new mandatory global parameter is the **defaultChannel** which is used to indicate the current selected channel wich +will be adressed if **getParam** or **setParam** is called. If a parameter is adressed which is not provided by the current default channel the parameter in the **m_params** map will +be set to read only. + +In the following it is described how to initialize a plugin derived from the **AddInMultiChannelGrabber** interface. The initialization is done by the same functions like with the former **ito::AddInGrabber** interface. +During the initialization the function **AddInMultiChannelGrabber::initializeDefaultConfiguration** must be called. The function takes as a first argument a **QMap** +containing a ChannelContainer for each channel of the plugin. The **QString** defines the name of the channel. Channel specific parameters must be added to the to the parameter map of +the corresponding **ChannelContainer**. If a value (or its meta information) of a parameter varies for the individual channels the parameter must be added to each parameter map. Keep in mind that the +**m_channelParam** by default allready contains some mandatory parameters, which have to be adapted to the plugin. For convenience a construtor of the **ChannelContainer** is available which takes +the mandatory parameters and adds them to the map. +Non channel specific parameters (parameters affecting all channels) must be passed to **AddInMultiChannelGrabber::initializeDefaultConfiguration** as a second argument. +**AddInMultiChannelGrabber::initializeDefaultConfiguration** iterates through all parameters and adds all of them to **m_params**. Parameters with the same name in multiple channels +are only added ones to the **m_params** list containing the value of the channel selected by the **defaultChannel** parameter which is automatically added to **m_params**. Furthermore the +**AddInMultiChannelGrabber::initializeDefaultConfiguration** adds all channels to the **channelList** parameter of type **ito::ParamBase::StringList**. + +When using the new grabber interface, a function called **setParameter** must be implemented. This function gets called by **AddInMultiChannelGrabber::setParam**. + + + + AD-Converters From 86873c4748ecde13151b6b4ce790c0b03a0702d7 Mon Sep 17 00:00:00 2001 From: Robin Hahn Date: Tue, 28 Feb 2023 14:55:16 +0100 Subject: [PATCH 33/62] :books: and renamed signal newData --- common/addInMultiChannelGrabber.h | 29 +++++++++++++++-- common/sources/addInMultiChannelGrabber.cpp | 31 +++---------------- .../07_plugins/development/plugin-dataIO.rst | 25 ++++++++++++--- 3 files changed, 52 insertions(+), 33 deletions(-) diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index 03c2d7e77..9d1639043 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -55,7 +55,32 @@ namespace ito { ito::DataObject data; QMap m_channelParam; - ChannelContainer(); + ChannelContainer() + { + ito::Param paramVal; + int roi[] = { 0, 0, 1, 1 }; + paramVal = ito::Param("roi", ito::ParamBase::IntArray, 4, roi, "roi"); + m_channelParam.insert("roi", paramVal); + + paramVal = ito::Param("sizex", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 1, 1, "sizex"); + m_channelParam.insert("sizex", paramVal); + + paramVal = ito::Param("sizey", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 1, 1, "sizey"); + m_channelParam.insert("sizey", paramVal); + + paramVal = ito::Param("pixelFormat", ito::ParamBase::String, "mono8", "pixelFormat"); + m_channelParam.insert("pixelFormat", paramVal); + + double axisOffset[] = { 0.0, 0.0 }; + paramVal = ito::Param("axisOffset", ito::ParamBase::DoubleArray, 2, axisOffset, "axis offset"); + m_channelParam.insert("axisOffset", paramVal); + + double axisScale[] = { 1.0, 1.0 }; + paramVal = ito::Param("axisScale", ito::ParamBase::DoubleArray, 2, axisScale, "axis scale"); + m_channelParam.insert("axisScale", paramVal); + }; + ~ChannelContainer() = default; + ChannelContainer(const ChannelContainer&) = default; ChannelContainer(ito::Param roi, ito::Param pixelFormat, ito::Param sizex, @@ -118,7 +143,7 @@ namespace ito signals: - void newGrabberData(QSharedPointer > dataObjMap); /*! > dataObjMap); /*!getName())) + { + paramUpdateList << val->getName(); + } if (!retValue.containsError() && !ok) { @@ -578,7 +557,7 @@ namespace ito ////! copies value m_params to the channel params of the current default channel ///*! //This method copies params of m_params to the params of the channel container if the param is contained in the channel container . This function is usally called after setParam to apply the changed entries of m_params to the corresponding channel container. - //If a parameter is not found in the channel container nothing happens. This function updates also sizex and sizey if roi or nothing is passed as key. + //If a parameter is not found in the channel container nothing happens. //\param [in] keyList indicates which params are copied. If the List is empty all Parameters of the current channel are updated. //\return retOk if everything was ok, else retError diff --git a/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst b/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst index fa4b1cec3..c6445a650 100644 --- a/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst +++ b/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst @@ -194,27 +194,42 @@ As it can be seen each container has its own **ito::DataObject** called **data** of channel specific parameters is included. By default the parameters **pixelFormat**, **roi**, **sizex**, **sizey**, **axisOffset** and **axisScale** are added to this Map. Like all plugins **ito::AddInMultiChannelGrabber** inherits from **ito::AddInBase** and therefore also contains a **m_params** member (**QMap**). This map contains all -parameters of all channels and also further global parameters. A new mandatory global parameter is the **defaultChannel** which is used to indicate the current selected channel wich -will be adressed if **getParam** or **setParam** is called. If a parameter is adressed which is not provided by the current default channel the parameter in the **m_params** map will +parameters of all channels and also further global parameters. A new mandatory global parameter is the **defaultChannel** which is used to indicate the current selected channel which +will be addressed if **getParam** or **setParam** is called. If a parameter is addressed which is not provided by the current default channel the parameter in the **m_params** map will be set to read only. In the following it is described how to initialize a plugin derived from the **AddInMultiChannelGrabber** interface. The initialization is done by the same functions like with the former **ito::AddInGrabber** interface. During the initialization the function **AddInMultiChannelGrabber::initializeDefaultConfiguration** must be called. The function takes as a first argument a **QMap** containing a ChannelContainer for each channel of the plugin. The **QString** defines the name of the channel. Channel specific parameters must be added to the to the parameter map of the corresponding **ChannelContainer**. If a value (or its meta information) of a parameter varies for the individual channels the parameter must be added to each parameter map. Keep in mind that the -**m_channelParam** by default allready contains some mandatory parameters, which have to be adapted to the plugin. For convenience a construtor of the **ChannelContainer** is available which takes +**m_channelParam** by default already contains some mandatory parameters, which have to be adapted to the plugin. For convenience a constructor of the **ChannelContainer** is available which takes the mandatory parameters and adds them to the map. Non channel specific parameters (parameters affecting all channels) must be passed to **AddInMultiChannelGrabber::initializeDefaultConfiguration** as a second argument. **AddInMultiChannelGrabber::initializeDefaultConfiguration** iterates through all parameters and adds all of them to **m_params**. Parameters with the same name in multiple channels are only added ones to the **m_params** list containing the value of the channel selected by the **defaultChannel** parameter which is automatically added to **m_params**. Furthermore the **AddInMultiChannelGrabber::initializeDefaultConfiguration** adds all channels to the **channelList** parameter of type **ito::ParamBase::StringList**. -When using the new grabber interface, a function called **setParameter** must be implemented. This function gets called by **AddInMultiChannelGrabber::setParam**. +When using the new grabber interface, a function called **setParameter** must be implemented. This function gets called by **AddInMultiChannelGrabber::setParam**. **AddInMultiChannelGrabber::setParam** +parses and checks the parameter followed by a call to **setParameter**. If the plugin consumes and updates the corresponding parameter the **bool** parameter **ok** should be set to true. If not +**AddInMultiChannelGrabber** will copy the value to parameter stored in m_param. Regardless if the parameter was processed or not **AddInMultiChannelGrabber::setParam** will synchronize the corresponding +parameter stored in **m_params** with the corresponding parameter stored in the channel parameter map. If a change of a parameter affects the value of other parameters the plugin has the possibility to trigger +an update of the additional changed parameters. For this, add the name of the additional changed parameter to the **QStringList** called **pendingUpdate** passed to the **setParameter** function by an argument. +If an update of a parameter affects a channel specific parameter of channel which is not the current default channel, the plugin can change the value of the parameter directly in the parameter map +of the corresponding channel container. If setParam is called on the mandatory parameter **roi** **sizex** and **sizey** will be updated automatically. A change of the **defaultChannel** must be +followed by a subsequent call of **AddInMultiChannelGrabber::switchDefaultChannel** to synchronize **m_param** with the channel parameter. If the channel switch is triggered by a call to +**AddInMultiChannelGrabber::setParam** **AddInMultiChannelGrabber::switchDefaultChannel** is called automatically. If for any reason the parameters stored in the **ChannelContainer** of the current default channel, +needs to be synchronized with the parameters stored in **m_params** this can be done by calling **AddInMultiChannelGrabber::applyParamsToChannelParams(const QStringList& keyList)**. - +The plugin needs to provide a function **getParameter**. This is called by **AddInMultiChannelGrabber::getParam**. If the boolean parameter **ok** is set to true inside of **getParameter** the value of the requested +parameter needs to be copied to the provided **ito::param** by the plugin. If **ok** stays false, the value copy procedure is carried out by **AddInMultiChannelGrabber**. +With the new AddInMultiChannelGrabber interface new versions of getVal and copyVal are introduced. The new functions offer the possibility to copy data captured by multiple channels by +a single function call. The functions expect a **QSharedPointer>** where the **QString** indicates the requested channels. The functions **getVal** and **copyVal** +with a single pointer to a **ito::DataObject** remains. +**AddInMultichannelGrabber** introduces a new signal called **newData**. If this signal is emitted with a **QSharedPointer >** containing a Map of new data. The **QString** should +contain the name of the channel which recorded the data stored in the **ito::DataObject**. The signal can used to trigger a python function. The signature of the Signal is **newData(QSharedPointer>)**. AD-Converters ------------------------------------- From d3d866345d77168d874cc6734a341469941d089a Mon Sep 17 00:00:00 2001 From: Krauter Date: Sat, 10 Jun 2023 20:55:30 +0200 Subject: [PATCH 34/62] Merged master into multichannelGrabber --- AddInManager/pluginModel.cpp | 86 +++++++++---------- Qitom/python/pythonPlugins.cpp | 2 +- Qitom/python/pythonQtConversion.cpp | 2 +- Qitom/widgets/AIManagerWidget.cpp | 30 +++---- Qitom/widgets/figureWidget.cpp | 2 +- README.md | 4 +- common/addInGrabber.h | 4 +- common/addInInterface.h | 2 +- common/addInMultiChannelGrabber.h | 6 +- common/sources/addInInterface.cpp | 4 +- common/sources/addInMultiChannelGrabber.cpp | 30 +++---- .../07_plugins/development/plugin-dataIO.rst | 22 ++--- plot/AbstractDObjFigure.h | 2 +- plot/sources/AbstractDObjFigure.cpp | 2 +- python_unittests/multichannel_test.py | 8 +- python_unittests/run_suite.py | 4 +- 16 files changed, 105 insertions(+), 105 deletions(-) diff --git a/AddInManager/pluginModel.cpp b/AddInManager/pluginModel.cpp index 498194010..04b679f6b 100644 --- a/AddInManager/pluginModel.cpp +++ b/AddInManager/pluginModel.cpp @@ -5,7 +5,7 @@ Universitaet Stuttgart, Germany This file is part of itom. - + itom is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public Licence as published by the Free Software Foundation; either version 2 of the Licence, or (at @@ -128,9 +128,9 @@ QModelIndex PlugInModel::getTypeNode(const int type) const } //------------------------------------------------------------------------------------- -/** +/** * @param -* @return +* @return */ Qt::ItemFlags PlugInModel::flags(const QModelIndex &index) const { @@ -140,7 +140,7 @@ Qt::ItemFlags PlugInModel::flags(const QModelIndex &index) const { return Qt::NoItemFlags; } - + tItemType itemType; size_t itemInternalData; @@ -148,7 +148,7 @@ Qt::ItemFlags PlugInModel::flags(const QModelIndex &index) const { return Qt::NoItemFlags; } - + if(itemType == itemInstance) { ito::AddInBase *aib = (ito::AddInBase*)(itemInternalData); @@ -175,7 +175,7 @@ Qt::ItemFlags PlugInModel::flags(const QModelIndex &index) const //------------------------------------------------------------------------------------- /** return parent element * @param [in] index the element's index for which the parent should be returned -* @return the parent element. +* @return the parent element. * */ QModelIndex PlugInModel::parent(const QModelIndex &index) const @@ -186,7 +186,7 @@ QModelIndex PlugInModel::parent(const QModelIndex &index) const { return QModelIndex(); } - + tItemType itemType; size_t itemInternalData; @@ -194,7 +194,7 @@ QModelIndex PlugInModel::parent(const QModelIndex &index) const { return QModelIndex(); } - + switch (itemType) { case itemCatDataIO: @@ -214,14 +214,14 @@ QModelIndex PlugInModel::parent(const QModelIndex &index) const { if (aiib->getType() == m_treeFixNodes[i]) { - return m_treeFixIndizes[i]; + return m_treeFixIndizes[i]; } }*/ } case itemInstance: { ito::AddInBase *aib = (ito::AddInBase*)(itemInternalData); ito::AddInInterfaceBase *aiib = aib->getBasePlugin(); - + if (aiib->getType() & ito::typeActuator) { for (int i = 0; i < d->m_pAIM->getActList()->count(); i++) @@ -406,7 +406,7 @@ QModelIndex PlugInModel::index(int row, int column, const QModelIndex &parent) c { return QModelIndex(); } - + if (parent.isValid() == false) { if (row >= 0 && row <= 2) @@ -538,11 +538,11 @@ void PlugInModel::setBackgroundColorInstancesWithPythonRef(const QColor &bgColor } //------------------------------------------------------------------------------------- -/** +/** * @param index * @param type * @param internalData -* @return bool +* @return bool * * */ @@ -625,7 +625,7 @@ bool PlugInModel::getModelIndexInfo( //check type of element const QHash *filters = d->m_pAIM->getFilterList(); QHash::const_iterator i = filters->constBegin(); - while (i != filters->constEnd()) + while (i != filters->constEnd()) { //check if index corresponds to this filter if ((void*)i.value() == internalPtr) @@ -641,7 +641,7 @@ bool PlugInModel::getModelIndexInfo( const QHash* widgets = d->m_pAIM->getAlgoWidgetList(); QHash::const_iterator j = widgets->constBegin(); - while (j != widgets->constEnd()) + while (j != widgets->constEnd()) { //check if index corresponds to this widget if ((void*)j.value() == internalPtr) @@ -681,13 +681,13 @@ bool PlugInModel::getModelIndexInfo( } //------------------------------------------------------------------------------------- -/** +/** * @param index * @param name * @param itemType * @param role * @param icon -* @return QVariant +* @return QVariant * * */ @@ -787,10 +787,10 @@ QVariant PlugInModel::getFixedNodeInfo( } //------------------------------------------------------------------------------------- -/** +/** * @param index * @param role -* @return QVariant +* @return QVariant * * */ @@ -945,10 +945,10 @@ QVariant PlugInModel::getPluginNodeInfo(const QModelIndex &index, const int &rol } //------------------------------------------------------------------------------------- -/** +/** * @param index * @param role -* @return QVariant +* @return QVariant * * */ @@ -1044,11 +1044,11 @@ QVariant PlugInModel::getInstanceNodeInfo(const QModelIndex &index, const int &r } //------------------------------------------------------------------------------------- -/** +/** * @param index * @param role * @param filterNotWidget -* @return QVariant +* @return QVariant * * */ @@ -1073,7 +1073,7 @@ QVariant PlugInModel::getFilterOrWidgetNodeInfo( name = &(widgetDef->m_name); description = &(widgetDef->m_description); } - + if (role == Qt::DisplayRole) { switch (index.column()) @@ -1213,7 +1213,7 @@ QVariant PlugInModel::getFilterOrWidgetNodeInfo( //------------------------------------------------------------------------------------- /** return data elements for a given row * @param [in] index index for which the data elements should be delivered -* @param [in] role the current role of the model +* @param [in] role the current role of the model * @return data of the selected element, depending on the element's row and column (passed in * index.row and index.column) * @@ -1233,7 +1233,7 @@ QVariant PlugInModel::data(const QModelIndex &index, int role) const { return QVariant(); } - + switch (itemType) { case itemCatDataIO: { @@ -1312,9 +1312,9 @@ QVariant PlugInModel::data(const QModelIndex &index, int role) const } //------------------------------------------------------------------------------------- -/** +/** * @param ai -* @return QModelIndex +* @return QModelIndex * * */ @@ -1348,9 +1348,9 @@ QModelIndex PlugInModel::getIndexByAddIn(ito::AddInBase *ai) const } //------------------------------------------------------------------------------------- -/** +/** * @param aib -* @return QModelIndex +* @return QModelIndex * * */ @@ -1439,16 +1439,16 @@ QModelIndex PlugInModel::getIndexByAddInInterface(AddInInterfaceBase *aib) const } break; } - } - + } + return QModelIndex(); } //------------------------------------------------------------------------------------- -/** +/** * @param itemType * @param internalData -* @return bool +* @return bool * * */ @@ -1466,10 +1466,10 @@ bool PlugInModel::getIsAlgoPlugIn(tItemType &itemType, size_t &internalData) con } //------------------------------------------------------------------------------------- -/** +/** * @param itemType * @param internalData -* @return bool +* @return bool * * */ @@ -1487,10 +1487,10 @@ bool PlugInModel::getIsGrabberInstance(tItemType &itemType, size_t &internalData } //------------------------------------------------------------------------------------- -/** +/** * @param addInInterface * @param beginOperation -* @return bool +* @return bool * * */ @@ -1517,11 +1517,11 @@ bool PlugInModel::insertInstance(ito::AddInInterfaceBase* addInInterface, bool b } //------------------------------------------------------------------------------------- -/** +/** * @param addInInterface * @param addInInstance * @param beginOperation -* @return bool +* @return bool * * */ @@ -1549,9 +1549,9 @@ bool PlugInModel::deleteInstance(ito::AddInBase *addInInstance, const bool begin } //------------------------------------------------------------------------------------- -/** +/** * @param beginOperation -* @return bool +* @return bool * * */ @@ -1635,7 +1635,7 @@ QString PlugInModel::getInitCommand(const QModelIndex &item) const QVector optParams; QVector outParams; paramFunc(&mandParams, &optParams, &outParams); - + foreach (const auto& item, mandParams) { listParam.append(item.getName()); diff --git a/Qitom/python/pythonPlugins.cpp b/Qitom/python/pythonPlugins.cpp index 05aab9a1d..7df2e4b8a 100644 --- a/Qitom/python/pythonPlugins.cpp +++ b/Qitom/python/pythonPlugins.cpp @@ -4138,7 +4138,7 @@ PyObject* PythonPlugins::PyDataIOPlugin_getVal(PyDataIOPlugin *self, PyObject *a { PyErr_Clear(); PyErr_SetString( - PyExc_RuntimeError, + PyExc_RuntimeError, "arguments of method must be either one data object, a dictionary containing data objects, a byte array or a " "byte object."); return NULL; diff --git a/Qitom/python/pythonQtConversion.cpp b/Qitom/python/pythonQtConversion.cpp index 3e22687cf..b0d6eaa43 100644 --- a/Qitom/python/pythonQtConversion.cpp +++ b/Qitom/python/pythonQtConversion.cpp @@ -3473,7 +3473,7 @@ PyObject* PythonQtConversion::ConvertQtValueToPythonInternal(int type, const voi { return QMapToPyObject(**sharedPtr); } - + } else if (strcmp(name, "QPointer") == 0 || \ strcmp(name, "QPointer") == 0 || \ diff --git a/Qitom/widgets/AIManagerWidget.cpp b/Qitom/widgets/AIManagerWidget.cpp index fd20c5aa7..dc81ed0e1 100644 --- a/Qitom/widgets/AIManagerWidget.cpp +++ b/Qitom/widgets/AIManagerWidget.cpp @@ -5,7 +5,7 @@ Universitaet Stuttgart, Germany This file is part of itom. - + itom is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public Licence as published by the Free Software Foundation; either version 2 of the Licence, or (at @@ -165,7 +165,7 @@ AIManagerWidget::AIManagerWidget( m_pAIManagerView->setColumnHidden(i, m_pAIManagerView->columnWidth(i) == 0); } settings->endArray(); - + m_pColumnWidth = new int[m_pPlugInModel->columnCount()]; size = settings->beginReadArray("StandardColWidth"); @@ -213,7 +213,7 @@ AIManagerWidget::~AIManagerWidget() QSettings *settings = new QSettings(setFile, QSettings::IniFormat); settings->beginGroup("itomPluginsDockWidget"); - + // QByteArray state = m_pMainToolbar->saveGeometry(); // settings->setValue("stateToolBar", state); @@ -227,7 +227,7 @@ AIManagerWidget::~AIManagerWidget() settings->endArray(); settings->sync(); - + settings->beginWriteArray("StandardColWidth"); for (int i = 0; i < plugInModel->columnCount(); i++) @@ -595,7 +595,7 @@ void AIManagerWidget::mnuShowConfdialog() ais->hasConfDialog()) { ito::RetVal retValue = ais->showConfDialog(); - + if (retValue.containsWarning()) { QString message = tr("Warning while showing configuration dialog. Message: %1") @@ -930,7 +930,7 @@ void AIManagerWidget::mnuOpenWidget() void AIManagerWidget::mnuShowAlgoWidget(ito::AddInAlgo::AlgoWidgetDef* awd) { QMessageBox msgBox; - + ito::RetVal retValue(retOk); QVector paramsMand; @@ -965,7 +965,7 @@ void AIManagerWidget::mnuShowAlgoWidget(ito::AddInAlgo::AlgoWidgetDef* awd) return; } } - + UiOrganizer *uiOrganizer = qobject_cast(AppManagement::getUiOrganizer()); QSharedPointer dialogHandle(new unsigned int); QSharedPointer retCodeIfModal(new int); @@ -1026,7 +1026,7 @@ void AIManagerWidget::mnuShowAlgoWidget(ito::AddInAlgo::AlgoWidgetDef* awd) ito::retError, 0, tr("Could not find instance of UiOrganizer").toLatin1().data()); } } - + if (retValue.containsError()) { msgBox.setText(tr("Error while opening user interface from plugin.")); @@ -1194,7 +1194,7 @@ void AIManagerWidget::mnuToggleAutoGrabbing() //------------------------------------------------------------------------------------- void AIManagerWidget::setTreeViewHideColumns(const bool &hide, const int colCount) { - for (int i = 1; i < colCount; ++i) + for (int i = 1; i < colCount; ++i) { m_pAIManagerView->setColumnHidden(i, hide); } @@ -1252,7 +1252,7 @@ void AIManagerWidget::showDetails() if (isList) { - for (int i = 0; i < plugInModel->columnCount(); ++i) + for (int i = 0; i < plugInModel->columnCount(); ++i) { m_pAIManagerView->setColumnWidth(i, m_pColumnWidth[i]); } @@ -1275,18 +1275,18 @@ void AIManagerWidget::mnuShowInfo() PlugInModel::tItemType itemType; size_t itemInternalData; PlugInModel* plugInModel = (PlugInModel*)(index.model()); - + if (plugInModel->getModelIndexInfo(index, itemType, itemInternalData)) { if (itemType & PlugInModel::itemFilter) - { // Filter + { // Filter ito::AddInAlgo::FilterDef *awd = (ito::AddInAlgo::FilterDef*)itemInternalData; emit showPluginInfo( "Algorithms." + awd->m_pBasePlugin->objectName() + "." + awd->m_name, HelpTreeDockWidget::typeFilter); } else if(itemType & PlugInModel::itemWidget) - { // Widget + { // Widget ito::AddInAlgo::AlgoWidgetDef* awd = (ito::AddInAlgo::AlgoWidgetDef*)itemInternalData; emit showPluginInfo( @@ -1318,12 +1318,12 @@ void AIManagerWidget::mnuShowInfo() emit showPluginInfo( "DataIO.Raw IO." + aib->objectName(), HelpTreeDockWidget::typeDataIO); } - } + } else if (aib->getType() & ito::typeAlgo) { emit showPluginInfo( "Algorithms." + aib->objectName(), HelpTreeDockWidget::typeFPlugin); - } + } } } } diff --git a/Qitom/widgets/figureWidget.cpp b/Qitom/widgets/figureWidget.cpp index 8f2f807ce..973c7bda5 100644 --- a/Qitom/widgets/figureWidget.cpp +++ b/Qitom/widgets/figureWidget.cpp @@ -497,7 +497,7 @@ RetVal FigureWidget::liveImage( { QSharedPointer paramFormat = getParamByInvoke(cam.data(), "pixelFormat", retval); const char * pixelFormat = paramFormat->getVal(); - int min, max = 0; + int min, max = 0; bool ok = false; AddInAbstractGrabber::integerPixelFormatStringToMinMaxValue(pixelFormat, min, max, ok); if (ok) diff --git a/README.md b/README.md index ed090ef7c..26a9c3ffb 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ In order to learn more about [``itom``](https://itom-project.github.io/ "``itom` ## What is this project for? -This project contains the core application of: +This project contains the core application of: * [itom](https://github.com/itom-project/itom) core application Furthermore, you may also need the ``plugins`` and ``designer plugins`` repositories to get all itom functionalities. @@ -66,7 +66,7 @@ All plugins and designer-plugins that can be integrated into itom can have their > Germany -in co-operation with +in co-operation with > [twip Optical Solutions GmbH](http://www.twip-os.com) > Stuttgart diff --git a/common/addInGrabber.h b/common/addInGrabber.h index 7067eb214..5a675441e 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -88,7 +88,7 @@ namespace ito */ int m_started; - AddInAbstractGrabberPrivate *dd; + AddInAbstractGrabberPrivate *dd; protected: @@ -156,7 +156,7 @@ namespace ito { Q_OBJECT private: - + AddInGrabberPrivate *dd; protected: ito::DataObject m_data; /*!< variable for the recently grabbed image*/ diff --git a/common/addInInterface.h b/common/addInInterface.h index 885bcea82..fe7b9222a 100644 --- a/common/addInInterface.h +++ b/common/addInInterface.h @@ -859,7 +859,7 @@ class ITOMCOMMONQT_EXPORT AddInDataIO : public AddInBase //! dataObjects for different channels. Output is a shallow-copy to the grabber internal buffer-object. virtual ito::RetVal getVal(QSharedPointer> dataObjMap, ItomSharedSemaphore *waitCond = NULL); - + virtual ito::RetVal getVal(ItomSharedSemaphore* waitCond = NULL); //! read data from the device into a dataObject (which is passed as void pointer actually). Output is a deep-copy to //! the grabber internal object. diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index 9d1639043..f02039cb2 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -105,7 +105,7 @@ namespace ito virtual ito::RetVal switchDefaultChannel();/*!< synchronizes m_params with the params of default channel container */ virtual ito::RetVal applyParamsToChannelParams(const QStringList& keyList = QStringList()); void initializeDefaultConfiguration(const QMap& channelContainerMap, const QMap& nonChannelSpecificParams = QMap());/*!< sets the channel parameters.*/ - + ito::RetVal setParamMeta(const QByteArray& paramName, ito::ParamMeta* meta, bool takeOwnerShip, const QList& channelList = QList()); ito::RetVal setParamFlags(const QByteArray& paramName, const unsigned int& flags, const QList& channelList = QList()); @@ -122,7 +122,7 @@ namespace ito //\param [in] index of the parameter //\param [in] hasIndex is set to true if parameter has an index //\param [in] set ok to true if parameter was processed - //\param [in] add key of changed channel specific parameters to pendingUpdate. + //\param [in] add key of changed channel specific parameters to pendingUpdate. //\return retOk if everything was ok, else retError //*/ virtual ito::RetVal setParameter(QSharedPointer& val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok, QStringList &pendingUpdate) = 0; @@ -147,4 +147,4 @@ namespace ito }; } #endif -#endif \ No newline at end of file +#endif diff --git a/common/sources/addInInterface.cpp b/common/sources/addInInterface.cpp index 8cd4997c3..33b52842d 100644 --- a/common/sources/addInInterface.cpp +++ b/common/sources/addInInterface.cpp @@ -427,7 +427,7 @@ namespace ito moveToThread(d->m_pThread); d->m_pThread->start(); - /*set new seed for random generator of OpenCV. + /*set new seed for random generator of OpenCV. This is required to have real random values for any randn or randu command. The seed must be set in every thread. This is for the main thread. */ @@ -886,7 +886,7 @@ namespace ito { m_autoGrabbingListeners.insert("",obj); } - else + else { m_autoGrabbingListeners.insert(defaultChannel, obj); } diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index 151910a87..74ec2c3d9 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -100,7 +100,7 @@ namespace ito QMapIterator channel(channelContainerMap); QVector channelList; QMapinitialParams = m_params; - while (channel.hasNext()) + while (channel.hasNext()) { channel.next(); QMapIterator channelParamIterator(channel.value().m_channelParam); @@ -119,7 +119,7 @@ namespace ito { m_paramChannelAvailabilityMap[channelParamIterator.key()].append(channel.key()); } - + } channelList.append(channel.key().toLatin1().data()); } @@ -135,7 +135,7 @@ namespace ito assert(!m_paramChannelAvailabilityMap.contains(nonChannelSpecificParamsIt.key())); m_paramChannelAvailabilityMap.insert(nonChannelSpecificParamsIt.key(), QStringList()); m_params.insert(nonChannelSpecificParamsIt.key(), nonChannelSpecificParamsIt.value()); - + } QMapIterator initialParamsIt(initialParams); while (initialParamsIt.hasNext()) @@ -146,7 +146,7 @@ namespace ito } m_defaultConfigReady = true; switchDefaultChannel(); - + } } @@ -188,7 +188,7 @@ namespace ito { retValue += ito::RetVal(ito::retWarning, 1001, tr("could not set axis scale or axis offset since the array length of at least one parameter does not fit to the dataObject size.").toLatin1().data()); } - + if (!QMetaObject::invokeMethod(it.value(), "setSource", Q_ARG(QSharedPointer, pDObj), Q_ARG(ItomSharedSemaphore*, NULL))) { retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); @@ -429,7 +429,7 @@ namespace ito // This function parses the given parameter and calls setParameter. If the bool parameter ok in the setParameter (to be implemented in the individual plugins) // function returns false, it gets assumed that the plugin didn't process the parameter. In this case the value of the parameter gets copied here. // If the parameter name is "roi" sizex and sizey gets updated by setParam. If the key of the parameter is "defaultChannel" the function "switchDefaultChannel" gets called. - // Both happens also if the "ok" value of setParameter is true. + // Both happens also if the "ok" value of setParameter is true. // "applyParamsToChannelParams" is called to synchronize the parameters of the channel container follwed by a call of checkData. //\param [in] val is a QSharedPOinter of type ParamBase containing the paremeter to be set. @@ -453,7 +453,7 @@ namespace ito if (!retValue.containsError()) { retValue += setParameter(val, it, suffix, key, index, hasIndex, ok, paramUpdateList); - if (ok && !paramUpdateList.contains(val->getName())) + if (ok && !paramUpdateList.contains(val->getName())) { paramUpdateList << val->getName(); } @@ -554,12 +554,12 @@ namespace ito return retValue; } ////---------------------------------------------------------------------------------------------------------------------------------- - ////! copies value m_params to the channel params of the current default channel + ////! copies value m_params to the channel params of the current default channel ///*! - //This method copies params of m_params to the params of the channel container if the param is contained in the channel container . This function is usally called after setParam to apply the changed entries of m_params to the corresponding channel container. + //This method copies params of m_params to the params of the channel container if the param is contained in the channel container . This function is usally called after setParam to apply the changed entries of m_params to the corresponding channel container. //If a parameter is not found in the channel container nothing happens. - //\param [in] keyList indicates which params are copied. If the List is empty all Parameters of the current channel are updated. + //\param [in] keyList indicates which params are copied. If the List is empty all Parameters of the current channel are updated. //\return retOk if everything was ok, else retError //*/ ito::RetVal AddInMultiChannelGrabber::applyParamsToChannelParams(const QStringList& keyList) @@ -610,7 +610,7 @@ namespace ito ///*! //Call this function to update sizex and sizey. If the roi is changed via setParam this function will be called automatically. //Note: Do not forget to apply the changes to the channel parameters by calling applyParamsToChannelParams after calling this function. - + //\return retOk if everything was ok, else retError //*/ void AddInMultiChannelGrabber::updateSizeXY() @@ -658,7 +658,7 @@ namespace ito } if (!retValue.containsError()) { - //update m_params if the current default channel is listed in channelList or if the current default channel does not support the param (the param in m_params then is set to readonly) + //update m_params if the current default channel is listed in channelList or if the current default channel does not support the param (the param in m_params then is set to readonly) if (channelList.contains(m_params["defaultChannel"].getVal()) || !m_paramChannelAvailabilityMap[paramName].contains(m_params["defaultChannel"].getVal())) { m_params[paramName].setMeta(meta, takeOwnerShip); @@ -674,7 +674,7 @@ namespace ito return retValue; } - + ito::RetVal AddInMultiChannelGrabber::setParamFlags(const QByteArray& paramName, const unsigned int& flags, const QList& channelList/* = QList()*/) { assert(m_defaultConfigReady); @@ -709,7 +709,7 @@ namespace ito } if (!retValue.containsError()) { - //update m_params if the current default channel is listed in channelList or if the current default channel does not support the param (the param in m_params then is set to readonly) + //update m_params if the current default channel is listed in channelList or if the current default channel does not support the param (the param in m_params then is set to readonly) if (channelList.contains(m_params["defaultChannel"].getVal()) || !m_paramChannelAvailabilityMap[paramName].contains(m_params["defaultChannel"].getVal())) { m_params[paramName].setFlags(flags); @@ -778,4 +778,4 @@ namespace ito return retval; } -}//end namespace ito \ No newline at end of file +}//end namespace ito diff --git a/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst b/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst index 6025cb561..15dec4d11 100644 --- a/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst +++ b/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst @@ -159,7 +159,7 @@ If desired implement the following optional parameters in the map **m_params**: AddInMultiChannelGrabber ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -This section describes the new AddInMultiChannelGrabber-Interface which replaces the previous AddInGrabber-Interface. The new interface allows the implementation +This section describes the new AddInMultiChannelGrabber-Interface which replaces the previous AddInGrabber-Interface. The new interface allows the implementation of grabbers with multiple channels like hyperspectral imagers or stereo-vision systems. To use the new interface a grabber plugin must be derived from the class **ito::AddInMultiChannelGrabber**. @@ -168,7 +168,7 @@ an individual channel. The **ChannelContainer** is a struct which looks as follo .. code-block:: c++ :linenos: - + struct ChannelContainer { ito::DataObject data; @@ -196,36 +196,36 @@ of channel specific parameters is included. By default the parameters **pixelFor Like all plugins **ito::AddInMultiChannelGrabber** inherits from **ito::AddInBase** and therefore also contains a **m_params** member (**QMap**). This map contains all parameters of all channels and also further global parameters. A new mandatory global parameter is the **defaultChannel** which is used to indicate the current selected channel which will be addressed if **getParam** or **setParam** is called. If a parameter is addressed which is not provided by the current default channel the parameter in the **m_params** map will -be set to read only. +be set to read only. In the following it is described how to initialize a plugin derived from the **AddInMultiChannelGrabber** interface. The initialization is done by the same functions like with the former **ito::AddInGrabber** interface. During the initialization the function **AddInMultiChannelGrabber::initializeDefaultConfiguration** must be called. The function takes as a first argument a **QMap** containing a ChannelContainer for each channel of the plugin. The **QString** defines the name of the channel. Channel specific parameters must be added to the to the parameter map of the corresponding **ChannelContainer**. If a value (or its meta information) of a parameter varies for the individual channels the parameter must be added to each parameter map. Keep in mind that the -**m_channelParam** by default already contains some mandatory parameters, which have to be adapted to the plugin. For convenience a constructor of the **ChannelContainer** is available which takes +**m_channelParam** by default already contains some mandatory parameters, which have to be adapted to the plugin. For convenience a constructor of the **ChannelContainer** is available which takes the mandatory parameters and adds them to the map. -Non channel specific parameters (parameters affecting all channels) must be passed to **AddInMultiChannelGrabber::initializeDefaultConfiguration** as a second argument. +Non channel specific parameters (parameters affecting all channels) must be passed to **AddInMultiChannelGrabber::initializeDefaultConfiguration** as a second argument. **AddInMultiChannelGrabber::initializeDefaultConfiguration** iterates through all parameters and adds all of them to **m_params**. Parameters with the same name in multiple channels -are only added ones to the **m_params** list containing the value of the channel selected by the **defaultChannel** parameter which is automatically added to **m_params**. Furthermore the +are only added ones to the **m_params** list containing the value of the channel selected by the **defaultChannel** parameter which is automatically added to **m_params**. Furthermore the **AddInMultiChannelGrabber::initializeDefaultConfiguration** adds all channels to the **channelList** parameter of type **ito::ParamBase::StringList**. When using the new grabber interface, a function called **setParameter** must be implemented. This function gets called by **AddInMultiChannelGrabber::setParam**. **AddInMultiChannelGrabber::setParam** parses and checks the parameter followed by a call to **setParameter**. If the plugin consumes and updates the corresponding parameter the **bool** parameter **ok** should be set to true. If not **AddInMultiChannelGrabber** will copy the value to parameter stored in m_param. Regardless if the parameter was processed or not **AddInMultiChannelGrabber::setParam** will synchronize the corresponding -parameter stored in **m_params** with the corresponding parameter stored in the channel parameter map. If a change of a parameter affects the value of other parameters the plugin has the possibility to trigger +parameter stored in **m_params** with the corresponding parameter stored in the channel parameter map. If a change of a parameter affects the value of other parameters the plugin has the possibility to trigger an update of the additional changed parameters. For this, add the name of the additional changed parameter to the **QStringList** called **pendingUpdate** passed to the **setParameter** function by an argument. If an update of a parameter affects a channel specific parameter of channel which is not the current default channel, the plugin can change the value of the parameter directly in the parameter map of the corresponding channel container. If setParam is called on the mandatory parameter **roi** **sizex** and **sizey** will be updated automatically. A change of the **defaultChannel** must be -followed by a subsequent call of **AddInMultiChannelGrabber::switchDefaultChannel** to synchronize **m_param** with the channel parameter. If the channel switch is triggered by a call to +followed by a subsequent call of **AddInMultiChannelGrabber::switchDefaultChannel** to synchronize **m_param** with the channel parameter. If the channel switch is triggered by a call to **AddInMultiChannelGrabber::setParam** **AddInMultiChannelGrabber::switchDefaultChannel** is called automatically. If for any reason the parameters stored in the **ChannelContainer** of the current default channel, needs to be synchronized with the parameters stored in **m_params** this can be done by calling **AddInMultiChannelGrabber::applyParamsToChannelParams(const QStringList& keyList)**. -The plugin needs to provide a function **getParameter**. This is called by **AddInMultiChannelGrabber::getParam**. If the boolean parameter **ok** is set to true inside of **getParameter** the value of the requested +The plugin needs to provide a function **getParameter**. This is called by **AddInMultiChannelGrabber::getParam**. If the boolean parameter **ok** is set to true inside of **getParameter** the value of the requested parameter needs to be copied to the provided **ito::param** by the plugin. If **ok** stays false, the value copy procedure is carried out by **AddInMultiChannelGrabber**. -With the new AddInMultiChannelGrabber interface new versions of getVal and copyVal are introduced. The new functions offer the possibility to copy data captured by multiple channels by -a single function call. The functions expect a **QSharedPointer>** where the **QString** indicates the requested channels. The functions **getVal** and **copyVal** +With the new AddInMultiChannelGrabber interface new versions of getVal and copyVal are introduced. The new functions offer the possibility to copy data captured by multiple channels by +a single function call. The functions expect a **QSharedPointer>** where the **QString** indicates the requested channels. The functions **getVal** and **copyVal** with a single pointer to a **ito::DataObject** remains. **AddInMultichannelGrabber** introduces a new signal called **newData**. If this signal is emitted with a **QSharedPointer >** containing a Map of new data. The **QString** should diff --git a/plot/AbstractDObjFigure.h b/plot/AbstractDObjFigure.h index f4ac26a22..2b8293c08 100644 --- a/plot/AbstractDObjFigure.h +++ b/plot/AbstractDObjFigure.h @@ -64,7 +64,7 @@ class ITOMCOMMONPLOT_EXPORT AbstractDObjFigure : public AbstractFigure Q_CLASSINFO("prop://zAxisInterval", "Sets the visible range of the displayed z-axis (in coordinates of the data object). Set it to 'auto' if range should be automatically set [default].") Q_CLASSINFO("prop://colorMap", "Color map (string) that should be used to colorize a non-color data object.") Q_CLASSINFO("prop://cameraChannel", "If a multi channel device (MultiChannelGrabber) is connected to this plot, the currently displayed channel of the device can be set. To obtain a list of the available channels see the parameter channelList of the device") - + Q_CLASSINFO("slot://setSource", "This slot can be implemented by any plot plugin to send a dataObject to the plot. Here it is not required and therefore not implemented.") Q_CLASSINFO("slot://setLinePlot", "This slot can be implemented by any plot plugin to force the plot to open a line plot. Here it is not required and therefore not implemented.") private: diff --git a/plot/sources/AbstractDObjFigure.cpp b/plot/sources/AbstractDObjFigure.cpp index 620b31489..1125f8b0f 100644 --- a/plot/sources/AbstractDObjFigure.cpp +++ b/plot/sources/AbstractDObjFigure.cpp @@ -454,7 +454,7 @@ ito::RetVal AbstractDObjFigure::setDisplayedCameraChannel(const QString& channel } - + return retValue; } //------------------------------------------------------------------------------------- diff --git a/python_unittests/multichannel_test.py b/python_unittests/multichannel_test.py index 55cd3e929..b90791e61 100644 --- a/python_unittests/multichannel_test.py +++ b/python_unittests/multichannel_test.py @@ -36,7 +36,7 @@ def test_setAndGetParamViaDefaultChannel(self): def test_invalidDefaultChannelErrorTest(self): self.assertRaises(RuntimeError, test_invalidDefaultChannelErrorFunc) - + def test_invalidDefaultChannelTest(self): cam = dataIO("DummyMultiChannelGrabber") paramList = cam.getParamList() @@ -89,7 +89,7 @@ def test_copyValByDict(self): def test_channelSpecific(self): self.assertRaises(RuntimeError, channelSpecificFunc1) - - + + if __name__ == '__main__': - unittest.main(module='multichannel_test', exit=False) \ No newline at end of file + unittest.main(module='multichannel_test', exit=False) diff --git a/python_unittests/run_suite.py b/python_unittests/run_suite.py index 60941b7c3..e5f557f7b 100644 --- a/python_unittests/run_suite.py +++ b/python_unittests/run_suite.py @@ -42,9 +42,9 @@ def suite(): suite.addTest(unittest.makeSuite(shape_test.ShapeTest)) suite.addTest(unittest.makeSuite(datatype_conversion_test.DatatypeConversionTest)) suite.addTest(unittest.makeSuite(pointcloud_pickle.PointCloudPickle)) - suite.addTest(unittest.makeSuite(idc_test.IdcTest)) + suite.addTest(unittest.makeSuite(idc_test.IdcTest)) suite.addTest(unittest.makeSuite(multichannel_test.MultiChannelDummyGrabberTest)) - + if pyversion >= (3, 6): suite.addTest(unittest.makeSuite(itom_stubs_generator.ItomStubsGenTest)) suite.addTest(unittest.makeSuite(itom_jedilib.ItomJediLibTest)) From 25bcca0f61689044603313d2b4a227f9b7853d03 Mon Sep 17 00:00:00 2001 From: photoniker Date: Sat, 10 Jun 2023 23:23:17 +0200 Subject: [PATCH 35/62] deleted new otherwise in future this looks bad --- .../07_plugins/development/plugin-dataIO.rst | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst b/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst index 15dec4d11..843b75698 100644 --- a/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst +++ b/docs/userDoc/source/07_plugins/development/plugin-dataIO.rst @@ -23,7 +23,7 @@ Base idea behind any DataIO Grabber plugin ------------------------------ -This is a subtype of DataIO for camera / framegrabber communication. Plugins of this type are inherited from **ito::AddInGrabber** or the newer **ito::AddInMultiChannelGrabber** section. For more information about the new **ito::AddInMultiChannelGrabber** interface please read the :ref:`addInMultiChannelGrabber` The data acquisition is managed as follows: +This is a subtype of DataIO for camera / framegrabber communication. Plugins of this type are inherited from **ito::AddInGrabber** or the **ito::AddInMultiChannelGrabber** section. For more information about the **ito::AddInMultiChannelGrabber** interface please read the :ref:`addInMultiChannelGrabber` The data acquisition is managed as follows: * The methods **startDevice** and **stopDevice** open and close the capture logic of the devices to reduce CPU-load. For serial ports these functions are unnecessary. * The method **acquire** starts the DataIO grabbing a frame with the current parameters. The function returns after sending the trigger. The function should be callable several times without calling get-/copyVal(). @@ -37,7 +37,8 @@ A typical sequence in python is .. code-block:: python :linenos: - + + dObj = dataObject() device.startDevice() device.acquire() device.getVal(dObj) @@ -159,8 +160,8 @@ If desired implement the following optional parameters in the map **m_params**: AddInMultiChannelGrabber ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -This section describes the new AddInMultiChannelGrabber-Interface which replaces the previous AddInGrabber-Interface. The new interface allows the implementation -of grabbers with multiple channels like hyperspectral imagers or stereo-vision systems. To use the new interface a grabber plugin must be derived +This section describes the AddInMultiChannelGrabber-Interface which replaces the previous AddInGrabber-Interface. The interface allows the implementation +of grabbers with multiple channels like hyperspectral imagers or stereo-vision systems. To use the interface a grabber plugin must be derived from the class **ito::AddInMultiChannelGrabber**. By inheriting **ito::AddInMultiChannelGrabber** the plugin inherits a **QMap** called **m_channels**. Each element contained in **m_channels** represents @@ -191,16 +192,16 @@ an individual channel. The **ChannelContainer** is a struct which looks as follo }; As it can be seen each container has its own **ito::DataObject** called **data** for storing the captured data. Furthermore a **QMap** called **m_channelParam** for the storage -of channel specific parameters is included. By default the parameters **pixelFormat**, **roi**, **sizex**, **sizey**, **axisOffset** and **axisScale** are added to this Map. +of channel specific parameters is included. By default the parameters **pixelFormat**, **roi**, **sizex**, **sizey**, **axisOffset** and **axisScale** are added to this map. Like all plugins **ito::AddInMultiChannelGrabber** inherits from **ito::AddInBase** and therefore also contains a **m_params** member (**QMap**). This map contains all -parameters of all channels and also further global parameters. A new mandatory global parameter is the **defaultChannel** which is used to indicate the current selected channel which +parameters of all channels and also further global parameters. A mandatory global parameter is the **defaultChannel** which is used to indicate the current selected channel which will be addressed if **getParam** or **setParam** is called. If a parameter is addressed which is not provided by the current default channel the parameter in the **m_params** map will be set to read only. In the following it is described how to initialize a plugin derived from the **AddInMultiChannelGrabber** interface. The initialization is done by the same functions like with the former **ito::AddInGrabber** interface. During the initialization the function **AddInMultiChannelGrabber::initializeDefaultConfiguration** must be called. The function takes as a first argument a **QMap** -containing a ChannelContainer for each channel of the plugin. The **QString** defines the name of the channel. Channel specific parameters must be added to the to the parameter map of +containing a **ChannelContainer** for each channel of the plugin. The **QString** defines the name of the channel. Channel specific parameters must be added to the to the parameter map of the corresponding **ChannelContainer**. If a value (or its meta information) of a parameter varies for the individual channels the parameter must be added to each parameter map. Keep in mind that the **m_channelParam** by default already contains some mandatory parameters, which have to be adapted to the plugin. For convenience a constructor of the **ChannelContainer** is available which takes the mandatory parameters and adds them to the map. @@ -209,7 +210,7 @@ Non channel specific parameters (parameters affecting all channels) must be pass are only added ones to the **m_params** list containing the value of the channel selected by the **defaultChannel** parameter which is automatically added to **m_params**. Furthermore the **AddInMultiChannelGrabber::initializeDefaultConfiguration** adds all channels to the **channelList** parameter of type **ito::ParamBase::StringList**. -When using the new grabber interface, a function called **setParameter** must be implemented. This function gets called by **AddInMultiChannelGrabber::setParam**. **AddInMultiChannelGrabber::setParam** +When using the grabber interface, a function called **setParameter** must be implemented. This function gets called by **AddInMultiChannelGrabber::setParam**. **AddInMultiChannelGrabber::setParam** parses and checks the parameter followed by a call to **setParameter**. If the plugin consumes and updates the corresponding parameter the **bool** parameter **ok** should be set to true. If not **AddInMultiChannelGrabber** will copy the value to parameter stored in m_param. Regardless if the parameter was processed or not **AddInMultiChannelGrabber::setParam** will synchronize the corresponding parameter stored in **m_params** with the corresponding parameter stored in the channel parameter map. If a change of a parameter affects the value of other parameters the plugin has the possibility to trigger @@ -220,15 +221,14 @@ followed by a subsequent call of **AddInMultiChannelGrabber::switchDefaultChanne **AddInMultiChannelGrabber::setParam** **AddInMultiChannelGrabber::switchDefaultChannel** is called automatically. If for any reason the parameters stored in the **ChannelContainer** of the current default channel, needs to be synchronized with the parameters stored in **m_params** this can be done by calling **AddInMultiChannelGrabber::applyParamsToChannelParams(const QStringList& keyList)**. - The plugin needs to provide a function **getParameter**. This is called by **AddInMultiChannelGrabber::getParam**. If the boolean parameter **ok** is set to true inside of **getParameter** the value of the requested parameter needs to be copied to the provided **ito::param** by the plugin. If **ok** stays false, the value copy procedure is carried out by **AddInMultiChannelGrabber**. -With the new AddInMultiChannelGrabber interface new versions of getVal and copyVal are introduced. The new functions offer the possibility to copy data captured by multiple channels by +With the AddInMultiChannelGrabber interface new versions of getVal and copyVal are introduced. The functions offer the possibility to copy data captured by multiple channels by a single function call. The functions expect a **QSharedPointer>** where the **QString** indicates the requested channels. The functions **getVal** and **copyVal** -with a single pointer to a **ito::DataObject** remains. +with a single pointer to an **ito::DataObject** remains. -**AddInMultichannelGrabber** introduces a new signal called **newData**. If this signal is emitted with a **QSharedPointer >** containing a Map of new data. The **QString** should +**AddInMultichannelGrabber** introduces a new signal called **newData**. If this signal is emitted with a **QSharedPointer >** containing a map of new data. The **QString** should contain the name of the channel which recorded the data stored in the **ito::DataObject**. The signal can used to trigger a python function. The signature of the Signal is **newData(QSharedPointer>)**. AD-Converters From 2c37883b76dcc4ea3b4fc13cacb69e12f0b70b9b Mon Sep 17 00:00:00 2001 From: Krauter Date: Mon, 12 Jun 2023 13:22:02 +0200 Subject: [PATCH 36/62] NULL changed to nullptr --- Qitom/python/pythonEngine.cpp | 370 +++++++++++++++++----------------- 1 file changed, 185 insertions(+), 185 deletions(-) diff --git a/Qitom/python/pythonEngine.cpp b/Qitom/python/pythonEngine.cpp index ddc3ae362..293cab083 100644 --- a/Qitom/python/pythonEngine.cpp +++ b/Qitom/python/pythonEngine.cpp @@ -91,16 +91,16 @@ namespace ito { QMutex PythonEngine::instancePtrProtection; -PythonEngine* PythonEngine::instance = NULL; +PythonEngine* PythonEngine::instance = nullptr; QString PythonEngine::fctHashPrefix = ":::itomfcthash:::"; //---------------------------------------------------------------------------------------------------------------------------------- -FuncWeakRef::FuncWeakRef() : m_proxyObject(NULL), m_argument(NULL), m_handle(0) +FuncWeakRef::FuncWeakRef() : m_proxyObject(nullptr), m_argument(nullptr), m_handle(0) { } //---------------------------------------------------------------------------------------------------------------------------------- -FuncWeakRef::FuncWeakRef(PythonProxy::PyProxy *proxyObject, PyObject *argTuple /*= NULL*/) : +FuncWeakRef::FuncWeakRef(PythonProxy::PyProxy *proxyObject, PyObject *argTuple /*= nullptr*/) : m_proxyObject(proxyObject), m_argument(argTuple), m_handle(0) @@ -266,8 +266,8 @@ PythonEngine::PythonEngine() : qRegisterMetaType >("QVector"); qRegisterMetaType >("QSharedPointer"); qRegisterMetaType >>("QSharedPointer>"); - m_autoReload.modAutoReload = NULL; - m_autoReload.classAutoReload = NULL; + m_autoReload.modAutoReload = nullptr; + m_autoReload.classAutoReload = nullptr; m_autoReload.checkFctExec = false; m_autoReload.checkFileExec = true; m_autoReload.checkStringExec = true; @@ -441,7 +441,7 @@ void PythonEngine::pythonSetup(ito::RetVal *retValue, QSharedPointer= 0x030B0000) @@ -849,7 +849,7 @@ ito::RetVal PythonEngine::startupLoadAndImportAdditionalModules(QSharedPointer(p_exc)) != NULL) + if ((p_cvexc = dynamic_cast(p_exc)) != nullptr) { const char* errorStr = cvErrorStr(p_cvexc->code); return PyErr_Format(PyExc_RuntimeError, "OpenCV Error: %s (%s) in %s, file %s, line %d", @@ -1346,12 +1346,12 @@ ito::RetVal PythonEngine::pythonShutdown(ItomSharedSemaphore *aimWait) if (m_autoReload.classAutoReload) { Py_XDECREF(m_autoReload.classAutoReload); - m_autoReload.classAutoReload = NULL; + m_autoReload.classAutoReload = nullptr; } if (m_autoReload.modAutoReload) { Py_XDECREF(m_autoReload.modAutoReload); - m_autoReload.modAutoReload = NULL; + m_autoReload.modAutoReload = nullptr; } m_autoReload.checkFctExec = false; m_autoReload.checkFileExec = false; @@ -1365,21 +1365,21 @@ ito::RetVal PythonEngine::pythonShutdown(ItomSharedSemaphore *aimWait) } Py_XDECREF(m_itomDbgInstance); - m_itomDbgInstance = NULL; + m_itomDbgInstance = nullptr; Py_XDECREF(m_itomDbgModule); - m_itomDbgModule = NULL; + m_itomDbgModule = nullptr; Py_XDECREF(m_itomModule); - m_itomModule = NULL; + m_itomModule = nullptr; Py_XDECREF(m_itomFunctions); - m_itomFunctions = NULL; + m_itomFunctions = nullptr; Py_XDECREF(m_pyModCodeChecker); - m_pyModCodeChecker = NULL; + m_pyModCodeChecker = nullptr; Py_XDECREF(m_pyModGC); - m_pyModGC = NULL; + m_pyModGC = nullptr; if (Py_IsInitialized()) { @@ -1441,7 +1441,7 @@ ito::RetVal PythonEngine::stringEncodingChanged() // QList qtCodecNames = QTextCodec::codecForCStrings()->aliases(); // qtCodecNames.append(QTextCodec::codecForCStrings()->name()); //QList qtCodecNames = QTextCodec::availableCodecs(); - QTextCodec *codec = NULL; + QTextCodec *codec = nullptr; QByteArray curQtCodec; #if linux @@ -1688,15 +1688,15 @@ void PythonEngine::setAutoReloader(bool enabled, bool checkFile, bool checkCmd, if (!m_autoReload.classAutoReload) { PyObject *dictItem = PyDict_GetItemString(PyModule_GetDict(m_autoReload.modAutoReload), "ItomAutoreloader"); // both borrowed references - if (dictItem == NULL) + if (dictItem == nullptr) { std::cerr << "Failed to enable 'auto reload'.\nThe class 'ItomAutoreloader' in module 'autoreload' could not be found:\n" << std::endl; PyErr_PrintEx(0); } else { - m_autoReload.classAutoReload = PyObject_CallObject(dictItem, NULL); //!< http://bytes.com/topic/python/answers/649229-_pyobject_new-pyobject_init-pyinstance_new-etc, new reference - if (m_autoReload.classAutoReload == NULL) + m_autoReload.classAutoReload = PyObject_CallObject(dictItem, nullptr); //!< http://bytes.com/topic/python/answers/649229-_pyobject_new-pyobject_init-pyinstance_new-etc, new reference + if (m_autoReload.classAutoReload == nullptr) { std::cerr << "Failed to enable 'auto reload'.\nThe class 'ItomAutoreloader' could not be instantiated.\n" << std::endl; PyErr_PrintEx(0); @@ -1894,8 +1894,8 @@ ito::RetVal PythonEngine::runString(const QString &command) //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal PythonEngine::runPyFile(const QString &pythonFileName) { - PyObject* result = NULL; - PyObject* compile = NULL; + PyObject* result = nullptr; + PyObject* compile = nullptr; RetVal retValue = RetVal(retOk); int method = 2; //1: direct, 2: by itomDebugger.py (sets the system path to folder of executed file) @@ -1941,7 +1941,7 @@ ito::RetVal PythonEngine::runPyFile(const QString &pythonFileName) compile = Py_CompileString(fileContent.constData(), filename.constData(), Py_file_input); - if (compile == NULL) + if (compile == nullptr) { if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemExit)) { @@ -1955,7 +1955,7 @@ ito::RetVal PythonEngine::runPyFile(const QString &pythonFileName) modifyTracebackDepth(2, true); PyErr_PrintEx(0); - if (oldTBLimit != NULL) + if (oldTBLimit != nullptr) { PySys_SetObject("tracebacklimit", oldTBLimit); } @@ -1966,9 +1966,9 @@ ito::RetVal PythonEngine::runPyFile(const QString &pythonFileName) } else { - result = PyEval_EvalCode(compile, m_pMainDictionary, NULL); + result = PyEval_EvalCode(compile, m_pMainDictionary, nullptr); - if (result == NULL) + if (result == nullptr) { if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemExit)) { @@ -2005,7 +2005,7 @@ ito::RetVal PythonEngine::runPyFile(const QString &pythonFileName) } else if (method == 2) { - if (m_itomDbgInstance == NULL) + if (m_itomDbgInstance == nullptr) { return RetVal(retError); } @@ -2034,7 +2034,7 @@ ito::RetVal PythonEngine::runPyFile(const QString &pythonFileName) result = PyErr_Format(PyExc_RuntimeError, "Unknown runtime error when executing python script (maybe stack overflow?)"); } - if (result == NULL) + if (result == nullptr) { if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemExit)) { @@ -2048,7 +2048,7 @@ ito::RetVal PythonEngine::runPyFile(const QString &pythonFileName) modifyTracebackDepth(2, true); PyErr_PrintEx(0); - if (oldTBLimit != NULL) + if (oldTBLimit != nullptr) { PySys_SetObject("tracebacklimit", oldTBLimit); } @@ -2113,7 +2113,7 @@ ito::RetVal PythonEngine::runFunction(PyObject *callable, PyObject *argTuple, bo ret = PyErr_Format(PyExc_RuntimeError, "Unknown runtime error when executing python method (maybe stack overflow?)"); } - if (ret == NULL) + if (ret == nullptr) { PyErr_PrintEx(0); retValue += RetVal(retError); @@ -2143,10 +2143,10 @@ ito::RetVal PythonEngine::runFunction(PyObject *callable, PyObject *argTuple, bo ito::RetVal PythonEngine::debugFunction(PyObject *callable, PyObject *argTuple, bool gilExternal /*= false*/) { - PyObject* result = NULL; + PyObject* result = nullptr; RetVal retValue = RetVal(retOk); m_interruptCounter = 0; - if (m_itomDbgInstance == NULL) + if (m_itomDbgInstance == nullptr) { return RetVal(retError); } @@ -2160,7 +2160,7 @@ ito::RetVal PythonEngine::debugFunction(PyObject *callable, PyObject *argTuple, //!< first, clear all existing breakpoints result = PyObject_CallMethod(m_itomDbgInstance, "clear_all_breaks", ""); - if (result == NULL) + if (result == nullptr) { std::cerr << tr("Error while clearing all breakpoints in itoDebugger.").toLatin1().data() << "\n" << std::endl; printPythonErrorWithoutTraceback(); //traceback is sense-less, since the traceback is in itoDebugger.py only! @@ -2204,7 +2204,7 @@ ito::RetVal PythonEngine::debugFunction(PyObject *callable, PyObject *argTuple, clearDbgCmdLoop(); - if (result == NULL) //!< syntax error + if (result == nullptr) //!< syntax error { if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemExit)) { @@ -2218,7 +2218,7 @@ ito::RetVal PythonEngine::debugFunction(PyObject *callable, PyObject *argTuple, modifyTracebackDepth(3, true); PyErr_PrintEx(0); - if (oldTBLimit != NULL) + if (oldTBLimit != nullptr) { PySys_SetObject("tracebacklimit", oldTBLimit); } @@ -2238,7 +2238,7 @@ ito::RetVal PythonEngine::debugFunction(PyObject *callable, PyObject *argTuple, } setGlobalDictionary(); - setLocalDictionary(NULL); + setLocalDictionary(nullptr); //!< disconnect connections for live-changes in breakpoints shutdownBreakPointDebugConnections(); @@ -2256,7 +2256,7 @@ ito::RetVal PythonEngine::debugFunction(PyObject *callable, PyObject *argTuple, //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal PythonEngine::debugFile(const QString &pythonFileName) { - PyObject* result = NULL; + PyObject* result = nullptr; RetVal retValue = RetVal(retOk); QString desiredPath = QFileInfo(pythonFileName).canonicalPath(); @@ -2268,7 +2268,7 @@ ito::RetVal PythonEngine::debugFile(const QString &pythonFileName) emit pythonCurrentDirChanged(); } - if (m_itomDbgInstance == NULL) + if (m_itomDbgInstance == nullptr) { return RetVal(retError); } @@ -2278,7 +2278,7 @@ ito::RetVal PythonEngine::debugFile(const QString &pythonFileName) //!< first, clear all existing breakpoints result = PyObject_CallMethod(m_itomDbgInstance, "clear_all_breaks", ""); - if (result == NULL) + if (result == nullptr) { std::cerr << tr("Error while clearing all breakpoints in itoDebugger.").toLatin1().data() << "\n" << std::endl; printPythonErrorWithoutTraceback(); //traceback is sense-less, since the traceback is in itoDebugger.py only! @@ -2319,7 +2319,7 @@ ito::RetVal PythonEngine::debugFile(const QString &pythonFileName) clearDbgCmdLoop(); - if (result == NULL) //!< syntax error + if (result == nullptr) //!< syntax error { if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemExit)) { @@ -2333,7 +2333,7 @@ ito::RetVal PythonEngine::debugFile(const QString &pythonFileName) modifyTracebackDepth(3, true); PyErr_PrintEx(0); - if (oldTBLimit != NULL) + if (oldTBLimit != nullptr) { PySys_SetObject("tracebacklimit", oldTBLimit); } @@ -2353,7 +2353,7 @@ ito::RetVal PythonEngine::debugFile(const QString &pythonFileName) } setGlobalDictionary(); - setLocalDictionary(NULL); + setLocalDictionary(nullptr); //!< disconnect connections for live-changes in breakpoints shutdownBreakPointDebugConnections(); @@ -2438,7 +2438,7 @@ ito::RetVal PythonEngine::debugString(const QString &command) clearDbgCmdLoop(); - if (result == NULL) //!< syntax error + if (result == nullptr) //!< syntax error { if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemExit)) { @@ -2452,7 +2452,7 @@ ito::RetVal PythonEngine::debugString(const QString &command) modifyTracebackDepth(3, true); PyErr_PrintEx(0); - if (oldTBLimit != NULL) + if (oldTBLimit != nullptr) { PySys_SetObject("tracebacklimit", oldTBLimit); } @@ -2472,7 +2472,7 @@ ito::RetVal PythonEngine::debugString(const QString &command) } setGlobalDictionary(); - setLocalDictionary(NULL); + setLocalDictionary(nullptr); //!< disconnect connections for live-changes in breakpoints shutdownBreakPointDebugConnections(); @@ -3018,15 +3018,15 @@ ito::RetVal PythonEngine::pythonDeleteBreakpoint(const int pyBpNumber) { ito::RetVal retval; //when calling this method, the Python GIL must already be locked - PyObject *result = NULL; - if (m_itomDbgInstance == NULL) + PyObject *result = nullptr; + if (m_itomDbgInstance == nullptr) { retval += RetVal(retError, 0, tr("Debugger not available").toLatin1().data()); } else if (pyBpNumber >= 0) { result = PyObject_CallMethod(m_itomDbgInstance, "clearBreakPoint", "i", pyBpNumber); //returns 0 (int) or str with error message - if (result == NULL) + if (result == nullptr) { //this is an exception case that should not occure under normal circumstances std::cerr << "Error while clearing breakpoint in debugger." << "\n" << std::endl; @@ -3056,7 +3056,7 @@ ito::RetVal PythonEngine::pythonDeleteBreakpoint(const int pyBpNumber) } Py_XDECREF(result); - result = NULL; + result = nullptr; } return retval; } @@ -3066,9 +3066,9 @@ ito::RetVal PythonEngine::modifyTracebackDepth(int NrOfLevelsToPopAtFront, bool { if (PyErr_Occurred()) { - PyObject* pyErrType = NULL; - PyObject* pyErrValue = NULL; - PyObject* pyErrTrace = NULL; + PyObject* pyErrType = nullptr; + PyObject* pyErrValue = nullptr; + PyObject* pyErrTrace = nullptr; PyErr_Fetch(&pyErrType, &pyErrValue, &pyErrTrace); PyTracebackObject* tb = (PyTracebackObject*)pyErrTrace; @@ -3076,7 +3076,7 @@ ito::RetVal PythonEngine::modifyTracebackDepth(int NrOfLevelsToPopAtFront, bool int depth=0; // int line; - while(tb != NULL) + while(tb != nullptr) { depth++; // line = tb->tb_lineno; @@ -3091,7 +3091,7 @@ ito::RetVal PythonEngine::modifyTracebackDepth(int NrOfLevelsToPopAtFront, bool else if (depth - NrOfLevelsToPopAtFront <= 0 && NrOfLevelsToPopAtFront > -1) { //PyException_SetTraceback(pyErrValue,Py_None); - PyErr_Restore(pyErrType, pyErrValue, NULL); + PyErr_Restore(pyErrType, pyErrValue, nullptr); } return RetVal(retOk); @@ -3107,12 +3107,12 @@ ito::RetVal PythonEngine::modifyTracebackDepth(int NrOfLevelsToPopAtFront, bool void PythonEngine::printPythonErrorWithoutTraceback() { PyObject *exception, *v, *tb; - tb = NULL; + tb = nullptr; if (PyErr_Occurred()) { PyErr_Fetch(&exception, &v, &tb); - if (exception == NULL) + if (exception == nullptr) { return; } @@ -3122,7 +3122,7 @@ void PythonEngine::printPythonErrorWithoutTraceback() tb = Py_None; Py_INCREF(tb); PyException_SetTraceback(v, tb); - if (exception == NULL) + if (exception == nullptr) { return; } @@ -3834,29 +3834,29 @@ void PythonEngine::registerWorkspaceContainer(PyWorkspaceContainer *container, b The path name is a delimiter (/) separated string list where each item has the following form XY:name. The meaning for XY:name corresponds to PyWorkspaceItem::m_key. -This method returns a new reference to the found PyObject* or NULL. This function can only be +This method returns a new reference to the found PyObject* or nullptr. This function can only be called if the Python GIL is already locked. \TODO: up to now, validVariableName is the name of the item at the deepest level (for nested variables) only. We should think about if the validVariableName should be a underscore-joined string of all variable names along the tree, beginning from the root level. */ -PyObject* PythonEngine::getPyObjectByFullName(bool globalNotLocal, const QStringList &fullNameSplittedByDelimiter, QString *validVariableName /*= NULL*/) +PyObject* PythonEngine::getPyObjectByFullName(bool globalNotLocal, const QStringList &fullNameSplittedByDelimiter, QString *validVariableName /*= nullptr*/) { #if defined _DEBUG if (!PyGILState_Check()) { std::cerr << "Python GIL must be locked when calling getPyObjectByFullName\n" << std::endl; - return NULL; + return nullptr; } #endif - PyObject *obj = NULL; - PyObject *current_obj = NULL; + PyObject *obj = nullptr; + PyObject *current_obj = nullptr; QStringList items = fullNameSplittedByDelimiter; int i=0; float f=0.0; - PyObject *tempObj = NULL; - PyObject *number = NULL; + PyObject *tempObj = nullptr; + PyObject *number = nullptr; char itemKeyType, itemType; QString itemName; @@ -4281,7 +4281,7 @@ PyObject* PythonEngine::getPyObjectByFullName(bool globalNotLocal, const QString } //---------------------------------------------------------------------------------------------------------------------------------- -PyObject *PythonEngine::getPyObjectByFullName(bool globalNotLocal, const QString &fullName, QString *validVariableName /*= NULL*/) +PyObject *PythonEngine::getPyObjectByFullName(bool globalNotLocal, const QString &fullName, QString *validVariableName /*= nullptr*/) { return getPyObjectByFullName(globalNotLocal, fullName.split(ito::PyWorkspaceContainer::delimiter), validVariableName); } @@ -4309,14 +4309,14 @@ void PythonEngine::workspaceGetValueInformation(PyWorkspaceContainer *container, PyObject *obj = getPyObjectByFullName(container->isGlobalWorkspace(), fullItemName); - if (obj == NULL) + if (obj == nullptr) { *extendedValue = ""; } else { PyObject *repr = PyObject_Repr(obj); - if (repr == NULL) + if (repr == nullptr) { PyErr_Clear(); *extendedValue = ""; @@ -4551,7 +4551,7 @@ void PythonEngine::addFunctionCancellationAndObserver(QWeakPointer >::iterator it = m_activeFunctionCancellations.begin(); @@ -4610,7 +4610,7 @@ int PythonEngine::queuedInterrupt(void* /*arg*/) } //---------------------------------------------------------------------------------------------------------------------------------- -void PythonEngine::pythonInterruptExecutionThreadSafe(bool *interruptActuatorsAndTimers /*= NULL*/) +void PythonEngine::pythonInterruptExecutionThreadSafe(bool *interruptActuatorsAndTimers /*= nullptr*/) { // only queue the interrupt event if not yet done. // ==operator(int) of QAtomicInt does not exist for all versions of Qt5. @@ -4625,7 +4625,7 @@ void PythonEngine::pythonInterruptExecutionThreadSafe(bool *interruptActuatorsAn } else { - int result = Py_AddPendingCall(&PythonEngine::queuedInterrupt, NULL); + int result = Py_AddPendingCall(&PythonEngine::queuedInterrupt, nullptr); } } @@ -4673,15 +4673,15 @@ void PythonEngine::pythonInterruptExecutionThreadSafe(bool *interruptActuatorsAn PyObject* PythonEngine::PyDbgCommandLoop(PyObject * /*pSelf*/, PyObject *pArgs) { - PyObject *self = NULL; - PyObject *frame = NULL; - PyObject *frame2 = NULL; - PyObject *frame_next = NULL; + PyObject *self = nullptr; + PyObject *frame = nullptr; + PyObject *frame2 = nullptr; + PyObject *frame_next = nullptr; PyObject* temp; PyObject* temp2; - PyObject* globalDict = NULL; - PyObject* localDict = NULL; - PyObject* callRet = NULL; + PyObject* globalDict = nullptr; + PyObject* localDict = nullptr; + PyObject* callRet = nullptr; tPythonDbgCmd recentDbgCmd = pyDbgNone; @@ -4722,7 +4722,7 @@ PyObject* PythonEngine::PyDbgCommandLoop(PyObject * /*pSelf*/, PyObject *pArgs) frame2 = PyObject_GetAttrString(frame, "f_back"); - while(frame2 != NULL && frame2 != Py_None) + while(frame2 != nullptr && frame2 != Py_None) { temp = PyObject_GetAttrString(frame2, "f_code"); temp2 = PyObject_GetAttrString(temp, "co_filename"); @@ -4820,7 +4820,7 @@ PyObject* PythonEngine::PyDbgCommandLoop(PyObject * /*pSelf*/, PyObject *pArgs) Py_CLEAR(pArgs); Py_CLEAR(globalDict); - pyEngine->setLocalDictionary(NULL); + pyEngine->setLocalDictionary(nullptr); Py_CLEAR(localDict); return PyErr_Occurred(); } @@ -5008,7 +5008,7 @@ bool PythonEngine::renameVariable(bool globalNotLocal, const QString &oldFullIte PyLong_FromLong(old[1].toInt()); //new reference char parentContainerType = old[0][0].toLatin1(); fullNameSplit.removeLast(); - PyObject *parentContainer = NULL; + PyObject *parentContainer = nullptr; if (fullNameSplit.size() > 0) { @@ -5333,7 +5333,7 @@ ito::RetVal PythonEngine::saveMatlabVariables(bool globalNotLocal, QString filen tPythonState oldState = m_pythonState; RetVal retVal; - PyObject* dict = NULL; + PyObject* dict = nullptr; if ((m_pythonState & pyStateRunning) || (m_pythonState & pyStateDebugging) || (m_pythonState & pyStateDebuggingWaitingButBusy)) { @@ -5359,7 +5359,7 @@ ito::RetVal PythonEngine::saveMatlabVariables(bool globalNotLocal, QString filen dict = getLocalDictionary(); } - if (dict == NULL) + if (dict == nullptr) { retVal += RetVal(retError, 0, tr("Variables cannot be saved since dictionary is not available").toLatin1().data()); } @@ -5369,26 +5369,26 @@ ito::RetVal PythonEngine::saveMatlabVariables(bool globalNotLocal, QString filen //build dictionary, which should be pickled PyObject* pArgs = PyTuple_New(3); - PyTuple_SetItem(pArgs,0, PyUnicode_DecodeLatin1(filename.toLatin1().data(), filename.length(), NULL)); + PyTuple_SetItem(pArgs,0, PyUnicode_DecodeLatin1(filename.toLatin1().data(), filename.length(), nullptr)); PyObject* keyList = PyList_New(0); PyObject* valueList = PyList_New(0); - PyObject* tempElem = NULL; - PyObject* keyListItem = NULL; + PyObject* tempElem = nullptr; + PyObject* keyListItem = nullptr; QString validVariableName; for (int i = 0 ; i < varNames.size() ; i++) { tempElem = getPyObjectByFullName(globalNotLocal, varNames[i], &validVariableName); //new reference - if (tempElem == NULL) + if (tempElem == nullptr) { std::cerr << "variable '" << varNames.at(i).toLatin1().data() << "' cannot be found in dictionary and will not be exported.\n" << std::endl; } else { - keyListItem = PyUnicode_DecodeLatin1(validVariableName.toLatin1().constData(), validVariableName.length(), NULL); //new ref + keyListItem = PyUnicode_DecodeLatin1(validVariableName.toLatin1().constData(), validVariableName.length(), nullptr); //new ref PyList_Append(keyList, keyListItem); PyList_Append(valueList, tempElem); Py_DECREF(tempElem); @@ -5398,7 +5398,7 @@ ito::RetVal PythonEngine::saveMatlabVariables(bool globalNotLocal, QString filen PyTuple_SetItem(pArgs,1,valueList); PyTuple_SetItem(pArgs,2,keyList); - PyObject* pyRet = ito::PythonItom::PySaveMatlabMat(NULL, pArgs); + PyObject* pyRet = ito::PythonItom::PySaveMatlabMat(nullptr, pArgs); retVal += PythonCommon::checkForPyExceptions(true); @@ -5419,7 +5419,7 @@ ito::RetVal PythonEngine::saveMatlabVariables(bool globalNotLocal, QString filen } } - if (semaphore != NULL) + if (semaphore != nullptr) { semaphore->returnValue = retVal; semaphore->release(); @@ -5444,7 +5444,7 @@ ito::RetVal PythonEngine::saveMatlabSingleParam(QString filename, QSharedPointer tPythonState oldState = m_pythonState; RetVal retVal; - PyObject* dict = NULL; + PyObject* dict = nullptr; if ((m_pythonState & pyStateRunning) || (m_pythonState & pyStateDebugging) || (m_pythonState & pyStateDebuggingWaitingButBusy)) { @@ -5461,7 +5461,7 @@ ito::RetVal PythonEngine::saveMatlabSingleParam(QString filename, QSharedPointer pythonStateTransition(pyTransDebugExecCmdBegin); } - PyObject *item = NULL; + PyObject *item = nullptr; if (value.isNull()) { @@ -5524,7 +5524,7 @@ ito::RetVal PythonEngine::saveMatlabSingleParam(QString filename, QSharedPointer retVal += ito::RetVal(retError, 0, tr("Unsupported data type to save to matlab.").toLatin1().data()); } - if (item == NULL) + if (item == nullptr) { retVal += ito::RetVal(retError, 0, tr("Error converting object to Python object. Save to matlab not possible.").toLatin1().data()); } @@ -5535,10 +5535,10 @@ ito::RetVal PythonEngine::saveMatlabSingleParam(QString filename, QSharedPointer PyGILState_STATE gstate = PyGILState_Ensure(); PyObject* pArgs = PyTuple_New(3); - PyTuple_SetItem(pArgs, 0, PyUnicode_DecodeLatin1(filename.toLatin1().data(), filename.length(), NULL)); //steals ref. + PyTuple_SetItem(pArgs, 0, PyUnicode_DecodeLatin1(filename.toLatin1().data(), filename.length(), nullptr)); //steals ref. PyTuple_SetItem(pArgs, 1, item); //steals ref. - PyTuple_SetItem(pArgs, 2, PyUnicode_DecodeLatin1(valueName.toLatin1().data(), valueName.length(), NULL)); //steals ref. - PyObject *pyRet = ito::PythonItom::PySaveMatlabMat(NULL, pArgs); + PyTuple_SetItem(pArgs, 2, PyUnicode_DecodeLatin1(valueName.toLatin1().data(), valueName.length(), nullptr)); //steals ref. + PyObject *pyRet = ito::PythonItom::PySaveMatlabMat(nullptr, pArgs); retVal += PythonCommon::checkForPyExceptions(true); Py_XDECREF(pyRet); Py_XDECREF(pArgs); @@ -5557,7 +5557,7 @@ ito::RetVal PythonEngine::saveMatlabSingleParam(QString filename, QSharedPointer } } - if (semaphore != NULL) + if (semaphore != nullptr) { semaphore->returnValue = retVal; semaphore->release(); @@ -5575,7 +5575,7 @@ ito::RetVal PythonEngine::loadMatlabVariables(bool globalNotLocal, QString filen ItomSharedSemaphoreLocker locker(semaphore); tPythonState oldState = m_pythonState; RetVal retVal; - PyObject* destinationDict = NULL; + PyObject* destinationDict = nullptr; bool released = false; if ((m_pythonState & pyStateRunning) || (m_pythonState & pyStateDebugging) || (m_pythonState & pyStateDebuggingWaitingButBusy)) @@ -5602,7 +5602,7 @@ ito::RetVal PythonEngine::loadMatlabVariables(bool globalNotLocal, QString filen destinationDict = getLocalDictionary(); } - if (destinationDict == NULL) + if (destinationDict == nullptr) { retVal += RetVal(retError, 0, tr("Variables cannot be loaded since dictionary is not available").toLatin1().data()); } @@ -5610,15 +5610,15 @@ ito::RetVal PythonEngine::loadMatlabVariables(bool globalNotLocal, QString filen { PyGILState_STATE gstate = PyGILState_Ensure(); - PyObject *filenameUnicode = PyUnicode_DecodeLatin1(filename.toLatin1().data(), filename.length(), NULL); + PyObject *filenameUnicode = PyUnicode_DecodeLatin1(filename.toLatin1().data(), filename.length(), nullptr); PyObject *pArgs = PyTuple_Pack(1, filenameUnicode); Py_DECREF(filenameUnicode); - PyObject *dict = ito::PythonItom::PyLoadMatlabMat(NULL, pArgs); + PyObject *dict = ito::PythonItom::PyLoadMatlabMat(nullptr, pArgs); Py_DECREF(pArgs); retVal += PythonCommon::checkForPyExceptions(true); - if (dict == NULL || retVal.containsError()) + if (dict == nullptr || retVal.containsError()) { } else @@ -5707,13 +5707,13 @@ ito::RetVal PythonEngine::loadMatlabVariables(bool globalNotLocal, QString filen } //---------------------------------------------------------------------------------------------------------------------------------- -ito::RetVal PythonEngine::checkVarnamesInWorkspace(bool globalNotLocal, const QStringList &names, QSharedPointer existing, ItomSharedSemaphore *semaphore /*= NULL*/) +ito::RetVal PythonEngine::checkVarnamesInWorkspace(bool globalNotLocal, const QStringList &names, QSharedPointer existing, ItomSharedSemaphore *semaphore /*= nullptr*/) { ItomSharedSemaphoreLocker locker(semaphore); tPythonState oldState = m_pythonState; ito::RetVal retVal; - PyObject* destinationDict = NULL; - PyObject* value = NULL; + PyObject* destinationDict = nullptr; + PyObject* value = nullptr; bool released = false; if ((m_pythonState & pyStateRunning) || (m_pythonState & pyStateDebugging) || (m_pythonState & pyStateDebuggingWaitingButBusy)) @@ -5740,7 +5740,7 @@ ito::RetVal PythonEngine::checkVarnamesInWorkspace(bool globalNotLocal, const QS destinationDict = getLocalDictionary(); } - if (destinationDict == NULL) + if (destinationDict == nullptr) { retVal += ito::RetVal(ito::retError, 0, tr("Values cannot be saved since workspace dictionary not available.").toLatin1().data()); } @@ -5748,8 +5748,8 @@ ito::RetVal PythonEngine::checkVarnamesInWorkspace(bool globalNotLocal, const QS { PyGILState_STATE gstate = PyGILState_Ensure(); - PyObject *existingItem = NULL; - PyObject *varname = NULL; + PyObject *existingItem = nullptr; + PyObject *varname = nullptr; existing->clear(); existing->reserve(names.size()); @@ -5757,7 +5757,7 @@ ito::RetVal PythonEngine::checkVarnamesInWorkspace(bool globalNotLocal, const QS for (int i = 0; (i < names.size()) && (!retVal.containsError()); i++) { varname = getAndCheckIdentifier(names[i], retVal); //new ref - existingItem = varname ? PyDict_GetItem(destinationDict, varname) : NULL; //borrowed ref + existingItem = varname ? PyDict_GetItem(destinationDict, varname) : nullptr; //borrowed ref if (existingItem) { @@ -5782,7 +5782,7 @@ ito::RetVal PythonEngine::checkVarnamesInWorkspace(bool globalNotLocal, const QS PyGILState_Release(gstate); - if (semaphore != NULL) + if (semaphore != nullptr) { semaphore->returnValue = retVal; semaphore->release(); @@ -5800,7 +5800,7 @@ ito::RetVal PythonEngine::checkVarnamesInWorkspace(bool globalNotLocal, const QS } } - if (semaphore != NULL && !released) + if (semaphore != nullptr && !released) { semaphore->returnValue = retVal; semaphore->release(); @@ -5810,13 +5810,13 @@ ito::RetVal PythonEngine::checkVarnamesInWorkspace(bool globalNotLocal, const QS } //---------------------------------------------------------------------------------------------------------------------------------- -ito::RetVal PythonEngine::getVarnamesListInWorkspace(bool globalNotLocal, const QString &find, QSharedPointer varnameList, ItomSharedSemaphore *semaphore /*= NULL*/) +ito::RetVal PythonEngine::getVarnamesListInWorkspace(bool globalNotLocal, const QString &find, QSharedPointer varnameList, ItomSharedSemaphore *semaphore /*= nullptr*/) { ItomSharedSemaphoreLocker locker(semaphore); tPythonState oldState = m_pythonState; ito::RetVal retVal; - PyObject* destinationDict = NULL; - PyObject* value = NULL; + PyObject* destinationDict = nullptr; + PyObject* value = nullptr; bool released = false; if ((m_pythonState & pyStateRunning) || (m_pythonState & pyStateDebugging) || (m_pythonState & pyStateDebuggingWaitingButBusy)) @@ -5843,7 +5843,7 @@ ito::RetVal PythonEngine::getVarnamesListInWorkspace(bool globalNotLocal, const destinationDict = getLocalDictionary(); } - if (destinationDict == NULL) + if (destinationDict == nullptr) { retVal += ito::RetVal(ito::retError, 0, tr("Values cannot be saved since workspace dictionary not available.").toLatin1().data()); } @@ -5867,7 +5867,7 @@ ito::RetVal PythonEngine::getVarnamesListInWorkspace(bool globalNotLocal, const PyGILState_Release(gstate); - if (semaphore != NULL) + if (semaphore != nullptr) { semaphore->returnValue = retVal; semaphore->release(); @@ -5885,7 +5885,7 @@ ito::RetVal PythonEngine::getVarnamesListInWorkspace(bool globalNotLocal, const } } - if (semaphore != NULL && !released) + if (semaphore != nullptr && !released) { semaphore->returnValue = retVal; semaphore->release(); @@ -5906,8 +5906,8 @@ ito::RetVal PythonEngine::putParamsToWorkspace(bool globalNotLocal, const QStrin ItomSharedSemaphoreLocker locker(semaphore); //tPythonState oldState = m_pythonState; ito::RetVal retVal; - PyObject* destinationDict = NULL; - PyObject* value = NULL; + PyObject* destinationDict = nullptr; + PyObject* value = nullptr; bool released = false; if (names.size() != values.size()) @@ -5938,7 +5938,7 @@ ito::RetVal PythonEngine::putParamsToWorkspace(bool globalNotLocal, const QStrin destinationDict = getLocalDictionary(); } - if (destinationDict == NULL) + if (destinationDict == nullptr) { retVal += ito::RetVal(ito::retError, 0, tr("Values cannot be saved since workspace dictionary not available.").toLatin1().data()); } @@ -5946,13 +5946,13 @@ ito::RetVal PythonEngine::putParamsToWorkspace(bool globalNotLocal, const QStrin { PyGILState_STATE gstate = PyGILState_Ensure(); - PyObject *existingItem = NULL; - PyObject *varname = NULL; + PyObject *existingItem = nullptr; + PyObject *varname = nullptr; for (int i = 0; (i < names.size()) && (!retVal.containsError()); i++) { varname = getAndCheckIdentifier(names[i], retVal); //new ref - existingItem = varname ? PyDict_GetItem(destinationDict, varname) : NULL; //borrowed ref + existingItem = varname ? PyDict_GetItem(destinationDict, varname) : nullptr; //borrowed ref if (existingItem) { @@ -5985,7 +5985,7 @@ ito::RetVal PythonEngine::putParamsToWorkspace(bool globalNotLocal, const QStrin if (varname) { value = PythonParamConversion::ParamBaseToPyObject(*(values[i])); - if (value == NULL) + if (value == nullptr) { retVal += ito::RetVal::format(ito::retError, 0, tr("Error while transforming value '%s' to PyObject*.").toLatin1().data(), names[i].toLatin1().data()); } @@ -5999,7 +5999,7 @@ ito::RetVal PythonEngine::putParamsToWorkspace(bool globalNotLocal, const QStrin Py_XDECREF(varname); } - if (semaphore != NULL) + if (semaphore != nullptr) { semaphore->returnValue = retVal; semaphore->release(); @@ -6028,7 +6028,7 @@ ito::RetVal PythonEngine::putParamsToWorkspace(bool globalNotLocal, const QStrin }*/ } - if (semaphore != NULL && !released) + if (semaphore != nullptr && !released) { semaphore->returnValue = retVal; semaphore->release(); @@ -6043,7 +6043,7 @@ ito::RetVal PythonEngine::getParamsFromWorkspace(bool globalNotLocal, const QStr ItomSharedSemaphoreLocker locker(semaphore); tPythonState oldState = m_pythonState; ito::RetVal retVal; - PyObject* value = NULL; + PyObject* value = nullptr; bool released = false; QSharedPointer param; @@ -6069,7 +6069,7 @@ ito::RetVal PythonEngine::getParamsFromWorkspace(bool globalNotLocal, const QStr pythonStateTransition(pyTransDebugExecCmdBegin); } - if ((globalNotLocal && getGlobalDictionary() == NULL) || (!globalNotLocal && getLocalDictionary() == NULL)) + if ((globalNotLocal && getGlobalDictionary() == nullptr) || (!globalNotLocal && getLocalDictionary() == nullptr)) { retVal += ito::RetVal(ito::retError, 0, tr("Values cannot be obtained since workspace dictionary not available.").toLatin1().data()); } @@ -6081,7 +6081,7 @@ ito::RetVal PythonEngine::getParamsFromWorkspace(bool globalNotLocal, const QStr for (int i = 0; i < names.size(); i++) { value = getPyObjectByFullName(globalNotLocal, names[i], &validVariableName); //new reference - if (value == NULL) + if (value == nullptr) { retVal += ito::RetVal(ito::retError, 0, tr("Item '%1' does not exist in workspace.").arg(names[i]).toLatin1().data()); break; @@ -6108,7 +6108,7 @@ ito::RetVal PythonEngine::getParamsFromWorkspace(bool globalNotLocal, const QStr PyGILState_Release(gstate); - if (semaphore != NULL) + if (semaphore != nullptr) { semaphore->returnValue = retVal; semaphore->release(); @@ -6126,7 +6126,7 @@ ito::RetVal PythonEngine::getParamsFromWorkspace(bool globalNotLocal, const QStr } } - if (semaphore != NULL && !released) + if (semaphore != nullptr && !released) { semaphore->returnValue = retVal; semaphore->release(); @@ -6142,7 +6142,7 @@ This function detects all currently available variables and stores them in a glo ito::RetVal PythonEngine::pythonGetClearAllValues() { ito::RetVal retVal; - if (m_itomFunctions == NULL) + if (m_itomFunctions == nullptr) { retVal += RetVal(retError, 0, tr("The script itomFunctions.py is not available").toLatin1().data()); } @@ -6163,7 +6163,7 @@ Afterwards the workspace will be updated. ito::RetVal PythonEngine::pythonClearAll() { ito::RetVal retVal; - if (m_itomFunctions == NULL) + if (m_itomFunctions == nullptr) { retVal += RetVal(retError, 0, tr("The script itomFunctions.py is not available").toLatin1().data()); } @@ -6188,15 +6188,15 @@ ito::RetVal PythonEngine::registerAddInInstance(QString varname, ito::AddInBase RetVal retVal(retOk); tPythonState oldState = m_pythonState; - PyObject* dict = NULL; - PyObject* value = NULL; + PyObject* dict = nullptr; + PyObject* value = nullptr; bool globalNotLocal = true; //may also be accessed by parameter, if desired if ((m_pythonState & pyStateRunning) || (m_pythonState & pyStateDebugging) || (m_pythonState & pyStateDebuggingWaitingButBusy)) { retVal += RetVal(retError, 0, tr("It is not allowed to register an AddIn-instance in modes pyStateRunning, pyStateDebugging or pyStateDebuggingWaitingButBusy").toLatin1().data()); - if (semaphore != NULL) //release semaphore now, since the following emit command will be a blocking connection, too. + if (semaphore != nullptr) //release semaphore now, since the following emit command will be a blocking connection, too. { semaphore->returnValue = retVal; semaphore->release(); @@ -6222,7 +6222,7 @@ ito::RetVal PythonEngine::registerAddInInstance(QString varname, ito::AddInBase dict = getLocalDictionary(); } - if (dict == NULL) + if (dict == nullptr) { retVal += RetVal(retError, 0, tr("Dictionary is not available").toLatin1().data()); } @@ -6234,7 +6234,7 @@ ito::RetVal PythonEngine::registerAddInInstance(QString varname, ito::AddInBase if (pyVarname) { - if (PyDict_GetItem(dict, pyVarname) != NULL) + if (PyDict_GetItem(dict, pyVarname) != nullptr) { QString ErrStr = tr("Variable name '%1' already exists in dictionary").arg(varname); retVal += RetVal(retError, 0, ErrStr.toLatin1().data()); @@ -6243,8 +6243,8 @@ ito::RetVal PythonEngine::registerAddInInstance(QString varname, ito::AddInBase { if (instance->getBasePlugin()->getType() & ito::typeDataIO) { - PythonPlugins::PyDataIOPlugin *dataIOPlugin = (PythonPlugins::PyDataIOPlugin*)PythonPlugins::PyDataIOPluginType.tp_new(&PythonPlugins::PyDataIOPluginType,NULL,NULL); //new ref - if (dataIOPlugin == NULL) + PythonPlugins::PyDataIOPlugin *dataIOPlugin = (PythonPlugins::PyDataIOPlugin*)PythonPlugins::PyDataIOPluginType.tp_new(&PythonPlugins::PyDataIOPluginType,nullptr,nullptr); //new ref + if (dataIOPlugin == nullptr) { retVal += RetVal(retError, 0, tr("No instance of python class dataIO could be created").toLatin1().data()); } @@ -6257,8 +6257,8 @@ ito::RetVal PythonEngine::registerAddInInstance(QString varname, ito::AddInBase } else if (instance->getBasePlugin()->getType() & ito::typeActuator) { - PythonPlugins::PyActuatorPlugin *actuatorPlugin = (PythonPlugins::PyActuatorPlugin*)PythonPlugins::PyActuatorPluginType.tp_new(&PythonPlugins::PyActuatorPluginType,NULL,NULL); //new ref - if (actuatorPlugin == NULL) + PythonPlugins::PyActuatorPlugin *actuatorPlugin = (PythonPlugins::PyActuatorPlugin*)PythonPlugins::PyActuatorPluginType.tp_new(&PythonPlugins::PyActuatorPluginType,nullptr,nullptr); //new ref + if (actuatorPlugin == nullptr) { retVal += RetVal(retError, 0, tr("No instance of python class actuator could be created").toLatin1().data()); } @@ -6292,7 +6292,7 @@ ito::RetVal PythonEngine::registerAddInInstance(QString varname, ito::AddInBase PyGILState_Release(gstate); } - if (semaphore != NULL) //release semaphore now, since the following emit command will be a blocking connection, too. + if (semaphore != nullptr) //release semaphore now, since the following emit command will be a blocking connection, too. { semaphore->returnValue = retVal; semaphore->release(); @@ -6321,11 +6321,11 @@ ito::RetVal PythonEngine::registerAddInInstance(QString varname, ito::AddInBase } //---------------------------------------------------------------------------------------------------------------------------------- -//! get the unicode object from identifier and checks if it is a valid python identifier (variable name). This returns a new reference of the unicode object or NULL with a corresponding error message (python error flag is cleared) +//! get the unicode object from identifier and checks if it is a valid python identifier (variable name). This returns a new reference of the unicode object or nullptr with a corresponding error message (python error flag is cleared) PyObject* PythonEngine::getAndCheckIdentifier(const QString &identifier, ito::RetVal &retval) const { //QByteArray ba = identifier.toLatin1(); - //PyObject *obj = PyUnicode_DecodeLatin1(ba.data(), ba.size(), NULL); + //PyObject *obj = PyUnicode_DecodeLatin1(ba.data(), ba.size(), nullptr); PyObject *obj = PythonQtConversion::QStringToPyObject(identifier); @@ -6334,7 +6334,7 @@ PyObject* PythonEngine::getAndCheckIdentifier(const QString &identifier, ito::Re if (!PyUnicode_IsIdentifier(obj)) { Py_DECREF(obj); - obj = NULL; + obj = nullptr; retval += ito::RetVal::format(ito::retError, 0, "String '%s' is no valid python identifier", identifier.toLatin1().data()); } } @@ -6371,7 +6371,7 @@ ito::RetVal PythonEngine::getSysModules(QSharedPointer modNames, QS } //code - if (m_itomFunctions == NULL) + if (m_itomFunctions == nullptr) { retValue += RetVal(retError, 0, tr("The script itomFunctions.py is not available").toLatin1().data()); } @@ -6446,7 +6446,7 @@ ito::RetVal PythonEngine::reloadSysModules(QSharedPointer modNames, } //code - if (m_itomFunctions == NULL) + if (m_itomFunctions == nullptr) { retValue += RetVal(retError, 0, tr("The script itomFunctions.py is not available").toLatin1().data()); } @@ -6502,7 +6502,7 @@ ito::RetVal PythonEngine::pickleVariables(bool globalNotLocal, QString filename, tPythonState oldState = m_pythonState; RetVal retVal; - PyObject* dict = NULL; + PyObject* dict = nullptr; if ((m_pythonState & pyStateRunning) || (m_pythonState & pyStateDebugging) || (m_pythonState & pyStateDebuggingWaitingButBusy)) { @@ -6546,7 +6546,7 @@ ito::RetVal PythonEngine::pickleVariables(bool globalNotLocal, QString filename, { tempElem = getPyObjectByFullName(globalNotLocal, varNames[i], &validVariableName); //new reference - if (tempElem == NULL) + if (tempElem == nullptr) { std::cerr << "variable '" << validVariableName.toLatin1().data() << "' cannot be found in dictionary and will not be exported.\n" << std::endl; } @@ -6569,7 +6569,7 @@ ito::RetVal PythonEngine::pickleVariables(bool globalNotLocal, QString filename, PyDict_Clear(exportDict); Py_DECREF(exportDict); - exportDict = NULL; + exportDict = nullptr; } PyGILState_Release(gstate); @@ -6610,7 +6610,7 @@ ito::RetVal PythonEngine::pickleSingleParam(QString filename, QSharedPointerreturnValue = retVal; semaphore->release(); @@ -6746,14 +6746,14 @@ ito::RetVal PythonEngine::pickleDictionary(PyObject *dict, const QString &filena RetVal retval; - if (m_mainModule == NULL) + if (m_mainModule == nullptr) { return RetVal(retError, 0, tr("MainModule is empty or cannot be accessed").toLatin1().data()); } PyObject* pickleModule = PyImport_AddModule("pickle"); // borrowed reference - if (pickleModule == NULL) + if (pickleModule == nullptr) { retval += PythonCommon::checkForPyExceptions(true); return retval; @@ -6761,7 +6761,7 @@ ito::RetVal PythonEngine::pickleDictionary(PyObject *dict, const QString &filena PyObject *builtinsModule = PyObject_GetAttrString(m_mainModule, "__builtins__"); //new reference - if (builtinsModule == NULL) + if (builtinsModule == nullptr) { retval += PythonCommon::checkForPyExceptions(true); return retval; @@ -6770,34 +6770,34 @@ ito::RetVal PythonEngine::pickleDictionary(PyObject *dict, const QString &filena PyObject* openMethod = PyDict_GetItemString(PyModule_GetDict(builtinsModule), "open"); //both: borrowed Py_DECREF(builtinsModule); - builtinsModule = NULL; + builtinsModule = nullptr; PyObject* pyMode = PyUnicode_FromString("wb\0"); //new reference - PyObject* fileHandle = NULL; + PyObject* fileHandle = nullptr; - PyObject* pyFileName = PyUnicode_DecodeLatin1(filename.toLatin1().data(), filename.length(), NULL); + PyObject* pyFileName = PyUnicode_DecodeLatin1(filename.toLatin1().data(), filename.length(), nullptr); - if (pyFileName != NULL) + if (pyFileName != nullptr) { - fileHandle = PyObject_CallFunctionObjArgs(openMethod, pyFileName, pyMode, NULL); //new reference + fileHandle = PyObject_CallFunctionObjArgs(openMethod, pyFileName, pyMode, nullptr); //new reference Py_DECREF(pyFileName); } Py_XDECREF(pyMode); - if (fileHandle == NULL) + if (fileHandle == nullptr) { retval += PythonCommon::checkForPyExceptions(true); } else { - PyObject *result = NULL; + PyObject *result = nullptr; PyObject *version = PyLong_FromLong(3); //Use pickle protocol version 3 as default. This is readable by all itom version that have been published (default for Python 3). PyObject *dumpObj = PyUnicode_FromString("dump"); //new reference try { - result = PyObject_CallMethodObjArgs(pickleModule, dumpObj, dict, fileHandle, version, NULL); //new reference + result = PyObject_CallMethodObjArgs(pickleModule, dumpObj, dict, fileHandle, version, nullptr); //new reference } catch(std::bad_alloc &/*ba*/) { @@ -6822,7 +6822,7 @@ ito::RetVal PythonEngine::pickleDictionary(PyObject *dict, const QString &filena Py_DECREF(dumpObj); Py_DECREF(version); - if (result == NULL) + if (result == nullptr) { retval += PythonCommon::checkForPyExceptions(true); } @@ -6853,7 +6853,7 @@ ito::RetVal PythonEngine::unpickleVariables(bool globalNotLocal, QString filenam tPythonState oldState = m_pythonState; RetVal retVal; bool released = false; - PyObject* destinationDict = NULL; + PyObject* destinationDict = nullptr; if ((m_pythonState & pyStateRunning) || (m_pythonState & pyStateDebugging) || (m_pythonState & pyStateDebuggingWaitingButBusy)) { @@ -6879,7 +6879,7 @@ ito::RetVal PythonEngine::unpickleVariables(bool globalNotLocal, QString filenam destinationDict = getLocalDictionary(); } - if (destinationDict == NULL) + if (destinationDict == nullptr) { retVal += RetVal(retError, 0, tr("Variables cannot be unpickled since dictionary is not available").toLatin1().data()); } @@ -6956,14 +6956,14 @@ ito::RetVal PythonEngine::unpickleDictionary(PyObject *destinationDict, const QS RetVal retval; - if (m_mainModule == NULL) + if (m_mainModule == nullptr) { return RetVal(retError, 0, tr("MainModule is empty or cannot be accessed").toLatin1().data()); } PyObject* pickleModule = PyImport_AddModule("pickle"); // borrowed reference - if (pickleModule == NULL) + if (pickleModule == nullptr) { retval += PythonCommon::checkForPyExceptions(true); return retval; @@ -6971,7 +6971,7 @@ ito::RetVal PythonEngine::unpickleDictionary(PyObject *destinationDict, const QS PyObject *builtinsModule = PyObject_GetAttrString(m_mainModule, "__builtins__"); //new reference - if (builtinsModule == NULL) + if (builtinsModule == nullptr) { retval += PythonCommon::checkForPyExceptions(true); return retval; @@ -6980,32 +6980,32 @@ ito::RetVal PythonEngine::unpickleDictionary(PyObject *destinationDict, const QS PyObject* openMethod = PyDict_GetItemString(PyModule_GetDict(builtinsModule), "open"); //borrowed Py_DECREF(builtinsModule); - builtinsModule = NULL; + builtinsModule = nullptr; PyObject* pyMode = PyUnicode_FromString("rb\0"); - PyObject* fileHandle = NULL; + PyObject* fileHandle = nullptr; - PyObject* pyFileName = PyUnicode_DecodeLatin1(filename.toLatin1().data(), filename.length(), NULL); + PyObject* pyFileName = PyUnicode_DecodeLatin1(filename.toLatin1().data(), filename.length(), nullptr); - if (pyFileName != NULL) + if (pyFileName != nullptr) { - fileHandle = PyObject_CallFunctionObjArgs(openMethod, pyFileName, pyMode, NULL); //new reference + fileHandle = PyObject_CallFunctionObjArgs(openMethod, pyFileName, pyMode, nullptr); //new reference Py_DECREF(pyFileName); } if (pyMode) Py_DECREF(pyMode); - if (fileHandle == NULL) + if (fileHandle == nullptr) { retval += PythonCommon::checkForPyExceptions(true); } else { PyObject *loadObj = PyUnicode_FromString("load"); - PyObject *unpickledItem = NULL; + PyObject *unpickledItem = nullptr; try { - unpickledItem = PyObject_CallMethodObjArgs(pickleModule, loadObj, fileHandle, NULL); //new ref + unpickledItem = PyObject_CallMethodObjArgs(pickleModule, loadObj, fileHandle, nullptr); //new ref } catch(std::bad_alloc &/*ba*/) { @@ -7028,7 +7028,7 @@ ito::RetVal PythonEngine::unpickleDictionary(PyObject *destinationDict, const QS } Py_DECREF(loadObj); - if (unpickledItem == NULL) + if (unpickledItem == nullptr) { retval += PythonCommon::checkForPyExceptions(true); } @@ -7157,12 +7157,12 @@ PyMethodDef PythonEngine::PyMethodItomDbg[] = { // "Python name", C Ffunction Code, Argument Flags, __doc__ description {"pyDbgCommandLoop", PythonEngine::PyDbgCommandLoop, METH_VARARGS, "will be invoked if debugger stopped at the given filename and line"}, {"pyDbgClearBreakpoint", PythonEngine::PyDbgClearBreakpoint, METH_VARARGS, "will be invoked if debugger wants to remove a temporary breakpoint"}, - {NULL, NULL, 0, NULL} + {nullptr, nullptr, 0, nullptr} }; PyModuleDef PythonEngine::PyModuleItomDbg = { - PyModuleDef_HEAD_INIT, "itomDbgWrapper", NULL, -1, PythonEngine::PyMethodItomDbg, - NULL, NULL, NULL, NULL + PyModuleDef_HEAD_INIT, "itomDbgWrapper", nullptr, -1, PythonEngine::PyMethodItomDbg, + nullptr, nullptr, nullptr, nullptr }; //---------------------------------------------------------------------------------------------------------------------------------- From d1c5fe39dad9d2baf6ac4232930d6c97957f5545 Mon Sep 17 00:00:00 2001 From: Krauter Date: Wed, 14 Jun 2023 13:21:35 +0200 Subject: [PATCH 37/62] added demo file for MultiChannelDummyGrabber --- demo/itom/plugins/demo_DummyGrabber.py | 26 ++-- .../plugins/demo_MultiChannelDummyGrabber.py | 114 ++++++++++++++++++ .../demoMultiChannelDummyGrabber_1.png | Bin 0 -> 420838 bytes 3 files changed, 132 insertions(+), 8 deletions(-) create mode 100644 demo/itom/plugins/demo_MultiChannelDummyGrabber.py create mode 100644 docs/userDoc/source/11_demos/_static/demoMultiChannelDummyGrabber_1.png diff --git a/demo/itom/plugins/demo_DummyGrabber.py b/demo/itom/plugins/demo_DummyGrabber.py index 25d88243b..8f0d335aa 100644 --- a/demo/itom/plugins/demo_DummyGrabber.py +++ b/demo/itom/plugins/demo_DummyGrabber.py @@ -12,19 +12,29 @@ ############################################################################### -# Start camera (e.g.: ``DummyGrabber``) -camera = dataIO("DummyGrabber") # noise camera -cameraGaussian = dataIO("DummyGrabber", imageType="gaussianSpot") # moving Gaussian spot -cameraGaussianArray = dataIO("DummyGrabber", imageType="gaussianSpotArray") # moving 4 Gaussian spots +# Start camera (e.g.: ``DummyGrabber``) with a ``noise image`` (default). +camera = dataIO("DummyGrabber") ############################################################################### -# Set region of interest (ROI). +# Start camera (e.g.: ``DummyGrabber``) with moving ``Gaussian spot``. +cameraGaussian = dataIO("DummyGrabber", imageType="gaussianSpot") + +############################################################################### +# Start camera (e.g.: ``DummyGrabber``) with moving ``4 Gaussian spots``. +cameraGaussianArray = dataIO("DummyGrabber", imageType="gaussianSpotArray") + +############################################################################### +# Set region of interest (ROI) by a tuple. +# # x: [100,499] -> width: 400 (borders are included!) +# # y: [40, 349] -> height: 310 camera.setParam("roi", [100, 40, 400, 300]) -# or: -# camera.setParam("roi[0]", 100) -# camera.setParam("roi[2]", 400) #... + +############################################################################### +# or by explicite roi values. +camera.setParam("roi[0]", 100) +camera.setParam("roi[2]", 400) print("width:", camera.getParam("sizex")) print("height:", camera.getParam("sizey")) diff --git a/demo/itom/plugins/demo_MultiChannelDummyGrabber.py b/demo/itom/plugins/demo_MultiChannelDummyGrabber.py new file mode 100644 index 000000000..8d716a2af --- /dev/null +++ b/demo/itom/plugins/demo_MultiChannelDummyGrabber.py @@ -0,0 +1,114 @@ +"""MultiChannelDummyGrabber +================ + +This demo shows with the example of the ``MultiChannelDummyGrabber`` +how grabber and cameras are used in ``itom``.""" + +from itom import dataIO +from itom import dataObject +from itom import plot +from itom import liveImage +# sphinx_gallery_thumbnail_path = '11_demos/_static/_thumb/demoDummyGrabber.png' + +############################################################################### +# Start camera (e.g.: ``DummyMultiChannelGrabber``) with a ``noise image`` (default). +camera = dataIO("DummyMultiChannelGrabber") + +############################################################################### +# Start camera (e.g.: ``DummyMultiChannelGrabber``) with moving ``Gaussian spot``. +cameraGaussian = dataIO("DummyMultiChannelGrabber", imageType="gaussianSpot") + +############################################################################### +# Start camera (e.g.: ``DummyMultiChannelGrabber``) with moving ``4 Gaussian spots``. +cameraGaussianArray = dataIO("DummyMultiChannelGrabber", imageType="gaussianSpotArray") + +print("width:", camera.getParam("sizex")) +print("height:", camera.getParam("sizey")) + +############################################################################### +# Set pixel format to ``mono8`` +camera.setParam("pixelFormat", "mono8") + +# print available parameters of that device +print("DummyMultiChannelGrabber has the following parameters:") +print(camera.getParamList()) + +# print detailed information about parameters: +print(camera.getParamListInfo()) + +############################################################################### +# Read parameters from device. +roi = camera.getParam("roi") +############################################################################### +# Start camera. +camera.startDevice() + +############################################################################### +# Acquire single image. +camera.acquire() + +# Create empty dataObject for getting the image +data = dataObject() + +# get a reference to the acquired image +# the reference is then available by the recently created dataObject +camera.getVal(data) + +############################################################################### +# .. warning:: +# +# The method **getVal** returns only a shallow copy of the plugin internal memory. +# Therefore, the content of data will change when the next image is acquired. +# In order to create a deep copy of data, type: +# +# .. code-block:: python +# +# camera.copyVal(data) +# + +# You can also convert the data afterwards to a deep copy by typing: +dataCopy = data.copy() + +# plot the acquired image +plot(data) + +############################################################################### +# Stop camera. +camera.stopDevice() + +############################################################################### +# Start a live image. +liveImage(camera) + +############################################################################### +# +# .. image:: ../../_static/demoMultiChannelDummyGrabber_1.png +# :width: 100% + +liveImage(cameraGaussian) +liveImage(cameraGaussianArray) + +############################################################################### +# Acquire an image stack of 10 measurements. +num = 100 +camera.startDevice() +image = dataObject() +imageStack = dataObject([num, roi[2], roi[3]], "uint8") + +# stop the auto grabbing of the live image +camera.disableAutoGrabbing() + +for idx in range(num): + camera.acquire() + camera.getVal(image) + imageStack[idx, :, :] = image + print(idx) + +camera.stopDevice() +# acquire stack finished + +# plot stack (use arrows in widget to switch between planes) +plot(imageStack) + +# enable the auto grabbing of the live image +camera.enableAutoGrabbing() diff --git a/docs/userDoc/source/11_demos/_static/demoMultiChannelDummyGrabber_1.png b/docs/userDoc/source/11_demos/_static/demoMultiChannelDummyGrabber_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b15ed38be9f8e0223d955eba1c385572363fdbbb GIT binary patch literal 420838 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�rG%eE?{`NjJS)*GF1&TJWQH~DMD6j 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Ξ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

    ~AJ{Tx&{qkBty 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

    dDe- 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⁡A>-_ZiLw}lQAdz#U+4sZyy{My;5m{e2cC`|47{8 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

    tr1=bO=nPQ)bN_zxoorEglwrjq(tlTL6XJ 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

    ^@3-4|`bS}ghJsYKHVxz; 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 literal 0 HcmV?d00001 From 1ad3464b38344f47ab66c95b285129169337fdb0 Mon Sep 17 00:00:00 2001 From: Krauter Date: Sun, 18 Jun 2023 00:38:45 +0200 Subject: [PATCH 38/62] added dataObject meta info to AddInGrabber which can be set by a dataIO plugin --- common/sources/addInGrabber.cpp | 75 +++++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 3 deletions(-) diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index 535198549..e8db56ec8 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -229,11 +229,59 @@ AddInGrabber::~AddInGrabber() //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) { - int futureHeight = m_params["sizey"].getVal(); - int futureWidth = m_params["sizex"].getVal(); + const int futureHeight = m_params["sizey"].getVal(); + const int futureWidth = m_params["sizex"].getVal(); int futureType; - int bpp = m_params["bpp"].getVal(); + const int bpp = m_params["bpp"].getVal(); + + ito::float64 axisOffset[] = {0.0, 0.0}; + ito::float64 axisScale[] = {1.0, 1.0}; + ito::ByteArray axisUnit[] = {ito::ByteArray(""), ito::ByteArray("")}; + ito::ByteArray axisDescription[] = {ito::ByteArray(""), ito::ByteArray("")}; + QString valueDescription = ""; + QString valueUnit = ""; + + // only if exists in plugin + if (m_params.contains("axisOffset")) + { + axisOffset[0] = m_params["axisOffset"].getVal()[0]; + axisOffset[1] = m_params["axisOffset"].getVal()[1]; + } + + // only if exists in plugin + if (m_params.contains("axisScale")) + { + axisScale[0] = m_params["axisScale"].getVal()[0]; + axisScale[1] = m_params["axisScale"].getVal()[1]; + } + + // only if exists in plugin + if (m_params.contains("axisDescription")) + { + axisDescription[0] = m_params["axisDescription"].getVal()[0]; + axisDescription[1] = m_params["axisDescription"].getVal()[1]; + } + + // only if exists in plugin + if (m_params.contains("axisUnit")) + { + axisUnit[0] = m_params["axisUnit"].getVal()[0]; + axisUnit[1] = m_params["axisUnit"].getVal()[1]; + } + + // only if exists in plugin + if (m_params.contains("valueDescription")) + { + valueDescription = m_params["valueDescription"].getVal(); + } + + // only if exists in plugin + if (m_params.contains("valueUnit")) + { + valueUnit = m_params["valueUnit"].getVal(); + } + if (bpp <= 8) { futureType = ito::tUInt8; @@ -259,6 +307,16 @@ ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) m_data.getSize(1) != (unsigned int)futureWidth || m_data.getType() != futureType) { m_data = ito::DataObject(futureHeight, futureWidth, futureType); + m_data.setAxisScale(0, axisScale[0]); + m_data.setAxisScale(1, axisScale[1]); + m_data.setAxisOffset(0, axisOffset[0]); + m_data.setAxisOffset(1, axisOffset[1]); + m_data.setAxisDescription(0, axisDescription[0].data()); + m_data.setAxisDescription(1, axisDescription[1].data()); + m_data.setAxisUnit(0, axisUnit[0].data()); + m_data.setAxisUnit(1, axisUnit[1].data()); + m_data.setValueDescription(valueDescription.toUtf8().data()); + m_data.setValueUnit(valueUnit.toUtf8().data()); } } else @@ -298,6 +356,16 @@ ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) m_data.getType() != futureType) { m_data = ito::DataObject(numChannel, futureHeight, futureWidth, futureType); + m_data.setAxisScale(0, axisScale[0]); + m_data.setAxisScale(1, axisScale[1]); + m_data.setAxisOffset(0, axisOffset[0]); + m_data.setAxisOffset(1, axisOffset[1]); + m_data.setAxisDescription(0, axisDescription[0].data()); + m_data.setAxisDescription(1, axisDescription[1].data()); + m_data.setAxisUnit(0, axisUnit[0].data()); + m_data.setAxisUnit(1, axisUnit[1].data()); + m_data.setValueDescription(valueDescription.toUtf8().data()); + m_data.setValueUnit(valueUnit.toUtf8().data()); } } else @@ -321,6 +389,7 @@ ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) } } + return ito::retOk; } //---------------------------------------------------------------------------------------------------------------------------------- From 67e4e8adbbf848c8dfb9e3debb58a776ceccea0b Mon Sep 17 00:00:00 2001 From: Photoniker Date: Sun, 18 Jun 2023 21:04:23 +0200 Subject: [PATCH 39/62] fix for update dataObject meta info without changed image type --- common/sources/addInGrabber.cpp | 40 ++++++++++++++++----------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index e8db56ec8..aeb1f7a3f 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -307,17 +307,17 @@ ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) m_data.getSize(1) != (unsigned int)futureWidth || m_data.getType() != futureType) { m_data = ito::DataObject(futureHeight, futureWidth, futureType); - m_data.setAxisScale(0, axisScale[0]); - m_data.setAxisScale(1, axisScale[1]); - m_data.setAxisOffset(0, axisOffset[0]); - m_data.setAxisOffset(1, axisOffset[1]); - m_data.setAxisDescription(0, axisDescription[0].data()); - m_data.setAxisDescription(1, axisDescription[1].data()); - m_data.setAxisUnit(0, axisUnit[0].data()); - m_data.setAxisUnit(1, axisUnit[1].data()); - m_data.setValueDescription(valueDescription.toUtf8().data()); - m_data.setValueUnit(valueUnit.toUtf8().data()); } + m_data.setAxisScale(0, axisScale[0]); + m_data.setAxisScale(1, axisScale[1]); + m_data.setAxisOffset(0, axisOffset[0]); + m_data.setAxisOffset(1, axisOffset[1]); + m_data.setAxisDescription(0, axisDescription[0].data()); + m_data.setAxisDescription(1, axisDescription[1].data()); + m_data.setAxisUnit(0, axisUnit[0].data()); + m_data.setAxisUnit(1, axisUnit[1].data()); + m_data.setValueDescription(valueDescription.toUtf8().data()); + m_data.setValueUnit(valueUnit.toUtf8().data()); } else { @@ -356,17 +356,17 @@ ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) m_data.getType() != futureType) { m_data = ito::DataObject(numChannel, futureHeight, futureWidth, futureType); - m_data.setAxisScale(0, axisScale[0]); - m_data.setAxisScale(1, axisScale[1]); - m_data.setAxisOffset(0, axisOffset[0]); - m_data.setAxisOffset(1, axisOffset[1]); - m_data.setAxisDescription(0, axisDescription[0].data()); - m_data.setAxisDescription(1, axisDescription[1].data()); - m_data.setAxisUnit(0, axisUnit[0].data()); - m_data.setAxisUnit(1, axisUnit[1].data()); - m_data.setValueDescription(valueDescription.toUtf8().data()); - m_data.setValueUnit(valueUnit.toUtf8().data()); } + m_data.setAxisScale(0, axisScale[0]); + m_data.setAxisScale(1, axisScale[1]); + m_data.setAxisOffset(0, axisOffset[0]); + m_data.setAxisOffset(1, axisOffset[1]); + m_data.setAxisDescription(0, axisDescription[0].data()); + m_data.setAxisDescription(1, axisDescription[1].data()); + m_data.setAxisUnit(0, axisUnit[0].data()); + m_data.setAxisUnit(1, axisUnit[1].data()); + m_data.setValueDescription(valueDescription.toUtf8().data()); + m_data.setValueUnit(valueUnit.toUtf8().data()); } else { From c9a85feb19212de7cc907e3b1285e302456c5e21 Mon Sep 17 00:00:00 2001 From: Photoniker Date: Sun, 18 Jun 2023 22:20:37 +0200 Subject: [PATCH 40/62] =?UTF-8?q?fix=20to=20work=20with=20special=20charac?= =?UTF-8?q?ters=20as=20e.g.=20=C2=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/sources/addInGrabber.cpp | 42 +++++++++++++++++---------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index aeb1f7a3f..9c75c045d 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -237,8 +237,8 @@ ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) ito::float64 axisOffset[] = {0.0, 0.0}; ito::float64 axisScale[] = {1.0, 1.0}; - ito::ByteArray axisUnit[] = {ito::ByteArray(""), ito::ByteArray("")}; - ito::ByteArray axisDescription[] = {ito::ByteArray(""), ito::ByteArray("")}; + QString axisUnit[] = {"", ""}; + QString axisDescription[] = {"", ""}; QString valueDescription = ""; QString valueUnit = ""; @@ -259,27 +259,29 @@ ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) // only if exists in plugin if (m_params.contains("axisDescription")) { - axisDescription[0] = m_params["axisDescription"].getVal()[0]; - axisDescription[1] = m_params["axisDescription"].getVal()[1]; + axisDescription[0] = + QString::fromUtf8(m_params["axisDescription"].getVal()[0].data()); + axisDescription[1] = + QString::fromUtf8(m_params["axisDescription"].getVal()[1].data()); } // only if exists in plugin if (m_params.contains("axisUnit")) { - axisUnit[0] = m_params["axisUnit"].getVal()[0]; - axisUnit[1] = m_params["axisUnit"].getVal()[1]; + axisUnit[0] = QString::fromUtf8(m_params["axisUnit"].getVal()[0].data()); + axisUnit[1] = QString::fromUtf8(m_params["axisUnit"].getVal()[1].data()); } // only if exists in plugin if (m_params.contains("valueDescription")) { - valueDescription = m_params["valueDescription"].getVal(); + valueDescription = QString::fromLatin1(m_params["valueDescription"].getVal()); } // only if exists in plugin if (m_params.contains("valueUnit")) { - valueUnit = m_params["valueUnit"].getVal(); + valueUnit = QString::fromLatin1(m_params["valueUnit"].getVal()); } if (bpp <= 8) @@ -312,12 +314,12 @@ ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) m_data.setAxisScale(1, axisScale[1]); m_data.setAxisOffset(0, axisOffset[0]); m_data.setAxisOffset(1, axisOffset[1]); - m_data.setAxisDescription(0, axisDescription[0].data()); - m_data.setAxisDescription(1, axisDescription[1].data()); - m_data.setAxisUnit(0, axisUnit[0].data()); - m_data.setAxisUnit(1, axisUnit[1].data()); - m_data.setValueDescription(valueDescription.toUtf8().data()); - m_data.setValueUnit(valueUnit.toUtf8().data()); + m_data.setAxisDescription(0, axisDescription[0].toLatin1().data()); + m_data.setAxisDescription(1, axisDescription[1].toLatin1().data()); + m_data.setAxisUnit(0, axisUnit[0].toLatin1().data()); + m_data.setAxisUnit(1, axisUnit[1].toLatin1().data()); + m_data.setValueDescription(valueDescription.toLatin1().data()); + m_data.setValueUnit(valueUnit.toLatin1().data()); } else { @@ -361,12 +363,12 @@ ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) m_data.setAxisScale(1, axisScale[1]); m_data.setAxisOffset(0, axisOffset[0]); m_data.setAxisOffset(1, axisOffset[1]); - m_data.setAxisDescription(0, axisDescription[0].data()); - m_data.setAxisDescription(1, axisDescription[1].data()); - m_data.setAxisUnit(0, axisUnit[0].data()); - m_data.setAxisUnit(1, axisUnit[1].data()); - m_data.setValueDescription(valueDescription.toUtf8().data()); - m_data.setValueUnit(valueUnit.toUtf8().data()); + m_data.setAxisDescription(0, axisDescription[0].toLatin1().data()); + m_data.setAxisDescription(1, axisDescription[1].toLatin1().data()); + m_data.setAxisUnit(0, axisUnit[0].toLatin1().data()); + m_data.setAxisUnit(1, axisUnit[1].toLatin1().data()); + m_data.setValueDescription(valueDescription.toLatin1().data()); + m_data.setValueUnit(valueUnit.toLatin1().data()); } else { From 90481581cc9ca45381c67df52d6ee233ecd090ef Mon Sep 17 00:00:00 2001 From: Photoniker Date: Sun, 18 Jun 2023 23:06:25 +0200 Subject: [PATCH 41/62] adapted demo_DummyGrabber for meta information of liveImage --- demo/itom/plugins/demo_DummyGrabber.py | 23 ++++++++++++++---- .../11_demos/_static/demoDummyGrabber_1.png | Bin 252750 -> 274246 bytes .../11_demos/_static/demoDummyGrabber_2.png | Bin 88351 -> 80123 bytes .../11_demos/_static/demoDummyGrabber_3.png | Bin 108340 -> 86601 bytes 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/demo/itom/plugins/demo_DummyGrabber.py b/demo/itom/plugins/demo_DummyGrabber.py index 8f0d335aa..d0d2dd928 100644 --- a/demo/itom/plugins/demo_DummyGrabber.py +++ b/demo/itom/plugins/demo_DummyGrabber.py @@ -2,7 +2,11 @@ ================ This demo shows with the example of the ``DummyGrabber`` -how grabber and cameras are used in ``itom``.""" +how grabber and cameras are used in ``itom``. +3 ``DummyGrabber`` instances are created. +The ``camera`` shows how to set parameter like ``region of interest``. +Using the ``cameraGaussian`` it is show how to define meta information +of the image showing axis descriptions, units, ...""" from itom import dataIO from itom import dataObject @@ -96,18 +100,27 @@ liveImage(camera) ############################################################################### -# .. image:: ../../_static/demoDummyGrabber_1.png -# :width: 100% -liveImage(cameraGaussian) +# Set meta information for the gaussianSpot of image for liveImage and return image. +# The axis properties are set assuming a pixel pitch of 10µm. +# The offset is set such that origin is in the center. +cameraGaussian.setParam("axisScale", (10e-6, 10e-6)) # scale 10µm +cameraGaussian.setParam("axisOffset", ((480-1)/2, (640-1)/2)) # origin on center +cameraGaussian.setParam("axisDescription", ("y axis", "x axis")) +cameraGaussian.setParam("axisUnit", ("µm", "µm")) +cameraGaussian.setParam("valueDescription", "counts") +cameraGaussian.setParam("valueUnit", "a.u.") ############################################################################### +# Start a live image with aspect ratio of 1 and visible colorBar. +# # .. image:: ../../_static/demoDummyGrabber_2.png # :width: 100% -liveImage(cameraGaussianArray) +liveImage(cameraGaussian, properties={"colorMap": "falseColorIR", "keepAspectRatio": True, "colorBarVisible": True}) ############################################################################### # .. image:: ../../_static/demoDummyGrabber_3.png # :width: 100% +liveImage(cameraGaussianArray) ############################################################################### # Acquire an image stack of 10 measurements. diff --git a/docs/userDoc/source/11_demos/_static/demoDummyGrabber_1.png b/docs/userDoc/source/11_demos/_static/demoDummyGrabber_1.png index e675c03b4873f13a8e96a3d1e3b0d810ea3f4835..2a9d51c854d554ce17e3f729fe37c89c17b06b05 100644 GIT binary patch literal 274246 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�`+t02Sd|Xr> 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 X&Zb4`fQPzwz-MDXh=0k3J(>RkFg_sD literal 252750 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%0Akq|;2-OM_l3XLZk|^=u-D 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

    mI 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%0A_J^=c+`ss#D3~4vy$O8%F1vTHHN#kz& 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

    G3P72ACyNklH2E| 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 literal 108340 zcmYhDdpy(q|Nraipe{vSDkRjUi}tCUBZk$bsGPc}#}|M zqiplsi!1(I{s@(Q_Jp~NbvCRxZxAc$ zfIdgg{pY#Lmw2u+nuW6c=-@R)*6O?1n-vh%dm51PdkDKV{cfDBDIdPow9`2Y2fet~ zn}Pi?CK(eFg>@WzV3dm$t`WcspBzPF_kT8Nc!U#V3n9!Thn3fYZ|c}jm`M#nC`}(1 zFB+R_JFV$IV!ZF4dg75+Cf|t(xbm@z4;KCeJK=~6bG8_I>DJh73TK37n+ykD(=~ZeCJlO1FK5|1I9~yt+B-rg){_0|}K*YBE8^FFh$^K0Kd+D)i~%TKRv! zdSrlCT-#sSl@>k6BkdkO;deKF_a8E@UTQ#1+}9k<>OB#=wJ3lsE9gmc=x~^H&_2QQ zA24%mNKnxm5-^cekYEhWC35o7=^_A$V+w{~8G>AvvsK5 zXe0OzhV$5o%wVuyC|);Iv6x@0uhchJ1{n%dI}Ba0pBbs~*@gCbW*J^Y>*F zNxIymt+`ZDE;Wp_PbSet67kH@Soe5MmXB`7TfZnl8?b;OUM~)peL&4kdmus-6`W88loSZ{bNZ*O&nkbwxPCWlgf&&v#SC#0 zlH=+tCM!O`g^%2$W#s=Td%CVDYj`{(e$4>bZ2~3LV`cOz>$=5N1l2M9x=|h~0xVkL zGe99PA=5uBOtc~yKAOb-9?HACo85uk`ywas72P%CPTfeVqOli-=I5+diM(KBw2x@pPqni3<79ML5?b~GPV6vzxgw@2Bve!edIToLkQdBv z(GX{iwQhFobW}*hO2zyny7-+YRKT<|s}rhSZnx zpGGr24*HhsVx?h#)TJye1R6W=$IHmx!0!7gEgSm8XMs<6jJP;59aBN@Nce$!{s z1j|dw)$;1xMt=xzsR_K~pb+(#@bnxiMp4YFRXP;+(kJg@&ct5nN-+e%jpu-wDh^8t zf<}G$jre%HscSz)vIrit-n^GzLk~cwL6UCETC6F(0XEmY=F7;7Lv|*mHu*=3^KS?E zBH4LNSO68kXXDm1fuH@^5e={{WhyPndQ`@Mt#xsk z>5_d6HJjy`n}aLAR1vG6?T;G9cbHJ)9~~~M4*Y%5hVFn9wtqc{S$>;o3|GJ1x(ZCF zQzLe%8k5`R{XP!A=z}|m+MZbN(>|e<(|GX7@h+V~~tJbVELT4;$Uoigmxq z*fQq*qK}*wfR+ZLY7~K9wsd@S+c2#v68HHeIlL#Dxjh6^QpI-|-IK?APYmV8RGm)3 zRUfTgI$Y{s7Y5Ichgp6Yc~jLvLZle8>iw}p)4-4N(or=mE02MM2(nO&1LSN8^vrZz zw_}u7?Xm?65qRzXO%3*+hASWGhhw?lPYK>$pi^`E+(QOJy5Z-J6`I7#`OJ>N+hM-k z-R0rV`8UL^_X38~A?(S&j!$$#BL93D-GuC39r>D*mr#PGquC(A> z#NgQSb5bRVDg)Tdml;WaC;AwOIg4I(u|HV;6LYaD8SV7xnEvAL`zDjHUc2Ef2zkj_KjP+~~{92!#Q&N6ofK zw)~yVC|BHwmkeB`k@D1S%49!xn!1Ar8F?lkV%hlyKZ_yrFBRjhcO$8Y>6+%_-~)i|t= zNa+^E`bI4pF;@v_C-S11Vz3M?##QN{;sLj`*=xQ;RC78YPQmsYOQ(F9$ple3k&~py zNSAf>JyY*_Uehvrpca$|NewwM@_wvhM`uj#W$mk-_a4X>LLfRGTfjCBx^+osuR2ul zyTKl5OSVc7co-a5;oUHrT2PmZ*%T{++N^ioTfkZ(KvAi5Z*irghi!#y;->{O!RY0fz(!C>zx*2M#2zWmfVUK%r2_n}M1kDuB`(=X(&8m5r6}!%Lw!4q4Pfo?{}fOz&3|!T4jB*K9u*YB zSVIxV`7%VWkN)+PmX;M5AXbNz`3qaYN2WnB*Hh9Zv2aaHmH+KAYvyK%?W@w7*{#4~ z>S%$C_mrE_5m#>a^DvNFE{kE#H>!s_b8DkT7}b;3g@=u2ey9IoS~P&(b9Z1gE6}hv zHt^U*Yga@5j>g$kP&rR8|M1E1pA`!*CPQ9--!HGJUe1bwMc;sCd7#_7O zbXUnapQ^%2Szj*~&(jdsd*7U9!@#p|HJEy2uEQQgf^lHUNSn(W!vw2ygKOUn(yv1tmfoSpmFGCK$A+pKIb8!h z_UevM$%`M{FVVxrF=t;DFytz7Ym+u#B_7p6(7Za&KJ%3sb}Uak4M zvGrH6m7!8*;daH1Zq#GP|AL}Q{2`2<*1k=8E3f9A5ojJ7|NYf=zJKP6zK_m`bls!1 zqX6S#0kL}KIVl_nwuXD-79*!520?4OSs`9=81ilO${XJdIfAFix0-yq(~CPX?)*}o zs0bAzlSY4JQEsk?k$WmSiud4DmhuKZkKA)HzRm$^|B>|HoF|kx?uX$Iq&%1 z1?X)zuyFG5^Pg`HGi<#4#=0p>%cwnmH+;a6P1+pjpgRN^blr(-Ke^V=aDjg5{(%Ke zG#|XAYz2n1zL=O}PK;YPwo6)f@M69c*Et#Pj;yeAoi&EWdoh7T4|oV}E(d7e&NZ84 zF)nf?8K{AlnCsp+0hMtKN`{jKOaoXg`vo8cpmyd(e4*EomxtkJK*P-?Fmb5C-jfql zkz~LdYEL1?tMMO(z23HK=j(W(GPsH_mzdtq>cJwTu#q+S_yESC-yUjj+Q!eoF4YT? z>GgH>lK1LxBziKD$%HPy6ioHtP)FX{tv$T;rX0Ka5$0HVWP4Z;8LDe`?VLzBXYZoQ zX;~fStJ5l3x{-75kp3g?dO4G@Zptg&$iYtO;*1w#eUiR?z=qV%#WGdds4GZAJreZI zFj1bNSj%9qpN`M*6wk?&o#GQ3c{rA;)TwY(_=x9);@<9o==4iQIAR`4?fCfed*QPw zawR8WK@trww;vmh_K5wPywae`B;@l_c{r%zl}eRMNbABEhm`ettYVPNi>&-9dRZh* zlUiVg6*0JIC)QE7to_>}PV~?^b$p{!T@;g>F?LK$4?hR7HE$0w3C`x4=&dQ`UZzi8 zYRzLlLsMTJwG|yj^oDV@wEJT+QfJY{sk7TdaBoMKKCUvO%WHAu#R2v3lyvcVxMuuo z|C`-(2AgvG$52*70p+G2d9I;!k52zb>}Z+onu1Z|JN6L}wHa0M-Tl{|cKyohmri+| zyZ_tgKc;K~g=AN0cvK0y6a_p^{b=7K=ieErRWA$hx(NzuolE>FnT28Zw^!ay#gT zzK`Q0-nf>r*7hG8KnHx3h*>#63PbwOF9NFik~2(9l-)}e zZK(O3g#w1~?}{U?Ag5c@4Qiq2eON!RpoGt~(Nvz@`YS&;zq>mqCQ%JF2937n1+=`# ztKiwX6z0xi0$s2dgDURb|M=wTYv*#}UqL%tvdnY7-kH*uPw2NKMqmE7S3Bly=_o&6 z_>y6CBn|Y815tPsV2%o+=1cgr+&Zj=m+kc=oL@+upqOJ{?q4OEcBvD7`6t!K()>== zVnBVHA)D%7)n%2^aogER{HXWDVG8vwY+6Fp&gnDIlp)YdZ+z2BIFkxl|3d@k)UHD> z!IL`;>=Je=B#HV*u*Y)xJmPPrp?YU_4`C~j0lAjJ{9FJ~zvIM|vpIvoB3qHH;tql+k# zPukh(Oi_f!Vb#=ReCk--d?^iL@L=bz$)k^Dr)W7NUtcbB3F05cEnLp(ns(qp*cL$> z%eiNY*kgZ>b9s>tX^%pOO=qRIvx=h%hk;|#|pQ3wuQDUC`+e-PcV-# zO~1H{U%_WGQv%i+-pf22&~uq5MX z>v_w=Z&Dix6IJGF>w<6Yjw_qAuO2_z&`PZL?zQg%QKizJ%wZG~t#?ev3ha%SGAF0x*&j%u$B1;=i1PlZZS)^7@hk`yw>ZlRCF?1tMv~Mg+PV;FC|@USR>+Lz zERGn9zd14!^r<*7`x8q!#e;Spb65Xni!!|OZpZrosNR)RK3tW_z_}b zUIeY{m{i%Hw)rLpDWURfTe2drY`);t9xYwjh8US)Q>Rzint>DTS$hZ}vKZ8OAEX>un9Q06~ zKCn&eXEtS}5a>c;`D+f|EHLYcs`BGGEaPD`b<@DSna?56@9yNKz9&0%SF2Qw5i|m3 zVvUPV3t-I;yFeuXP1 zu{@kd$hjI)iQ|U(DHE?DZhlJnOWwADEAlY75d?qttVT36Q18{kNs0N_=k zS_Ca!U_Z-vIQ%^6aDn-$|R7^ zE}rT;WR{rq-5hitL*Jow=3HXy^;@H$zot(*qq$YylBEj$0aSb+z|5a__>_lRm|&x0 zcr*6Y5p1rY)M&H@Bfd%sgT}Hu82W19@bD5F&5at7?a1fL%t9B7i38FFRgdAR*G>cT zrtd-5^cPYvm&!e8YXQ19gTQNVEf@(#Y2v}OeNoHr%I_=6zLx04wGRX8M)`vRtx=0F zyY_mDHMHT34YHKf)q_P@`vpRrLiisiCl+CXN&X`uwI`}5YyEca0do5tLu&VLahuCJ z`y%bORc1c}ZR&^-YF8EL$mgjo$hwJ$7@hK+Q>=1yC#(g2`gZN&8)Z`9Ii@*1uv=s= zC#vfyP_t7i`#v?XELQAYty$S_v!l+b=~17xpJANr&`p{2P;WaKm#K1ggpg^T>f}eEYe`SVFzfY&N8zti$a`W z;^e>1-8L)2*@>?K%Xx~h&S%tmGhFSpeafMpwBx)a<6orTu8;`g4~ZH-1@_r}^*pw+7znM8i1qMSD3_RM&_?ByqA^nC$n9{_nBtndmYp5YIIRj8z6)#MKEv8BU*;t(+(PD zozzYYKcL#QNrj@imb(FI?(Dnx2`-sHriW99`FC#Gz@=jcf(^n$(zngpaN};07n0#b z7yX;UCp+sy$O~JA*R$E)$P8Doggu zAN^%D&O|sxJcH`mlMzP8a(O@o1QS3WcP`Ie?P=bBFgN^5+mN04@u~N|mPa}d6=g+} zpqL&VhB_f$f|8~vs&x62IJgRBE&+IKLM@iXv8^kS_G~>wrt=8O&sI{49{qw4B&(c zR^({6Q4RrFb(%Rb8*@DuB1QpBZfrF8W>f}>Yq_o`R&d{F z?h-fQtQ$yj1-g)l@#bpZ?X=V|bI!lzBxwvQpjfH8+e)OUg&9e@9q)&rp!d~dN%!9U zh8sd@Qt;-->-PY-KfKzn+&i0me1ERG*Q0M~>u*t9XD5=N4%da=RmbR3eq#FIzvpXt ztaQ8OB6VBaHRBjw9}X^+DO)xH9XD#MuPs{hSNeI= z63aplT^`rK!6vXhbzxDIKLnsk8bSaX!9LqH?Cl7gDIZBu7_P zq=T#No{O#&MHZEs4H+7$eLJWoW{14nvBXL~+mt^S`FF|b6lrIC#hYBue;F*sP$i{1 z9_%ulRmp6~WQj^6jDl>u4F@l6hPC(U3?>Gi%jujF?P#d=TB6=o7yn)Yo~np6d;5R$ z!MTc}U0&k590%m15C}U5=9oN@y4mu@`LsjR7B706hx;p9a{BAl?TPmD+C6v%HwC)( zhS$?`f%f>@jr{m!5DL4rJS%9PP9SLFc^?(MVUthP6IC_o8 z?ll5+y|^%BY|Cy!^<_Z%1&Vei(~Knx1z*kesMNqMwV@`7gm5E-@I9(eprE^t@%n)* zeQZ&lxL_wl9u5YK2=HRr0v}i*;3#>#6q8B|lsFI^$=OLAd7HP)?;&oWtahXNJRsn) znAN=9O1Hju==k#ZZ>~0fK3ab;)4gp$V34@MZ675re59HC3)z$d!HJAYJzK4W(_ z)B!v5y`0GWfMK`AghBUd_X|f9mw*ilNfv5}i-SbG+{U=va|)$u@CYglV zF@@g&8T?}UD)_PU)>(9b{I1}Ak^;_LII9>Xj@_sy@=?r6eN0G-px)cQKqjt{(LLBa9)4;@n4h>;*HLDR=-mVFWO+k?d~nu zj4WI_<;r7C65_ek#k`QTH>VGr7LdT~X~+tQ7aY=4Or9;pz=O_EWuFF#du99<^D&+D z_|xQ{);-s=xsrw_+HNf?saIjOGk1GPaCLM`7N}nEDWnP|%3%Hlrk2Sj5*4HAqpRSl z&#e$;OPrB`+cFq?iIAAnowJ?@f1Y%u)Urb(f90)F8jdEIR=Txo1iR0VJ1wT>2RQeH zRLLmUn2NL7(P)~dy+|s`QW7s3Mj6ll%DV0O2ZTvb!zbSl*QiLiwoU3}?c#Ktwj1y( zPE6j@Y1opLtUYPI_g{4_2mjoC=EViK@Rx6Mjt;DHev(78{a8JCrpGkwr z?hEdhM~qQcR*|G~ET0U_v*cJwOAIlLHFBLvY#wA*Au&japtO{P^o@^^@K{#NTe-wp z5`{%s?s{@^WQ7StLWkq)GD7TtSuY8uS2f_cmD+$=kk+o3kiC9Lv%Nz|@_a91-akE@ zB^T*4tZ}zOnJY;uBoid=yre;0Eu0`4lLMK)0Mkk?7y}w}xdRSsUG_|gv(p3ysz5Ne zSShC+$iRYfMMS42g+w13-)}i!b}IOAxZS%4Cy#G{(`(JwXxpyr(6Zby)3)WQ*;~J7 zPhnW_AN*F2ipK*#F$*8X>9gZTzGFg)Fm2NVZj1CYQtw|Ip=%4pOci|$od{?|u&}aJ zT$nQku!lL$aoWycF{4IAq`fkS^uxz$>xIceBuzhZ<#?iV(Vb<_LHnog-yYHQ`kkj` zzU`ISNjsnCNz;!nj=#R(dLmre=~Ssxc~yXmz9LjIk~GG0P`vjba>GC0W-h1_5KzU8 zgc(C!5eW)(iTVU}C)JZve7vq)H!(HYAf>~Mr?*+vVtco7?aU;xIYT|d<93Idms8~H zaq!xIn%OM~wxrAyv;sne_VI8JBE0~L9u35MH7n5za^t)|a zw}XJY=+BRfqKL`^bib5Dd35cyauD?Z$HGbu7YD@HA66RW8h~|WHk>8u=Ba4P*bw4B z2lW+_WBRh0AM+LWtA^yM?()38+3F86gd_%t#Hi9YiF>os-k zD%R~a7R_q>n;9Q;#u{2tb=0{i%Y4kA(CaSgZe%`zNQ1~ruSyxuR48jjg?0Vf{X6M- zl_w=^v+{j1prX`YAVW1%2%*lnabw`SZjr*xn{h3^HZrJay~q`Dm!6zfQl&fT0u}dF z6HISAhEIY>(oFUn^#cpaQv>hr;ay-sbiQw;$`^c`x=l*M> zKDR&I^P*3~V_){Lv8CNgsHfMXcTiLFLV~p00YKzRi|S`1$wWFv>)`#;j;YPTNC=tAGkFRztTx{Qh=> zthOfK&m>J#k{8yHu$rF>#GXelZ)RpY-Ex=!ua%vpLeM`a1Rghk8N8^R!)B6 zhu1h)<9{BPU_|kJdY#6!uv@rpEs;)Er%YZlH4fOTv;S&TRF^ zXw3<P(@@F;ugQ2NjegmHlBfjpPMZ{H9p&%J!U9y-mu^A#th z;gm#U=p{q1bKu6ux3&$;^S?dnGqm$g1!;S&6veUnOzDw%TP^eFK>1%f?is6>6vXXs z_>bQ-_NyhnnD{K%4Fu6S(YE+Ezm8*9oM&f#Mj12@%{GO{&le|E(&MjZ3qE)p*$yVH zUI_}OOV-?hX9fYQ$$5-o(ntY7X31fEPhH0#)C( zbFKJI%}Y0r;MG%gC9FU`lDM6)bVrbrG+Km^&oD_`JAOWb4v_Rno6PH2Yd=+(9s~@B z*wMfEofx-(U_M92odk17B3t0=+KesMmOz-GAhWj?&$v$2YMtFr5!VPOW_M^`NHtNo z?NLAZv)V@|<;0(ZcKfzAcCSv@UOg`yK@$Xx1o<0TV0Q2Lf;GA_FGh5ciLO*HyS*yg zStiL>$@>u?pMX}nAi}y5J;D~>Jd4E245?mwwO899_2ZlVqd0>y-1r7%$82-xCtgI!ah)9ikcIa9*R1MW#YbfGiTEPDYS&%t(c8u9802NgIrmpduH`lgIrAudXR9{O?~DTs)D%`TL6Ye5%HN{@3LQjnt2J-j*-_Gt_Td&F`pjS7C26v^n^Tz+iwilk#I~uu}C+c8+R!oB61^6-#j9oLM|?HgZ;Gd;1=PEvdp1OjIw+Qy#B#f36r!SdqzWN^ zWK>mN%AXOiLq=-=(E=`viXPNu#OTM6QA-{aaQ7F0%%!k>GzOCb<0q8$Bdt1o`-Y3U zE>4c^jv2=dQ$dQf&lnDvHLOGx=^4%WRd4Wz7@YomK_#y-^>{?tcBe<|iDPBl0LcO! z#eyq{+=Qgc4eB;^K&^z!FmZ06MVF_)p8WX_STeK+O;VyHjdk`j4>6xT1pf6QwlgYt z!*lPnw7#Rd9fWnLwkhw*j`G^Lrekbe0BY(Y(2!z+C{EjUT$r@n7-GlPMgUdxh>W-& z1ugWa>q`pz7gQRZeaDM$UpnpeX#FUfd$=XMviBI!s80!=qh>&`pKY37B8kJnY;NGX z2WDLh)_Y&+ij|QxATsW2M}Sp8VnDsRp^rs}86RVj)2Cm>sr0Rc>?t2rln3#GK*AS*l6r14Be zo?yY%d4I0&GosoWNM&yy>iF362~Jw zRws-0yRTW)&>Azo&#qBKfkck&sqV+iM>dU!(=H|9ugC#x5?-n8%>oZxyBD&7PvDOTh@`rzdNx9b7(zseuCL&Q1kbT zw!1CyV2Qhz$>({Iq!ZsAZQ%b5Bkrs=Fy5F%r~Eqb!HS5L^oDK7S9{X)tM zFsYrs-~P*#-*lUe|Jvm0kiJETEUg;cOO4s;6*v2^(McM{!

    m&GAgq-Rs#!BTZRl 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»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

    -|PG4SpB8Uhp8DZHBZ`6kPYqxEt<8J{3Ssy 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 G;r|P6NtQ1F From be8253a7f1e45fab266745286f29660614c57925 Mon Sep 17 00:00:00 2001 From: Photoniker Date: Mon, 19 Jun 2023 09:34:45 +0200 Subject: [PATCH 42/62] added new demo for Gaussian DummyGrabber --- demo/itom/plugins/demo_DummyGrabber.py | 44 +++----------- .../itom/plugins/demo_GaussianDummyGrabber.py | 56 ++++++++++++++++++ .../_thumb/demoGaussianDummyGrabber.png | Bin 0 -> 27592 bytes .../11_demos/_static/demoDummyGrabber_3.png | Bin 86601 -> 0 bytes ...r_2.png => demoGaussianDummyGrabber_1.png} | Bin .../_static/demoGaussianDummyGrabber_2.png | Bin 0 -> 83773 bytes 6 files changed, 65 insertions(+), 35 deletions(-) create mode 100644 demo/itom/plugins/demo_GaussianDummyGrabber.py create mode 100644 docs/userDoc/source/11_demos/_static/_thumb/demoGaussianDummyGrabber.png delete mode 100644 docs/userDoc/source/11_demos/_static/demoDummyGrabber_3.png rename docs/userDoc/source/11_demos/_static/{demoDummyGrabber_2.png => demoGaussianDummyGrabber_1.png} (100%) create mode 100644 docs/userDoc/source/11_demos/_static/demoGaussianDummyGrabber_2.png diff --git a/demo/itom/plugins/demo_DummyGrabber.py b/demo/itom/plugins/demo_DummyGrabber.py index d0d2dd928..5d4273cd3 100644 --- a/demo/itom/plugins/demo_DummyGrabber.py +++ b/demo/itom/plugins/demo_DummyGrabber.py @@ -2,11 +2,12 @@ ================ This demo shows with the example of the ``DummyGrabber`` -how grabber and cameras are used in ``itom``. -3 ``DummyGrabber`` instances are created. -The ``camera`` shows how to set parameter like ``region of interest``. -Using the ``cameraGaussian`` it is show how to define meta information -of the image showing axis descriptions, units, ...""" +how grabbers and cameras are used in ``itom``. +The ``camera`` shows how to set parameter like ``region of interest`` +or ``bits per pixel``. + +First a ``liveImage`` is opened. In addition, 100 frames are grabbed +from the ``camera`` and stored in the ``imageStack``.""" from itom import dataIO from itom import dataObject @@ -19,14 +20,6 @@ # Start camera (e.g.: ``DummyGrabber``) with a ``noise image`` (default). camera = dataIO("DummyGrabber") -############################################################################### -# Start camera (e.g.: ``DummyGrabber``) with moving ``Gaussian spot``. -cameraGaussian = dataIO("DummyGrabber", imageType="gaussianSpot") - -############################################################################### -# Start camera (e.g.: ``DummyGrabber``) with moving ``4 Gaussian spots``. -cameraGaussianArray = dataIO("DummyGrabber", imageType="gaussianSpotArray") - ############################################################################### # Set region of interest (ROI) by a tuple. # @@ -58,6 +51,7 @@ # Read parameters from device. sizex = camera.getParam("sizex") sizey = camera.getParam("sizey") + ############################################################################### # Start camera. camera.startDevice() @@ -97,30 +91,10 @@ ############################################################################### # Start a live image. -liveImage(camera) - -############################################################################### -# Set meta information for the gaussianSpot of image for liveImage and return image. -# The axis properties are set assuming a pixel pitch of 10µm. -# The offset is set such that origin is in the center. -cameraGaussian.setParam("axisScale", (10e-6, 10e-6)) # scale 10µm -cameraGaussian.setParam("axisOffset", ((480-1)/2, (640-1)/2)) # origin on center -cameraGaussian.setParam("axisDescription", ("y axis", "x axis")) -cameraGaussian.setParam("axisUnit", ("µm", "µm")) -cameraGaussian.setParam("valueDescription", "counts") -cameraGaussian.setParam("valueUnit", "a.u.") - -############################################################################### -# Start a live image with aspect ratio of 1 and visible colorBar. # -# .. image:: ../../_static/demoDummyGrabber_2.png +# .. image:: ../../_static/demoDummyGrabber_1.png # :width: 100% -liveImage(cameraGaussian, properties={"colorMap": "falseColorIR", "keepAspectRatio": True, "colorBarVisible": True}) - -############################################################################### -# .. image:: ../../_static/demoDummyGrabber_3.png -# :width: 100% -liveImage(cameraGaussianArray) +liveImage(camera) ############################################################################### # Acquire an image stack of 10 measurements. diff --git a/demo/itom/plugins/demo_GaussianDummyGrabber.py b/demo/itom/plugins/demo_GaussianDummyGrabber.py new file mode 100644 index 000000000..47bc3b776 --- /dev/null +++ b/demo/itom/plugins/demo_GaussianDummyGrabber.py @@ -0,0 +1,56 @@ +"""Gaussian DummyGrabber +===================== + +This demo shows with the example of the ``DummyGrabber`` +how grabber and cameras are used in ``itom``. +The ``DummyGrabber`` can optionally show a Gaussian spot or +an array of Gaussian spots. In addition, it is shown here how +fruther meta information (*axis description, axis unit, axis scale, axis offset, +value description, value unit*) of the frames are set, which are adopted +for the ``liveImage`` and the returned ``dataObject`` frames..""" + +from itom import dataIO +from itom import liveImage + +# sphinx_gallery_thumbnail_path = '11_demos/_static/_thumb/demoGaussianDummyGrabber.png' + +############################################################################### +# Start camera (e.g.: ``DummyGrabber``) with moving ``Gaussian spot``. +cameraGaussian = dataIO("DummyGrabber", imageType="gaussianSpot") + +############################################################################### +# Start camera (e.g.: ``DummyGrabber``) with moving ``4 Gaussian spots``. +cameraGaussianArray = dataIO("DummyGrabber", imageType="gaussianSpotArray") + + +############################################################################### +# Set meta information for the gaussianSpot of image for liveImage and return image. +# The axis properties are set assuming a pixel pitch of 10µm. +# The offset is set such that origin is in the center. +cameraGaussian.setParam("axisScale", (10e-6, 10e-6)) # scale 10µm +cameraGaussian.setParam( + "axisOffset", ((480 - 1) / 2, (640 - 1) / 2) +) # origin on center +cameraGaussian.setParam("axisDescription", ("y axis", "x axis")) +cameraGaussian.setParam("axisUnit", ("µm", "µm")) +cameraGaussian.setParam("valueDescription", "counts") +cameraGaussian.setParam("valueUnit", "a.u.") + +############################################################################### +# Start a live image with aspect ratio of 1 and visible colorBar. +# +# .. image:: ../../_static/demoGaussianDummyGrabber_1.png +# :width: 100% +liveImage( + cameraGaussian, + properties={ + "colorMap": "falseColorIR", + "keepAspectRatio": True, + "colorBarVisible": True, + }, +) + +############################################################################### +# .. image:: ../../_static/demoGaussianDummyGrabber_2.png +# :width: 100% +liveImage(cameraGaussianArray) diff --git a/docs/userDoc/source/11_demos/_static/_thumb/demoGaussianDummyGrabber.png b/docs/userDoc/source/11_demos/_static/_thumb/demoGaussianDummyGrabber.png new file mode 100644 index 0000000000000000000000000000000000000000..b57cb87563ff318f3c4a92119f9aae0cee6d4af1 GIT binary patch literal 27592 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 literal 0 HcmV?d00001 diff --git a/docs/userDoc/source/11_demos/_static/demoDummyGrabber_3.png b/docs/userDoc/source/11_demos/_static/demoDummyGrabber_3.png deleted file mode 100644 index afb413b091383a04768f4d12f481bfe192811d23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86601 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 diff --git a/docs/userDoc/source/11_demos/_static/demoDummyGrabber_2.png b/docs/userDoc/source/11_demos/_static/demoGaussianDummyGrabber_1.png similarity index 100% rename from docs/userDoc/source/11_demos/_static/demoDummyGrabber_2.png rename to docs/userDoc/source/11_demos/_static/demoGaussianDummyGrabber_1.png diff --git a/docs/userDoc/source/11_demos/_static/demoGaussianDummyGrabber_2.png b/docs/userDoc/source/11_demos/_static/demoGaussianDummyGrabber_2.png new file mode 100644 index 0000000000000000000000000000000000000000..ed01320fb5787aa86cc5ebc1078a9297b003b8f3 GIT binary patch literal 83773 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ⅅ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

    _iqzH{5UG3T08V8nH>KP-v$ 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 Date: Thu, 22 Jun 2023 14:38:56 +0200 Subject: [PATCH 43/62] fixed "none" entry when executing print(camera.getParamListInfo()) --- demo/itom/plugins/demo_DummyGrabber.py | 4 ++-- demo/itom/plugins/demo_MultiChannelDummyGrabber.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/demo/itom/plugins/demo_DummyGrabber.py b/demo/itom/plugins/demo_DummyGrabber.py index 5d4273cd3..62ab957ab 100644 --- a/demo/itom/plugins/demo_DummyGrabber.py +++ b/demo/itom/plugins/demo_DummyGrabber.py @@ -42,10 +42,10 @@ # print available parameters of that device print("DummyGrabber has the following parameters:") -print(camera.getParamList()) +camera.getParamList() # print detailed information about parameters: -print(camera.getParamListInfo()) +camera.getParamListInfo() ############################################################################### # Read parameters from device. diff --git a/demo/itom/plugins/demo_MultiChannelDummyGrabber.py b/demo/itom/plugins/demo_MultiChannelDummyGrabber.py index 8d716a2af..d740b5016 100644 --- a/demo/itom/plugins/demo_MultiChannelDummyGrabber.py +++ b/demo/itom/plugins/demo_MultiChannelDummyGrabber.py @@ -31,10 +31,10 @@ # print available parameters of that device print("DummyMultiChannelGrabber has the following parameters:") -print(camera.getParamList()) +camera.getParamList() # print detailed information about parameters: -print(camera.getParamListInfo()) +camera.getParamListInfo() ############################################################################### # Read parameters from device. From ce7a6493ca08674017382fc82b8fbef2d31b4d39 Mon Sep 17 00:00:00 2001 From: Photoniker Date: Fri, 23 Jun 2023 14:53:33 +0200 Subject: [PATCH 44/62] added dataObject meta information to addInMultiChannelGrabber similiar to addInGrabber --- common/addInMultiChannelGrabber.h | 55 ++++- common/sources/addInMultiChannelGrabber.cpp | 223 +++++++++++++++++--- 2 files changed, 237 insertions(+), 41 deletions(-) diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index f02039cb2..a5d974e4d 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -55,30 +55,60 @@ namespace ito { ito::DataObject data; QMap m_channelParam; + ChannelContainer() { ito::Param paramVal; int roi[] = { 0, 0, 1, 1 }; paramVal = ito::Param("roi", ito::ParamBase::IntArray, 4, roi, "roi"); - m_channelParam.insert("roi", paramVal); + m_channelParam.insert(paramVal.getName(), paramVal); paramVal = ito::Param("sizex", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 1, 1, "sizex"); - m_channelParam.insert("sizex", paramVal); + m_channelParam.insert(paramVal.getName(), paramVal); paramVal = ito::Param("sizey", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 1, 1, "sizey"); - m_channelParam.insert("sizey", paramVal); + m_channelParam.insert(paramVal.getName(), paramVal); paramVal = ito::Param("pixelFormat", ito::ParamBase::String, "mono8", "pixelFormat"); - m_channelParam.insert("pixelFormat", paramVal); + m_channelParam.insert(paramVal.getName(), paramVal); double axisOffset[] = { 0.0, 0.0 }; paramVal = ito::Param("axisOffset", ito::ParamBase::DoubleArray, 2, axisOffset, "axis offset"); - m_channelParam.insert("axisOffset", paramVal); + m_channelParam.insert(paramVal.getName(), paramVal); double axisScale[] = { 1.0, 1.0 }; paramVal = ito::Param("axisScale", ito::ParamBase::DoubleArray, 2, axisScale, "axis scale"); - m_channelParam.insert("axisScale", paramVal); + m_channelParam.insert(paramVal.getName(), paramVal); + + QString axisUnit[] = {"", ""}; + paramVal = ito::Param( + "axisUnit", + ito::ParamBase::StringList, + axisUnit->toLatin1().data(), "axis unit"); + m_channelParam.insert(paramVal.getName(), paramVal); + + QString axisDescription[] = {"", ""}; + paramVal = ito::Param( + "axisDescription", + ito::ParamBase::StringList, + axisDescription->toLatin1().data(), + "axis description"); + m_channelParam.insert(paramVal.getName(), paramVal); + + QString valueDescription = ""; + paramVal = ito::Param( + "valueDescription", + ito::ParamBase::String, + valueDescription.toLatin1().data(), + "value description"); + m_channelParam.insert(paramVal.getName(), paramVal); + + QString valueUnit = ""; + paramVal = ito::Param( + "valueUnit", ito::ParamBase::String, valueUnit.toLatin1().data(), "value unit"); + m_channelParam.insert(paramVal.getName(), paramVal); }; + ~ChannelContainer() = default; ChannelContainer(const ChannelContainer&) = default; ChannelContainer(ito::Param roi, @@ -86,7 +116,11 @@ namespace ito ito::Param sizex, ito::Param sizey, ito::Param axisOffset, - ito::Param axisScale) + ito::Param axisScale, + ito::Param axisDescription, + ito::Param axisUnit, + ito::Param valueDescription, + ito::Param valueUnit) { m_channelParam.insert("pixelFormat", pixelFormat); m_channelParam.insert("roi", roi); @@ -94,8 +128,13 @@ namespace ito m_channelParam.insert("sizey", sizey); m_channelParam.insert("axisOffset", axisOffset); m_channelParam.insert("axisScale", axisScale); + m_channelParam.insert("axisDescription", axisDescription); + m_channelParam.insert("axisUnit", axisUnit); + m_channelParam.insert("valueDescription", valueDescription); + m_channelParam.insert("valueUnit", valueUnit); } }; + QMap m_channels; /*!< Map for recently grabbed images of various channels*/ virtual ito::RetVal checkData(ito::DataObject *externalDataObject = NULL); virtual ito::RetVal checkData(QMap& externalDataObject); @@ -109,8 +148,6 @@ namespace ito ito::RetVal setParamMeta(const QByteArray& paramName, ito::ParamMeta* meta, bool takeOwnerShip, const QList& channelList = QList()); ito::RetVal setParamFlags(const QByteArray& paramName, const unsigned int& flags, const QList& channelList = QList()); - - ////! Specific function to set the parameters in the respective plugin class ///*! //This function is a specific implementation of setParam. Overload this function to process parameters individually in the plugin class. This function is called by setParam after the parameter has been parsed and checked . diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index 74ec2c3d9..aa0a87871 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -151,8 +151,6 @@ namespace ito } } - - ////---------------------------------------------------------------------------------------------------------------------------------- ////! sends m_image to all registered listeners. ///*! @@ -173,21 +171,6 @@ namespace ito { const ChannelContainer& container = m_channels[it.key().toLatin1().data()]; QSharedPointer pDObj(new ito::DataObject(container.data)); - int numAxis = pDObj->getDims(); - if(container.m_channelParam["axisOffset"].getLen() == numAxis && container.m_channelParam["axisScale"].getLen() == numAxis) - { - const double* axisOffset = container.m_channelParam["axisOffset"].getVal(); - const double* axisScale = container.m_channelParam["axisScale"].getVal(); - for (unsigned int i = 0; i < numAxis; ++i) - { - pDObj->setAxisOffset(i, axisOffset[i]); - pDObj->setAxisScale(i, axisScale[i]); - } - } - else - { - retValue += ito::RetVal(ito::retWarning, 1001, tr("could not set axis scale or axis offset since the array length of at least one parameter does not fit to the dataObject size.").toLatin1().data()); - } if (!QMetaObject::invokeMethod(it.value(), "setSource", Q_ARG(QSharedPointer, pDObj), Q_ARG(ItomSharedSemaphore*, NULL))) { @@ -234,16 +217,80 @@ namespace ito return retValue; } - + //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal ito::AddInMultiChannelGrabber::checkData(QMap& externalDataObject) { assert(m_defaultConfigReady); ito::RetVal retVal(ito::retOk); unsigned int futureType = 0; bool ok; + ito::float64 axisOffset[] = {0.0, 0.0}; + ito::float64 axisScale[] = {1.0, 1.0}; + QString axisUnit[] = {"", ""}; + QString axisDescription[] = {"", ""}; + QString valueDescription = ""; + QString valueUnit = ""; + QMap::const_iterator it = externalDataObject.constBegin(); while (it != externalDataObject.constEnd()) { + // only if exists in plugin + if (m_channels[it.key()].m_channelParam.contains("axisOffset")) + { + axisOffset[0] = m_channels[it.key()].m_channelParam["axisOffset"].getVal()[0]; + axisOffset[1] = + m_channels[it.key()].m_channelParam["axisOffset"].getVal()[1]; + } + + // only if exists in plugin + if (m_channels[it.key()].m_channelParam.contains("axisScale")) + { + axisScale[0] = + m_channels[it.key()].m_channelParam["axisScale"].getVal()[0]; + axisScale[1] = + m_channels[it.key()].m_channelParam["axisScale"].getVal()[1]; + } + + // only if exists in plugin + if (m_channels[it.key()].m_channelParam.contains("axisDescription")) + { + axisDescription[0] = QString::fromUtf8(m_channels[it.key()] + .m_channelParam["axisDescription"] + .getVal()[0] + .data()); + axisDescription[1] = QString::fromUtf8(m_channels[it.key()] + .m_channelParam["axisDescription"] + .getVal()[1] + .data()); + } + + // only if exists in plugin + if (m_channels[it.key()].m_channelParam.contains("axisUnit")) + { + axisUnit[0] = QString::fromUtf8(m_channels[it.key()] + .m_channelParam["axisUnit"] + .getVal()[0] + .data()); + axisUnit[1] = QString::fromUtf8(m_channels[it.key()] + .m_channelParam["axisUnit"] + .getVal()[1] + .data()); + } + + // only if exists in plugin + if (m_channels[it.key()].m_channelParam.contains("valueDescription")) + { + valueDescription = QString::fromLatin1( + m_channels[it.key()].m_channelParam["valueDescription"].getVal()); + } + + // only if exists in plugin + if (m_channels[it.key()].m_channelParam.contains("valueUnit")) + { + valueUnit = QString::fromLatin1( + m_channels[it.key()].m_channelParam["valueUnit"].getVal()); + } + futureType = pixelFormatStringToEnum(m_channels[it.key()].m_channelParam["pixelFormat"].getVal(), &ok); if (ok) { @@ -253,6 +300,20 @@ namespace ito if (it.value()->getDims() == 0) { *(it.value()) = ito::DataObject(height, width, futureType); + + m_channels[it.key()].data.setAxisScale(0, axisScale[0]); + m_channels[it.key()].data.setAxisScale(1, axisScale[1]); + m_channels[it.key()].data.setAxisOffset(0, axisOffset[0]); + m_channels[it.key()].data.setAxisOffset(1, axisOffset[1]); + m_channels[it.key()].data.setAxisDescription( + 0, axisDescription[0].toLatin1().data()); + m_channels[it.key()].data.setAxisDescription( + 1, axisDescription[1].toLatin1().data()); + m_channels[it.key()].data.setAxisUnit(0, axisUnit[0].toLatin1().data()); + m_channels[it.key()].data.setAxisUnit(1, axisUnit[1].toLatin1().data()); + m_channels[it.key()].data.setValueDescription( + valueDescription.toLatin1().data()); + m_channels[it.key()].data.setValueUnit(valueUnit.toLatin1().data()); } else if (it.value()->calcNumMats() != 1) { @@ -266,30 +327,108 @@ namespace ito ++it; } return retVal; - } + + //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal ito::AddInMultiChannelGrabber::checkData(ito::DataObject *externalDataObject) { assert(m_defaultConfigReady); ito::RetVal retVal(ito::retOk); bool ok; + ito::float64 axisOffset[] = {0.0, 0.0}; + ito::float64 axisScale[] = {1.0, 1.0}; + QString axisUnit[] = {"", ""}; + QString axisDescription[] = {"", ""}; + QString valueDescription = ""; + QString valueUnit = ""; + unsigned int futureType; PixelFormat format; if (!externalDataObject) { + QMutableMapIterator it(m_channels); + while (it.hasNext()) { + it.next(); - QMutableMapIterator i(m_channels); - while (i.hasNext()) { - i.next(); - futureType = pixelFormatStringToEnum(i.value().m_channelParam["pixelFormat"].getVal(), &ok); + // only if exists in plugin + if (m_channels[it.key()].m_channelParam.contains("axisOffset")) + { + axisOffset[0] = m_channels[it.key()] + .m_channelParam["axisOffset"] + .getVal()[0]; + axisOffset[1] = m_channels[it.key()] + .m_channelParam["axisOffset"] + .getVal()[1]; + } + + // only if exists in plugin + if (m_channels[it.key()].m_channelParam.contains("axisScale")) + { + axisScale[0] = + m_channels[it.key()].m_channelParam["axisScale"].getVal()[0]; + axisScale[1] = + m_channels[it.key()].m_channelParam["axisScale"].getVal()[1]; + } + + // only if exists in plugin + if (m_channels[it.key()].m_channelParam.contains("axisDescription")) + { + axisDescription[0] = QString::fromUtf8(m_channels[it.key()] + .m_channelParam["axisDescription"] + .getVal()[0] + .data()); + axisDescription[1] = QString::fromUtf8(m_channels[it.key()] + .m_channelParam["axisDescription"] + .getVal()[1] + .data()); + } + + // only if exists in plugin + if (m_channels[it.key()].m_channelParam.contains("axisUnit")) + { + axisUnit[0] = QString::fromUtf8(m_channels[it.key()] + .m_channelParam["axisUnit"] + .getVal()[0] + .data()); + axisUnit[1] = QString::fromUtf8(m_channels[it.key()] + .m_channelParam["axisUnit"] + .getVal()[1] + .data()); + } + + // only if exists in plugin + if (m_channels[it.key()].m_channelParam.contains("valueDescription")) + { + valueDescription = QString::fromLatin1( + m_channels[it.key()].m_channelParam["valueDescription"].getVal()); + } + + // only if exists in plugin + if (m_channels[it.key()].m_channelParam.contains("valueUnit")) + { + valueUnit = QString::fromLatin1( + m_channels[it.key()].m_channelParam["valueUnit"].getVal()); + } + + futureType = pixelFormatStringToEnum(it.value().m_channelParam["pixelFormat"].getVal(), &ok); if (ok) { - int* roi = i.value().m_channelParam["roi"].getVal(); + int* roi = it.value().m_channelParam["roi"].getVal(); int height = roi[3]; int width = roi[2]; - if (i.value().data.getDims() < 2 || i.value().data.getSize(0) != height || i.value().data.getSize(1) != width || i.value().data.getType() != futureType) + if (it.value().data.getDims() < 2 || it.value().data.getSize(0) != height || it.value().data.getSize(1) != width || it.value().data.getType() != futureType) { - i.value().data = ito::DataObject(height, width, futureType); + it.value().data = ito::DataObject(height, width, futureType); + it.value().data.setAxisScale(0, axisScale[0]); + it.value().data.setAxisScale(1, axisScale[1]); + it.value().data.setAxisOffset(0, axisOffset[0]); + it.value().data.setAxisOffset(1, axisOffset[1]); + it.value().data.setAxisDescription(0, axisDescription[0].toLatin1().data()); + it.value().data.setAxisDescription(1, axisDescription[1].toLatin1().data()); + it.value().data.setAxisUnit(0, axisUnit[0].toLatin1().data()); + it.value().data.setAxisUnit(1, axisUnit[1].toLatin1().data()); + it.value().data.setValueDescription(valueDescription.toLatin1().data()); + it.value().data.setValueUnit(valueUnit.toLatin1().data()); } } else @@ -332,10 +471,21 @@ namespace ito return retVal; } + //---------------------------------------------------------------------------------------------------------------------------------- void AddInMultiChannelGrabber::addChannel(QString name) { - ChannelContainer a(m_params["roi"], m_params["pixelFormat"], m_params["sizex"], m_params["sizey"], m_params["axisOffset"], m_params["axisScale"]); - m_channels[name] = a; + ChannelContainer container( + m_params["roi"], + m_params["pixelFormat"], + m_params["sizex"], + m_params["sizey"], + m_params["axisOffset"], + m_params["axisScale"], + m_params["axisDescription"], + m_params["axisUnit"], + m_params["valueDescription"], + m_params["valueUnit"]); + m_channels[name] = container; const ByteArray* channelList = m_params["channelList"].getVal(); int len = 0; m_params["channelList"].getVal(len); @@ -343,18 +493,17 @@ namespace ito QVector qVectorList(len, *channelList); qVectorList.append(ByteArray(name.toLatin1().data())); m_params["channelList"].setVal(qVectorList.data(), qVectorList.length()); - } + //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::adaptDefaultChannelParams() { ito::RetVal retVal(ito::retOk); char* channel = m_params["defaultChannel"].getVal(); return retVal; - - } + //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) { assert(m_defaultConfigReady); @@ -392,6 +541,7 @@ namespace ito return retValue; } + //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::changeChannelForListerners(const QString& newChannel, QObject* obj) { assert(m_defaultConfigReady); @@ -423,6 +573,7 @@ namespace ito } return retValue; } + ////---------------------------------------------------------------------------------------------------------------------------------- ////! Sets a new value to a parameter. ///*! @@ -516,6 +667,7 @@ namespace ito } return retValue; } + ////---------------------------------------------------------------------------------------------------------------------------------- ////! synchronizes m_params with the params of default channel container ///*! @@ -553,6 +705,7 @@ namespace ito } return retValue; } + ////---------------------------------------------------------------------------------------------------------------------------------- ////! copies value m_params to the channel params of the current default channel ///*! @@ -605,6 +758,7 @@ namespace ito } return retVal; } + ////---------------------------------------------------------------------------------------------------------------------------------- ////! updates sizex and sizey ///*! @@ -623,7 +777,7 @@ namespace ito m_params["sizey"].setVal(height); } - + //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::setParamMeta(const QByteArray& paramName, ito::ParamMeta* meta, bool takeOwnerShip ,const QList& channelList/* = QList()*/) { assert(m_defaultConfigReady); @@ -675,6 +829,7 @@ namespace ito return retValue; } + //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::setParamFlags(const QByteArray& paramName, const unsigned int& flags, const QList& channelList/* = QList()*/) { assert(m_defaultConfigReady); @@ -725,6 +880,8 @@ namespace ito return retValue; } + + //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::getVal(QSharedPointer> dataObjMap, ItomSharedSemaphore* waitCond) { @@ -751,6 +908,8 @@ namespace ito } return retval; } + + //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::copyVal(QSharedPointer> dataObjMap, ItomSharedSemaphore* waitCond) { From 8298f0f03e535dc4e574299359317965b813bb31 Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Sun, 25 Jun 2023 22:40:16 +0200 Subject: [PATCH 45/62] compiler fixes and minor improvements of addInMultiChannelGrabber --- common/addInMultiChannelGrabber.h | 29 ++++++------ common/sources/addInMultiChannelGrabber.cpp | 51 ++++++++++----------- commonQt/CMakeLists.txt | 2 +- 3 files changed, 40 insertions(+), 42 deletions(-) diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index a5d974e4d..8109a07af 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -1,7 +1,7 @@ /* ******************************************************************** itom software URL: http://www.uni-stuttgart.de/ito - Copyright (C) 2020, Institut fuer Technische Optik (ITO), + Copyright (C) 2023, Institut fuer Technische Optik (ITO), Universitaet Stuttgart, Germany This file is part of itom and its software development toolkit (SDK). @@ -25,8 +25,7 @@ along with itom. If not, see . *********************************************************************** */ -#ifndef ADDINMULTICHANNELGRABBER_H -#define ADDINMULTICHANNELGRABBER_H +#pragma once #include "addInInterface.h" #include "addInGrabber.h" @@ -53,7 +52,7 @@ namespace ito struct ChannelContainer { - ito::DataObject data; + ito::DataObject m_data; QMap m_channelParam; ChannelContainer() @@ -111,16 +110,17 @@ namespace ito ~ChannelContainer() = default; ChannelContainer(const ChannelContainer&) = default; - ChannelContainer(ito::Param roi, - ito::Param pixelFormat, - ito::Param sizex, - ito::Param sizey, - ito::Param axisOffset, - ito::Param axisScale, - ito::Param axisDescription, - ito::Param axisUnit, - ito::Param valueDescription, - ito::Param valueUnit) + ChannelContainer( + const ito::Param &roi, + const ito::Param& pixelFormat, + const ito::Param& sizex, + const ito::Param& sizey, + const ito::Param& axisOffset, + const ito::Param& axisScale, + const ito::Param& axisDescription, + const ito::Param& axisUnit, + const ito::Param& valueDescription, + const ito::Param& valueUnit) { m_channelParam.insert("pixelFormat", pixelFormat); m_channelParam.insert("roi", roi); @@ -184,4 +184,3 @@ namespace ito }; } #endif -#endif diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index aa0a87871..2c0dbd805 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -170,7 +170,7 @@ namespace ito while (it != m_autoGrabbingListeners.end()) { const ChannelContainer& container = m_channels[it.key().toLatin1().data()]; - QSharedPointer pDObj(new ito::DataObject(container.data)); + QSharedPointer pDObj(new ito::DataObject(container.m_data)); if (!QMetaObject::invokeMethod(it.value(), "setSource", Q_ARG(QSharedPointer, pDObj), Q_ARG(ItomSharedSemaphore*, NULL))) { @@ -190,7 +190,7 @@ namespace ito // \todo On Linux a crash occurs here when closing the liveImage ... maybe the same reason why we get an error message on windows? if (it.value()) { - if (!QMetaObject::invokeMethod(it.value(), "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[it.key().toLatin1().data()].data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) + if (!QMetaObject::invokeMethod(it.value(), "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[it.key().toLatin1().data()].m_data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) { retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); } @@ -301,19 +301,19 @@ namespace ito { *(it.value()) = ito::DataObject(height, width, futureType); - m_channels[it.key()].data.setAxisScale(0, axisScale[0]); - m_channels[it.key()].data.setAxisScale(1, axisScale[1]); - m_channels[it.key()].data.setAxisOffset(0, axisOffset[0]); - m_channels[it.key()].data.setAxisOffset(1, axisOffset[1]); - m_channels[it.key()].data.setAxisDescription( + m_channels[it.key()].m_data.setAxisScale(0, axisScale[0]); + m_channels[it.key()].m_data.setAxisScale(1, axisScale[1]); + m_channels[it.key()].m_data.setAxisOffset(0, axisOffset[0]); + m_channels[it.key()].m_data.setAxisOffset(1, axisOffset[1]); + m_channels[it.key()].m_data.setAxisDescription( 0, axisDescription[0].toLatin1().data()); - m_channels[it.key()].data.setAxisDescription( + m_channels[it.key()].m_data.setAxisDescription( 1, axisDescription[1].toLatin1().data()); - m_channels[it.key()].data.setAxisUnit(0, axisUnit[0].toLatin1().data()); - m_channels[it.key()].data.setAxisUnit(1, axisUnit[1].toLatin1().data()); - m_channels[it.key()].data.setValueDescription( + m_channels[it.key()].m_data.setAxisUnit(0, axisUnit[0].toLatin1().data()); + m_channels[it.key()].m_data.setAxisUnit(1, axisUnit[1].toLatin1().data()); + m_channels[it.key()].m_data.setValueDescription( valueDescription.toLatin1().data()); - m_channels[it.key()].data.setValueUnit(valueUnit.toLatin1().data()); + m_channels[it.key()].m_data.setValueUnit(valueUnit.toLatin1().data()); } else if (it.value()->calcNumMats() != 1) { @@ -341,9 +341,8 @@ namespace ito QString axisDescription[] = {"", ""}; QString valueDescription = ""; QString valueUnit = ""; - unsigned int futureType; - PixelFormat format; + if (!externalDataObject) { QMutableMapIterator it(m_channels); @@ -416,19 +415,19 @@ namespace ito int* roi = it.value().m_channelParam["roi"].getVal(); int height = roi[3]; int width = roi[2]; - if (it.value().data.getDims() < 2 || it.value().data.getSize(0) != height || it.value().data.getSize(1) != width || it.value().data.getType() != futureType) + if (it.value().m_data.getDims() < 2 || it.value().m_data.getSize(0) != height || it.value().m_data.getSize(1) != width || it.value().m_data.getType() != futureType) { - it.value().data = ito::DataObject(height, width, futureType); - it.value().data.setAxisScale(0, axisScale[0]); - it.value().data.setAxisScale(1, axisScale[1]); - it.value().data.setAxisOffset(0, axisOffset[0]); - it.value().data.setAxisOffset(1, axisOffset[1]); - it.value().data.setAxisDescription(0, axisDescription[0].toLatin1().data()); - it.value().data.setAxisDescription(1, axisDescription[1].toLatin1().data()); - it.value().data.setAxisUnit(0, axisUnit[0].toLatin1().data()); - it.value().data.setAxisUnit(1, axisUnit[1].toLatin1().data()); - it.value().data.setValueDescription(valueDescription.toLatin1().data()); - it.value().data.setValueUnit(valueUnit.toLatin1().data()); + it.value().m_data = ito::DataObject(height, width, futureType); + it.value().m_data.setAxisScale(0, axisScale[0]); + it.value().m_data.setAxisScale(1, axisScale[1]); + it.value().m_data.setAxisOffset(0, axisOffset[0]); + it.value().m_data.setAxisOffset(1, axisOffset[1]); + it.value().m_data.setAxisDescription(0, axisDescription[0].toLatin1().data()); + it.value().m_data.setAxisDescription(1, axisDescription[1].toLatin1().data()); + it.value().m_data.setAxisUnit(0, axisUnit[0].toLatin1().data()); + it.value().m_data.setAxisUnit(1, axisUnit[1].toLatin1().data()); + it.value().m_data.setValueDescription(valueDescription.toLatin1().data()); + it.value().m_data.setValueUnit(valueUnit.toLatin1().data()); } } else diff --git a/commonQt/CMakeLists.txt b/commonQt/CMakeLists.txt index 23c147300..a875c2ad3 100644 --- a/commonQt/CMakeLists.txt +++ b/commonQt/CMakeLists.txt @@ -1,6 +1,6 @@ # - itom software # URL: http://www.uni-stuttgart.de/ito -# Copyright (C) 2020, Institut fuer Technische Optik (ITO), +# Copyright (C) 2023, Institut fuer Technische Optik (ITO), # Universitaet Stuttgart, Germany # # This file is part of itom and its software development toolkit (SDK). From 17ef70a3934afc7b694b2a2e64011331fbe939db Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Sun, 25 Jun 2023 23:46:51 +0200 Subject: [PATCH 46/62] some improvements and modifications with respect to multiChannelGrabber --- common/addInGrabber.h | 8 ++----- common/addInInterface.h | 6 ++--- common/sources/addInMultiChannelGrabber.cpp | 25 +++++++++++++++------ plot/sources/AbstractDObjFigure.cpp | 11 +++++++-- 4 files changed, 32 insertions(+), 18 deletions(-) diff --git a/common/addInGrabber.h b/common/addInGrabber.h index 5a675441e..9d448683f 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -91,12 +91,8 @@ namespace ito AddInAbstractGrabberPrivate *dd; protected: - - - - void timerEvent (QTimerEvent *event); /*!< this method is called every time when the auto-grabbing-timer is fired. Usually you don't have to overwrite this method. */ - - + /*!< this method is called every time when the auto-grabbing-timer is fired. Usually you don't have to overwrite this method. */ + void timerEvent (QTimerEvent *event); //! implement this method in your camera plugin. In this method the image is grabbed and stored in the m_image variable. /*! diff --git a/common/addInInterface.h b/common/addInInterface.h index fe7b9222a..c6389ef78 100644 --- a/common/addInInterface.h +++ b/common/addInInterface.h @@ -816,9 +816,9 @@ class ITOMCOMMONQT_EXPORT AddInDataIO : public AddInBase // void timerEvent (QTimerEvent *event) = 0; //implement this event in your plugin, if you are a device, which is // accessible by any liveImage!!! - QMultiMap - m_autoGrabbingListeners; /*!< MultiMap of listeners (live image source nodes), which want to have updates from - this camera. The String indicates the channel. */ + /*!< MultiMap of listeners (live image source nodes), which want to have updates from + this camera. The String indicates the channel (for multigrabber sources), else the channel is an empty string. */ + QMultiMap m_autoGrabbingListeners; int m_timerID; /*!< internal ID of the timer, which acquires images for any live view (if allowed) */ int m_timerIntervalMS; /*!< timer interval (in ms)*/ bool m_autoGrabbingEnabled; /*!< defines, whether the auto-grabbing timer for any live image can be activated. If diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index 2c0dbd805..6b75e73d8 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -546,21 +546,28 @@ namespace ito assert(m_defaultConfigReady); ito::RetVal retValue(ito::retOk); bool found = false; + if (obj) { - QMultiMap::iterator i = m_autoGrabbingListeners.begin(); + while (i != m_autoGrabbingListeners.end()) { if (i.value() == obj) { found = true; - m_autoGrabbingListeners.remove(i.key(), i.value()); - m_autoGrabbingListeners.insert(newChannel, obj); + + if (i.key() != newChannel) + { + // the channel has changed + m_autoGrabbingListeners.remove(i.key(), obj); + m_autoGrabbingListeners.insert(newChannel, obj); + } + break; } - } + if (!found) { retValue += ito::RetVal(ito::retError, 0, tr("Could not find plot in m_autoGrabbingListeners").toLatin1().data()); @@ -679,18 +686,21 @@ namespace ito assert(m_defaultConfigReady); ito::RetVal retValue(ito::retOk); unsigned int flag = 0; - const char* selectedChannel = m_params["defaultChannel"].getVal(); + QString selectedChannel = QLatin1String(m_params["defaultChannel"].getVal()); + if (m_channels.contains(selectedChannel)) { QMutableMapIterator itParam(m_params); + while (itParam.hasNext()) { itParam.next(); + if (m_paramChannelAvailabilityMap[itParam.key()].contains(selectedChannel)) { itParam.value() = m_channels[selectedChannel].m_channelParam[itParam.key()]; } - else if(!m_paramChannelAvailabilityMap[itParam.key()].isEmpty()) + else if (!m_paramChannelAvailabilityMap[itParam.key()].isEmpty()) { flag = itParam.value().getFlags(); flag |= ito::ParamBase::Readonly; @@ -718,7 +728,8 @@ namespace ito { assert(m_defaultConfigReady); ito::RetVal retVal(ito::retOk); - QString currentChannel = m_params["defaultChannel"].getVal(); + QString currentChannel = QLatin1String(m_params["defaultChannel"].getVal()); + if (!keyList.isEmpty()) { if (m_channels.contains(currentChannel)) diff --git a/plot/sources/AbstractDObjFigure.cpp b/plot/sources/AbstractDObjFigure.cpp index 1125f8b0f..1c5eaa054 100644 --- a/plot/sources/AbstractDObjFigure.cpp +++ b/plot/sources/AbstractDObjFigure.cpp @@ -402,19 +402,23 @@ QPixmap AbstractDObjFigure::renderToPixMap(const int xsize, const int ysize, con emptyMap.fill(Qt::green); return emptyMap; } + //------------------------------------------------------------------------------------- ito::RetVal AbstractDObjFigure::setDisplayedCameraChannel(const QString& channel) { ito::RetVal retValue(ito::retOk); QPointer liveSource = getCamera(); + if (liveSource) { bool isMultiChannel = false; isMultiChannel = liveSource->inherits("ito::AddInMultiChannelGrabber"); + if (isMultiChannel) { ItomSharedSemaphoreLocker locker(new ItomSharedSemaphore()); QSharedPointer channelListParam(new ito::Param("channelList", ito::ParamBase::StringList)); + if (QMetaObject::invokeMethod(liveSource, "getParam", Q_ARG(QSharedPointer, channelListParam), Q_ARG(ItomSharedSemaphore*, locker.getSemaphore()))) { bool timeout = false; @@ -424,14 +428,16 @@ ito::RetVal AbstractDObjFigure::setDisplayedCameraChannel(const QString& channel retValue += ito::RetVal(ito::retError, 0, tr("timeout while getting channelList parameter").toLatin1().data()); break; } + if (!retValue.containsError()) { int len = 0; const ito::ByteArray* channelList = channelListParam->getVal(len); bool found = false; + for (int i = 0; i < len; i++) { - if (QString(channelList[i].data()).compare(channel) == 0) + if (QLatin1String(channelList[i].data()).compare(channel) == 0) { found = true; m_currentDisplayedCameraChannel = channel; @@ -439,9 +445,10 @@ ito::RetVal AbstractDObjFigure::setDisplayedCameraChannel(const QString& channel break; } } + if (!found) { - retValue += ito::RetVal(ito::retError, 0, tr("the connected camera does not contain a channel called %1.").arg(channel).toLatin1().data()); + retValue += ito::RetVal(ito::retError, 0, tr("the connected camera does not provide the channel '%1'.").arg(channel).toLatin1().data()); } } } From c3719bdba93bfbffccdc723f03381fe3d37ab214 Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Wed, 28 Jun 2023 23:04:45 +0200 Subject: [PATCH 47/62] multigrabber refactoring --- AddInManager/pluginModel.cpp | 2 +- Qitom/widgets/figureWidget.cpp | 2 +- common/abstractAddInGrabber.h | 154 ++++++++++++++ common/addInGrabber.h | 125 +----------- common/addInMultiChannelGrabber.h | 9 +- common/sources/abstractAddInGrabber.cpp | 214 ++++++++++++++++++++ common/sources/addInGrabber.cpp | 190 +---------------- common/sources/addInMultiChannelGrabber.cpp | 11 +- commonQt/CMakeLists.txt | 4 +- 9 files changed, 398 insertions(+), 313 deletions(-) create mode 100644 common/abstractAddInGrabber.h create mode 100644 common/sources/abstractAddInGrabber.cpp diff --git a/AddInManager/pluginModel.cpp b/AddInManager/pluginModel.cpp index 04b679f6b..7cd143b28 100644 --- a/AddInManager/pluginModel.cpp +++ b/AddInManager/pluginModel.cpp @@ -1478,7 +1478,7 @@ bool PlugInModel::getIsGrabberInstance(tItemType &itemType, size_t &internalData if(itemType == PlugInModel::itemInstance) //internalData can be casted to AddInBase { ito::AddInBase *aib = (ito::AddInBase*)(internalData); - if(aib->inherits("ito::AddInAbstractGrabber")) + if(aib->inherits("ito::AbstractAddInGrabber")) { return true; } diff --git a/Qitom/widgets/figureWidget.cpp b/Qitom/widgets/figureWidget.cpp index 973c7bda5..d31623c61 100644 --- a/Qitom/widgets/figureWidget.cpp +++ b/Qitom/widgets/figureWidget.cpp @@ -499,7 +499,7 @@ RetVal FigureWidget::liveImage( const char * pixelFormat = paramFormat->getVal(); int min, max = 0; bool ok = false; - AddInAbstractGrabber::integerPixelFormatStringToMinMaxValue(pixelFormat, min, max, ok); + AbstractAddInGrabber::minMaxBoundariesFromIntegerPixelFormat(pixelFormat, min, max, ok); if (ok) { bitRange.setMaximum(max); diff --git a/common/abstractAddInGrabber.h b/common/abstractAddInGrabber.h new file mode 100644 index 000000000..dbe04850b --- /dev/null +++ b/common/abstractAddInGrabber.h @@ -0,0 +1,154 @@ +/* ******************************************************************** + itom software + URL: http://www.uni-stuttgart.de/ito + Copyright (C) 2023, Institut fuer Technische Optik (ITO), + Universitaet Stuttgart, Germany + + This file is part of itom and its software development toolkit (SDK). + + itom is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public Licence as published by + the Free Software Foundation; either version 2 of the Licence, or (at + your option) any later version. + + In addition, as a special exception, the Institut fuer Technische + Optik (ITO) gives you certain additional rights. + These rights are described in the ITO LGPL Exception version 1.0, + which can be found in the file LGPL_EXCEPTION.txt in this package. + + itom is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library + General Public Licence for more details. + + You should have received a copy of the GNU Library General Public License + along with itom. If not, see . +*********************************************************************** */ + +#pragma once + +#include "addInInterface.h" + +#include "../DataObject/dataobj.h" +#include "sharedStructuresQt.h" +#include "sharedStructures.h" + +#if !defined(Q_MOC_RUN) || defined(ITOMCOMMONQT_MOC) //only moc this file in itomCommonQtLib but not in other libraries or executables linking against this itomCommonQtLib + +namespace ito +{ + class AbstractAddInGrabberPrivate; + + class ITOMCOMMONQT_EXPORT AbstractAddInGrabber : public ito::AddInDataIO + { + Q_OBJECT + public: + + // all items must be lowercase! + enum PixelFormat + { + mono8 = ito::tUInt8, + mono8s = ito::tInt8, + mono10 = ito::tUInt16, + mono10Packed = ito::tUInt16, + mono12 = ito::tUInt16, + mono12Packed = ito::tUInt16, + mono14 = ito::tUInt16, + mono14Packed = ito::tUInt16, + mono16 = ito::tUInt16, + rgb8 = ito::tRGBA32, + rgba8 = ito::tRGBA32, + rgb8Planar = ito::tUInt8, + rgb10Planar = ito::tUInt16, + rgb12Planar = ito::tUInt16, + rgb16Planar = ito::tUInt16, + rg8 = ito::tRGBA32, + rg8Packed = ito::tRGBA32, + gb8 = ito::tRGBA32, + float32 = ito::tFloat32, + float64 = ito::tFloat64, + complex64 = ito::tComplex64, + complex128 = ito::tComplex128, + }; +#if QT_VERSION < 0x050500 + //for >= Qt 5.5.0 see Q_ENUM definition below + Q_ENUMS(PixelFormat) +#else + Q_ENUM(PixelFormat) +#endif + private: + //! counter indicating how many times startDevice has been called + /*! + increment this variable every time startDevice is called (by incGrabberStarted()) + decrement this variable every time stopDevice is called (by decGrabberStarted()) + + \sa grabberStartedCount, incGrabberStarted, decGrabberStarted, setGrabberStarted + */ + int m_started; + + AbstractAddInGrabberPrivate *dd; + + protected: + /*!< this method is called every time when the auto-grabbing-timer is fired. Usually you don't have to overwrite this method. */ + void timerEvent (QTimerEvent *event); + + //! implement this method in your camera plugin. In this method the image is grabbed and stored in the m_image variable. + /*! + Call this method in getVal(...) in order to get the image from the camera and deeply copy it the the m_image variable. + This method is equally called from timerEvent. + + \return retOk if copy operation was successfull, else retWarning or retError + \sa getVal, timerEvent + */ + virtual ito::RetVal retrieveData(ito::DataObject *externalDataObject = nullptr) = 0; + + virtual ito::RetVal sendDataToListeners(int waitMS) = 0; /*!< sends m_data to all registered listeners. */ + + inline int grabberStartedCount() { return m_started; } /*!< returns the number of started devices \see m_started */ + + /*!< increments the number of started devices \see m_started */ + inline void incGrabberStarted() + { + m_started++; + + if(m_started == 1) + { + runStatusChanged(true); //now, the device is started -> check if any listener is connected and if so start the auto grabbing timer (if flag is true, too) + } + } + + /*!< decrements the number of started devices \see m_started */ + inline void decGrabberStarted() + { + m_started--; + if(m_started == 0) + { + runStatusChanged(false); //now, the device is stopped -> stop any possibly started auto grabbing listener + } + } + + /*!< sets the number of started devices to a given value \see m_started */ + inline void setGrabberStarted(int value) + { + m_started = value; + runStatusChanged( value > 0 ); + } + + public: + /*!< this method gives the value range pixel for a given integer pixelFormat */ + static void minMaxBoundariesFromIntegerPixelFormat( + const QByteArray &pixelFormat, + int& min, + int& max, + bool& ok); + + /*!< this method maps a string to a value of PixelFormat */ + static int itoDataTypeFromPixelFormat(const QByteArray &pixelFormat, bool *ok = nullptr); + + AbstractAddInGrabber(); + ~AbstractAddInGrabber(); + }; + +} //end namespace ito + +#endif //#if !defined(Q_MOC_RUN) || defined(ITOMCOMMONQT_MOC) diff --git a/common/addInGrabber.h b/common/addInGrabber.h index 9d448683f..2c2aa5658 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -1,7 +1,7 @@ /* ******************************************************************** itom software URL: http://www.uni-stuttgart.de/ito - Copyright (C) 2020, Institut fuer Technische Optik (ITO), + Copyright (C) 2023, Institut fuer Technische Optik (ITO), Universitaet Stuttgart, Germany This file is part of itom and its software development toolkit (SDK). @@ -25,10 +25,9 @@ along with itom. If not, see . *********************************************************************** */ -#ifndef ADDINGRABBER_H -#define ADDINGRABBER_H +#pragma once -#include "addInInterface.h" +#include "abstractAddInGrabber.h" #include "../DataObject/dataobj.h" #include "sharedStructuresQt.h" @@ -38,117 +37,9 @@ namespace ito { - class AddInAbstractGrabberPrivate; class AddInGrabberPrivate; - class ITOMCOMMONQT_EXPORT AddInAbstractGrabber : public ito::AddInDataIO - { - Q_OBJECT - public: - - // all items must be lowercase! - enum PixelFormat - { - mono8 = ito::tUInt8, - mono8s = ito::tInt8, - mono10 = ito::tUInt16, - mono10Packed = ito::tUInt16, - mono12 = ito::tUInt16, - mono12Packed = ito::tUInt16, - mono14 = ito::tUInt16, - mono14Packed = ito::tUInt16, - mono16 = ito::tUInt16, - rgb8 = ito::tRGBA32, - rgba8 = ito::tRGBA32, - rgb8Planar = ito::tUInt8, - rgb10Planar = ito::tUInt16, - rgb12Planar = ito::tUInt16, - rgb16Planar = ito::tUInt16, - rg8 = ito::tRGBA32, - rg8Packed = ito::tRGBA32, - gb8 = ito::tRGBA32, - float32 = ito::tFloat32, - float64 = ito::tFloat64, - complex64 = ito::tComplex64, - complex128 = ito::tComplex128, - }; -#if QT_VERSION < 0x050500 - //for >= Qt 5.5.0 see Q_ENUM definition below - Q_ENUMS(PixelFormat) -#else - Q_ENUM(PixelFormat) -#endif - private: - //! counter indicating how many times startDevice has been called - /*! - increment this variable every time startDevice is called (by incGrabberStarted()) - decrement this variable every time stopDevice is called (by decGrabberStarted()) - - \sa grabberStartedCount, incGrabberStarted, decGrabberStarted, setGrabberStarted - */ - int m_started; - - AddInAbstractGrabberPrivate *dd; - - protected: - /*!< this method is called every time when the auto-grabbing-timer is fired. Usually you don't have to overwrite this method. */ - void timerEvent (QTimerEvent *event); - - //! implement this method in your camera plugin. In this method the image is grabbed and stored in the m_image variable. - /*! - Call this method in getVal(...) in order to get the image from the camera and deeply copy it the the m_image variable. - This method is equally called from timerEvent. - - \return retOk if copy operation was successfull, else retWarning or retError - \sa getVal, timerEvent - */ - virtual ito::RetVal retrieveData(ito::DataObject *externalDataObject = NULL) = 0; - - virtual ito::RetVal sendDataToListeners(int waitMS) = 0; /*!< sends m_data to all registered listeners. */ - - inline int grabberStartedCount() { return m_started; } /*!< returns the number of started devices \see m_started */ - - /*!< increments the number of started devices \see m_started */ - inline void incGrabberStarted() - { - m_started++; - if(m_started == 1) - { - runStatusChanged(true); //now, the device is started -> check if any listener is connected and if so start the auto grabbing timer (if flag is true, too) - } - } - - /*!< decrements the number of started devices \see m_started */ - inline void decGrabberStarted() - { - m_started--; - if(m_started == 0) - { - runStatusChanged(false); //now, the device is stopped -> stop any possibly started auto grabbing listener - } - } - - /*!< sets the number of started devices to a given value \see m_started */ - inline void setGrabberStarted(int value) - { - m_started = value; - runStatusChanged( value > 0 ); - } - - public: - static void integerPixelFormatStringToMinMaxValue( - const char* val, - int& min, - int& max, - bool& ok); /*!< this method gives the value range pixel for a given integer pixelFormat */ - static int pixelFormatStringToEnum(const QByteArray &val, bool* ok); /*!< this method maps a string to a value of pixelFormat */ - AddInAbstractGrabber(); - ~AddInAbstractGrabber(); - - - }; - - class ITOMCOMMONQT_EXPORT AddInGrabber : public AddInAbstractGrabber + class ITOMCOMMONQT_EXPORT AddInGrabber : public AbstractAddInGrabber { Q_OBJECT private: @@ -167,7 +58,7 @@ namespace ito \see m_image */ - virtual ito::RetVal checkData(ito::DataObject *externalDataObject = NULL); + virtual ito::RetVal checkData(ito::DataObject *externalDataObject = nullptr); virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ public: @@ -176,12 +67,6 @@ namespace ito }; - - - - } //end namespace ito #endif //#if !defined(Q_MOC_RUN) || defined(ITOMCOMMONQT_MOC) - -#endif diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index 8109a07af..6653d60fe 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -28,7 +28,7 @@ #pragma once #include "addInInterface.h" -#include "addInGrabber.h" +#include "abstractAddInGrabber.h" #include "../DataObject/dataobj.h" #include "sharedStructuresQt.h" @@ -40,7 +40,7 @@ namespace ito { class AddInMultiChannelGrabberPrivate; - class ITOMCOMMONQT_EXPORT AddInMultiChannelGrabber : public AddInAbstractGrabber + class ITOMCOMMONQT_EXPORT AddInMultiChannelGrabber : public AbstractAddInGrabber { Q_OBJECT private: @@ -171,10 +171,11 @@ namespace ito public: AddInMultiChannelGrabber(const QByteArray &grabberName); ~AddInMultiChannelGrabber(); + public slots: - ito::RetVal setParam(QSharedPointer val, ItomSharedSemaphore *waitCond = NULL) final; + ito::RetVal setParam(QSharedPointer val, ItomSharedSemaphore *waitCond = nullptr) final; ito::RetVal getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) final; - ito::RetVal changeChannelForListerners(const QString& newChannel, QObject* obj); + ito::RetVal changeChannelForListeners(const QString& newChannel, QObject* obj); ito::RetVal getVal(QSharedPointer > dataObjMap, ItomSharedSemaphore* waitCond); ito::RetVal copyVal(QSharedPointer > dataObjMap, ItomSharedSemaphore* waitCond); diff --git a/common/sources/abstractAddInGrabber.cpp b/common/sources/abstractAddInGrabber.cpp new file mode 100644 index 000000000..5e11dd566 --- /dev/null +++ b/common/sources/abstractAddInGrabber.cpp @@ -0,0 +1,214 @@ +/* ******************************************************************** + itom software + URL: http://www.uni-stuttgart.de/ito + Copyright (C) 2023, Institut fuer Technische Optik (ITO), + Universitaet Stuttgart, Germany + + This file is part of itom and its software development toolkit (SDK). + + itom is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public Licence as published by + the Free Software Foundation; either version 2 of the Licence, or (at + your option) any later version. + + In addition, as a special exception, the Institut fuer Technische + Optik (ITO) gives you certain additional rights. + These rights are described in the ITO LGPL Exception version 1.0, + which can be found in the file LGPL_EXCEPTION.txt in this package. + + itom is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library + General Public Licence for more details. + + You should have received a copy of the GNU Library General Public License + along with itom. If not, see . +*********************************************************************** */ + +#include "abstractAddInGrabber.h" + +#include "common/helperCommon.h" +#include +#include +#include +#include + +namespace ito +{ +class AbstractAddInGrabberPrivate +{ + public: + // number of consecutive errors when automatically grabbing the next image. If this number + // becomes bigger than a threshold, auto grabbing will be disabled. + int m_nrLiveImageErrors; +}; + + +/*! +\class AbstractAddInGrabber +\brief Inherit from AbstractAddInGrabber if you write a camera/grabber plugin. Please call the constructor of +AbstractAddInGrabber within your plugin constructor. + +This class contains important variables and helper methods which simplify the creation of a camera plugin. Please +consider that you should implement the methods checkImage() and retriveImage() (pure virtual in this class) in your own +class. + +\see checkImage(), retrieveImage() +*/ + +//------------------------------------------------------------------------------------- +//! constructor +AbstractAddInGrabber::AbstractAddInGrabber() : AddInDataIO(), m_started(0) +{ + dd = new AbstractAddInGrabberPrivate(); + dd->m_nrLiveImageErrors = 0; +} + +//------------------------------------------------------------------------------------- +//! destructor +AbstractAddInGrabber::~AbstractAddInGrabber() +{ + DELETE_AND_SET_NULL(dd); +} + +//------------------------------------------------------------------------------------- +//! this method gives the value range pixel for a given integer pixelFormat. +void AbstractAddInGrabber::minMaxBoundariesFromIntegerPixelFormat(const QByteArray& pixelFormat, int &min, int &max, bool &ok) +{ + ok = false; + QByteArray pixelFormatLower = pixelFormat.toLower(); + + if (pixelFormatLower == "mono8" || pixelFormatLower == "rgb8" || pixelFormatLower == "rgba8" || + pixelFormatLower == "rgb8planar" || pixelFormatLower == "rg8" || pixelFormatLower == "rg8packed" || + pixelFormatLower == "gb8") + { + min = 0.0; + max = 255.0; + ok = true; + } + else if (pixelFormatLower == "mono8s") + { + min = -128.0; + max = 127.0; + ok = true; + } + else if (pixelFormatLower == "mono10" || pixelFormatLower == "mono10packed" || pixelFormatLower == "rgb10planar") + { + min = 0.0; + max = 1023.0; + ok = true; + } + else if (pixelFormatLower == "mono12" || pixelFormatLower == "mono12packed" || pixelFormatLower == "rgb12planar") + { + min = 0.0; + max = 4095.0; + ok = true; + } + else if (pixelFormatLower == "mono14" || pixelFormatLower == "mono14packed") + { + min = 0.0; + max = 16383.0; + ok = true; + } + else if (pixelFormatLower == "mono16" || pixelFormatLower == "rgb16planar") + { + min = 0.0; + max = 65535.0; + ok = true; + } +} +//------------------------------------------------------------------------------------- +/*! +\class AbstractAddInGrabber +\brief This method maps a string to a value of pixelFormat. + +This function maps a string to a pixel format by using QMetaType. +*/ + +int AbstractAddInGrabber::itoDataTypeFromPixelFormat(const QByteArray &pixelFormat, bool *ok) +{ +#if QT_VERSION >= 0x050500 + const QMetaObject mo = staticMetaObject; +#else + const QMetaObject mo = StaticQtMetaObject::get(); +#endif + const QByteArray pixelFormatLower = pixelFormat.toLower(); + const char *val_ = pixelFormatLower.data(); + QMetaEnum me = mo.enumerator(mo.indexOfEnumerator("PixelFormat")); + int dataType = me.keyToValue(val_, ok); + + return dataType; +} +//------------------------------------------------------------------------------------- +//! if any live image has been connected to this camera, this event will be regularly fired. +/*! + This event is continoulsy fired if auto grabbing is enabled. At first, the image is acquired (method acquire). Then + the image is retrieved (retrieveImage) and finally the newly grabbed image is send to all registered listeners + (sendImagetoListeners) +*/ +void AbstractAddInGrabber::timerEvent(QTimerEvent * /*event*/) +{ + QCoreApplication::sendPostedEvents(this, 0); + ito::RetVal retValue = ito::retOk; + + if (m_autoGrabbingListeners.size() > 0) // verify that any liveImage is listening + { + retValue += acquire(0, NULL); + + if (!retValue.containsError()) + { + retValue += retrieveData(); + } + + if (!retValue.containsError()) + { + retValue += sendDataToListeners(200); + } + + if (retValue.containsWarning()) + { + if (retValue.hasErrorMessage()) + { + std::cout << "warning while sending live image: " << retValue.errorMessage() << "\n" << std::endl; + } + else + { + std::cout << "warning while sending live image." + << "\n" + << std::endl; + } + + dd->m_nrLiveImageErrors = 0; + } + else if (retValue.containsError()) + { + if (retValue.hasErrorMessage()) + { + std::cout << "error while sending live image: " << retValue.errorMessage() << "\n" << std::endl; + } + else + { + std::cout << "error while sending live image." + << "\n" + << std::endl; + } + + dd->m_nrLiveImageErrors++; + + if (dd->m_nrLiveImageErrors > 10) + { + disableAutoGrabbing(); + dd->m_nrLiveImageErrors = 0; + std::cout << "Auto grabbing of grabber " << this->getIdentifier().toLatin1().data() + << " was stopped due to consecutive errors in the previous tries\n" + << std::endl; + } + } + else + { + dd->m_nrLiveImageErrors = 0; + } + } +} + +} // end namespace ito diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index 9c75c045d..712c01026 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -1,7 +1,7 @@ /* ******************************************************************** itom software URL: http://www.uni-stuttgart.de/ito - Copyright (C) 2020, Institut fuer Technische Optik (ITO), + Copyright (C) 2023, Institut fuer Technische Optik (ITO), Universitaet Stuttgart, Germany This file is part of itom and its software development toolkit (SDK). @@ -25,7 +25,7 @@ along with itom. If not, see . *********************************************************************** */ -#include "AddInGrabber.h" +#include "addInGrabber.h" #include "common/helperCommon.h" #include @@ -33,200 +33,28 @@ #include #include + namespace ito { -class AddInAbstractGrabberPrivate -{ - public: - int m_nrLiveImageErrors; // number of consecutive errors when automatically grabbing the next image. If this number - // becomes bigger than a threshold, auto grabbing will be disabled. -}; +//------------------------------------------------------------------------------------- class AddInGrabberPrivate { }; -class AddInMultiChannelGrabberPrivate -{ -}; - -/*! -\class AddInAbstractGrabber -\brief Inherit from AddInAbstractGrabber if you write a camera/grabber plugin. Please call the constructor of -AddInAbstractGrabber within your plugin constructor. - -This class contains important variables and helper methods which simplify the creation of a camera plugin. Please -consider that you should implement the methods checkImage() and retriveImage() (pure virtual in this class) in your own -class. - -\see checkImage(), retrieveImage() -*/ - -//---------------------------------------------------------------------------------------------------------------------------------- -//! constructor -AddInAbstractGrabber::AddInAbstractGrabber() : AddInDataIO(), m_started(0) -{ - dd = new AddInAbstractGrabberPrivate(); - dd->m_nrLiveImageErrors = 0; -} - -//---------------------------------------------------------------------------------------------------------------------------------- -//! destructor -AddInAbstractGrabber::~AddInAbstractGrabber() -{ - DELETE_AND_SET_NULL(dd); -} - -//---------------------------------------------------------------------------------------------------------------------------------- -//! this method gives the value range pixel for a given integer pixelFormat. -void AddInAbstractGrabber::integerPixelFormatStringToMinMaxValue(const char *val, int &min, int &max, bool &ok) -{ - ok = false; - const QByteArray formatString(val); - QByteArray lowerByteArray = formatString.toLower(); - if (lowerByteArray == "mono8" || lowerByteArray == "rgb8" || lowerByteArray == "rgba8" || - lowerByteArray == "rgb8planar" || lowerByteArray == "rg8" || lowerByteArray == "rg8packed" || - lowerByteArray == "gb8") - { - min = 0.0; - max = 255.0; - ok = true; - } - else if (lowerByteArray == "mono8s") - { - min = -128.0; - max = 127.0; - ok = true; - } - else if (lowerByteArray == "mono10" || lowerByteArray == "mono10packed" || lowerByteArray == "rgb10planar") - { - min = 0.0; - max = 1023.0; - ok = true; - } - else if (lowerByteArray == "mono12" || lowerByteArray == "mono12packed" || lowerByteArray == "rgb12planar") - { - min = 0.0; - max = 4095.0; - ok = true; - } - else if (lowerByteArray == "mono14" || lowerByteArray == "mono14packed") - { - min = 0.0; - max = 16383.0; - ok = true; - } - else if (lowerByteArray == "mono16" || lowerByteArray == "rgb16planar") - { - min = 0.0; - max = 65535.0; - ok = true; - } -} -//---------------------------------------------------------------------------------------------------------------------------------- -/*! -\class AddInAbstractGrabber -\brief This method maps a string to a value of pixelFormat. - -This function maps a string to a pixel format by using QMetaType. -*/ -int AddInAbstractGrabber::pixelFormatStringToEnum(const QByteArray &val, bool *ok) -{ -#if QT_VERSION >= 0x050500 - const QMetaObject mo = staticMetaObject; -#else - const QMetaObject mo = StaticQtMetaObject::get(); -#endif - const QByteArray lowerByte = val.toLower(); - const char *val_ = lowerByte.data(); - QMetaEnum me = mo.enumerator(mo.indexOfEnumerator("PixelFormat")); - int pixelFormat = me.keyToValue(val_, ok); - return pixelFormat; -} -//---------------------------------------------------------------------------------------------------------------------------------- -//! if any live image has been connected to this camera, this event will be regularly fired. -/*! - This event is continoulsy fired if auto grabbing is enabled. At first, the image is acquired (method acquire). Then - the image is retrieved (retrieveImage) and finally the newly grabbed image is send to all registered listeners - (sendImagetoListeners) -*/ -void AddInAbstractGrabber::timerEvent(QTimerEvent * /*event*/) -{ - QCoreApplication::sendPostedEvents(this, 0); - ito::RetVal retValue = ito::retOk; - - if (m_autoGrabbingListeners.size() > 0) // verify that any liveImage is listening - { - retValue += acquire(0, NULL); - - if (!retValue.containsError()) - { - retValue += retrieveData(); - } - - if (!retValue.containsError()) - { - retValue += sendDataToListeners(200); - } - - if (retValue.containsWarning()) - { - if (retValue.hasErrorMessage()) - { - std::cout << "warning while sending live image: " << retValue.errorMessage() << "\n" << std::endl; - } - else - { - std::cout << "warning while sending live image." - << "\n" - << std::endl; - } - - dd->m_nrLiveImageErrors = 0; - } - else if (retValue.containsError()) - { - if (retValue.hasErrorMessage()) - { - std::cout << "error while sending live image: " << retValue.errorMessage() << "\n" << std::endl; - } - else - { - std::cout << "error while sending live image." - << "\n" - << std::endl; - } - - dd->m_nrLiveImageErrors++; - - if (dd->m_nrLiveImageErrors > 10) - { - disableAutoGrabbing(); - dd->m_nrLiveImageErrors = 0; - std::cout << "Auto grabbing of grabber " << this->getIdentifier().toLatin1().data() - << " was stopped due to consecutive errors in the previous tries\n" - << std::endl; - } - } - else - { - dd->m_nrLiveImageErrors = 0; - } - } -} -//---------------------------------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------- //! constructor -AddInGrabber::AddInGrabber() : AddInAbstractGrabber() +AddInGrabber::AddInGrabber() : AbstractAddInGrabber() { dd = new AddInGrabberPrivate(); } -//---------------------------------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------- //! destructor AddInGrabber::~AddInGrabber() { DELETE_AND_SET_NULL(dd); } -//---------------------------------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------- ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) { const int futureHeight = m_params["sizey"].getVal(); @@ -394,7 +222,7 @@ ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) return ito::retOk; } -//---------------------------------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------- //! sends m_image to all registered listeners. /*! This method is continuously called from timerEvent. Also call this method from your getVal-Method (usually with diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index 6b75e73d8..c868238b0 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -43,7 +43,7 @@ namespace ito //---------------------------------------------------------------------------------------------------------------------------------- //! constructor AddInMultiChannelGrabber::AddInMultiChannelGrabber(const QByteArray &grabberName) : - AddInAbstractGrabber(), + AbstractAddInGrabber(), m_defaultConfigReady(false) { dd = new AddInMultiChannelGrabberPrivate(); @@ -291,7 +291,8 @@ namespace ito m_channels[it.key()].m_channelParam["valueUnit"].getVal()); } - futureType = pixelFormatStringToEnum(m_channels[it.key()].m_channelParam["pixelFormat"].getVal(), &ok); + futureType = itoDataTypeFromPixelFormat(m_channels[it.key()].m_channelParam["pixelFormat"].getVal(), &ok); + if (ok) { int* roi = m_channels[it.key()].m_channelParam["roi"].getVal(); @@ -409,7 +410,7 @@ namespace ito m_channels[it.key()].m_channelParam["valueUnit"].getVal()); } - futureType = pixelFormatStringToEnum(it.value().m_channelParam["pixelFormat"].getVal(), &ok); + futureType = itoDataTypeFromPixelFormat(it.value().m_channelParam["pixelFormat"].getVal(), &ok); if (ok) { int* roi = it.value().m_channelParam["roi"].getVal(); @@ -442,7 +443,7 @@ namespace ito char* channel = m_params["defaultChannel"].getVal(); if (m_channels.contains(channel)) { - futureType = pixelFormatStringToEnum(m_channels[channel].m_channelParam["pixelFormat"].getVal(), &ok); + futureType = itoDataTypeFromPixelFormat(m_channels[channel].m_channelParam["pixelFormat"].getVal(), &ok); if (ok) { int* roi = m_channels[channel].m_channelParam["roi"].getVal(); @@ -541,7 +542,7 @@ namespace ito } //---------------------------------------------------------------------------------------------------------------------------------- - ito::RetVal AddInMultiChannelGrabber::changeChannelForListerners(const QString& newChannel, QObject* obj) + ito::RetVal AddInMultiChannelGrabber::changeChannelForListeners(const QString& newChannel, QObject* obj) { assert(m_defaultConfigReady); ito::RetVal retValue(ito::retOk); diff --git a/commonQt/CMakeLists.txt b/commonQt/CMakeLists.txt index a875c2ad3..e230846de 100644 --- a/commonQt/CMakeLists.txt +++ b/commonQt/CMakeLists.txt @@ -69,8 +69,9 @@ link_directories( set(ITOMCOMMONQT_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/commonQtVersion.h + ${CMAKE_CURRENT_SOURCE_DIR}/../common/abstractAddInGrabber.h ${CMAKE_CURRENT_SOURCE_DIR}/../common/addInGrabber.h - ${CMAKE_CURRENT_SOURCE_DIR}/../common/addInMultiChannelGrabber.h + ${CMAKE_CURRENT_SOURCE_DIR}/../common/addInMultiChannelGrabber.h ${CMAKE_CURRENT_SOURCE_DIR}/../common/addInInterface.h ${CMAKE_CURRENT_SOURCE_DIR}/../common/addInInterfaceVersion.h ${CMAKE_CURRENT_SOURCE_DIR}/../common/abstractAddInDockWidget.h @@ -90,6 +91,7 @@ set(ITOMCOMMONQT_HEADERS ) set(ITOMCOMMONQT_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/../common/sources/abstractAddInGrabber.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../common/sources/addInGrabber.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../common/sources/addInMultiChannelGrabber.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../common/sources/addInInterface.cpp From f969aa9745205e2ba43261b0fefa7cb0ad2ccc92 Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Mon, 3 Jul 2023 21:58:08 +0200 Subject: [PATCH 48/62] fix in AIManagerWidget --- Qitom/widgets/AIManagerWidget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Qitom/widgets/AIManagerWidget.cpp b/Qitom/widgets/AIManagerWidget.cpp index dc81ed0e1..a5ba4828d 100644 --- a/Qitom/widgets/AIManagerWidget.cpp +++ b/Qitom/widgets/AIManagerWidget.cpp @@ -1066,7 +1066,7 @@ void AIManagerWidget::mnuShowLiveImage() if (index.isValid()) { ito::AddInBase *ais = (ito::AddInBase *)index.internalPointer(); - if (ais && ais->inherits("ito::AddInAbstractGrabber")) + if (ais && ais->inherits("ito::AbstractAddInGrabber")) { UiOrganizer *uiOrg = (UiOrganizer*)AppManagement::getUiOrganizer(); QString defaultPlotClassName; @@ -1123,7 +1123,7 @@ void AIManagerWidget::mnuSnapDialog() if (index.isValid()) { ito::AddInBase *ais = (ito::AddInBase *)index.internalPointer(); - if (ais && ais->inherits("ito::AddInAbstractGrabber")) + if (ais && ais->inherits("ito::AbstractAddInGrabber")) { ito::RetVal retval = ito::retOk; QPointer aisPointer((ito::AddInDataIO*)ais); From a27acbe3c996d2941fcf6dd81878996cbce9be21 Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Sun, 9 Jul 2023 14:39:55 +0200 Subject: [PATCH 49/62] some intermediate steps for multichannelGrabber. Not finished yet. --- common/abstractAddInConfigDialog.h | 11 +- common/abstractAddInDockWidget.h | 11 +- common/abstractAddInGrabber.h | 47 +-- common/addInGrabber.h | 3 +- common/addInInterface.h | 49 ++- common/addInMultiChannelGrabber.h | 124 ++---- common/sources/abstractAddInConfigDialog.cpp | 13 +- common/sources/abstractAddInDockWidget.cpp | 17 +- common/sources/abstractAddInGrabber.cpp | 74 +++- common/sources/addInGrabber.cpp | 5 +- common/sources/addInInterface.cpp | 180 ++++----- common/sources/addInMultiChannelGrabber.cpp | 382 ++++++++++++++----- plot/sources/AbstractDObjFigure.cpp | 2 +- 13 files changed, 548 insertions(+), 370 deletions(-) diff --git a/common/abstractAddInConfigDialog.h b/common/abstractAddInConfigDialog.h index c488e5cf1..e79bbcd34 100644 --- a/common/abstractAddInConfigDialog.h +++ b/common/abstractAddInConfigDialog.h @@ -1,7 +1,7 @@ /* ******************************************************************** itom software URL: http://www.uni-stuttgart.de/ito - Copyright (C) 2020, Institut fuer Technische Optik (ITO), + Copyright (C) 2023, Institut fuer Technische Optik (ITO), Universitaet Stuttgart, Germany This file is part of itom and its software development toolkit (SDK). @@ -25,8 +25,7 @@ along with itom. If not, see . *********************************************************************** */ -#ifndef ABSTRACTADDINCONFIGDIALOG_H -#define ABSTRACTADDINCONFIGDIALOG_H +#pragma once #include "retVal.h" #include "typeDefs.h" @@ -41,8 +40,6 @@ - - //forward declarations namespace ito { @@ -159,7 +156,9 @@ namespace ito QMap m_currentParameters; /*! use this map to save the current values of all parameters. For instance it is conventient to copy the map given in parametersChanged to this map */ private: - AbstractAddInConfigDialogPrivate* d; /*! private data pointer of this class. */ + /*! private data pointer of this class. */ + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(AbstractAddInConfigDialog); public slots: //! slot invoked if any parameter of the plugin has been changed. diff --git a/common/abstractAddInDockWidget.h b/common/abstractAddInDockWidget.h index 882083662..fcfc27c7c 100644 --- a/common/abstractAddInDockWidget.h +++ b/common/abstractAddInDockWidget.h @@ -1,7 +1,7 @@ /* ******************************************************************** itom software URL: http://www.uni-stuttgart.de/ito - Copyright (C) 2020, Institut fuer Technische Optik (ITO), + Copyright (C) 2023, Institut fuer Technische Optik (ITO), Universitaet Stuttgart, Germany This file is part of itom and its software development toolkit (SDK). @@ -25,8 +25,7 @@ along with itom. If not, see . *********************************************************************** */ -#ifndef ABSTRACTADDINDOCKWIDGET_H -#define ABSTRACTADDINDOCKWIDGET_H +#pragma once #include "retVal.h" #include "typeDefs.h" @@ -183,7 +182,9 @@ namespace ito ito::RetVal requestActuatorStatusAndPositions(bool sendCurrentPos, bool sendTargetPos, MessageLevel msgLevel = msgLevelWarningAndError) const; private: - AbstractAddInDockWidgetPrivate* d; /*! private data pointer of this class. */ + /*! private data pointer of this class. */ + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(AbstractAddInDockWidget); public slots: //! slot invoked if any parameter of the plugin has been changed. @@ -231,5 +232,3 @@ namespace ito virtual void targetChanged(QVector targetPositions); }; } //end namespace ito - -#endif //ABSTRACTADDINDOCKWIDGET_H diff --git a/common/abstractAddInGrabber.h b/common/abstractAddInGrabber.h index dbe04850b..a481f35a0 100644 --- a/common/abstractAddInGrabber.h +++ b/common/abstractAddInGrabber.h @@ -70,23 +70,12 @@ namespace ito complex64 = ito::tComplex64, complex128 = ito::tComplex128, }; -#if QT_VERSION < 0x050500 - //for >= Qt 5.5.0 see Q_ENUM definition below - Q_ENUMS(PixelFormat) -#else - Q_ENUM(PixelFormat) -#endif - private: - //! counter indicating how many times startDevice has been called - /*! - increment this variable every time startDevice is called (by incGrabberStarted()) - decrement this variable every time stopDevice is called (by decGrabberStarted()) - \sa grabberStartedCount, incGrabberStarted, decGrabberStarted, setGrabberStarted - */ - int m_started; + Q_ENUM(PixelFormat) - AbstractAddInGrabberPrivate *dd; + private: + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(AbstractAddInGrabber); protected: /*!< this method is called every time when the auto-grabbing-timer is fired. Usually you don't have to overwrite this method. */ @@ -104,35 +93,17 @@ namespace ito virtual ito::RetVal sendDataToListeners(int waitMS) = 0; /*!< sends m_data to all registered listeners. */ - inline int grabberStartedCount() { return m_started; } /*!< returns the number of started devices \see m_started */ + /*!< returns the number of started devices \see m_started */ + int grabberStartedCount() const; /*!< increments the number of started devices \see m_started */ - inline void incGrabberStarted() - { - m_started++; - - if(m_started == 1) - { - runStatusChanged(true); //now, the device is started -> check if any listener is connected and if so start the auto grabbing timer (if flag is true, too) - } - } + void incGrabberStarted(); /*!< decrements the number of started devices \see m_started */ - inline void decGrabberStarted() - { - m_started--; - if(m_started == 0) - { - runStatusChanged(false); //now, the device is stopped -> stop any possibly started auto grabbing listener - } - } + void decGrabberStarted(); /*!< sets the number of started devices to a given value \see m_started */ - inline void setGrabberStarted(int value) - { - m_started = value; - runStatusChanged( value > 0 ); - } + void setGrabberStarted(int value); public: /*!< this method gives the value range pixel for a given integer pixelFormat */ diff --git a/common/addInGrabber.h b/common/addInGrabber.h index 2c2aa5658..f7fe9fe0b 100644 --- a/common/addInGrabber.h +++ b/common/addInGrabber.h @@ -43,8 +43,9 @@ namespace ito { Q_OBJECT private: + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(AddInGrabber); - AddInGrabberPrivate *dd; protected: ito::DataObject m_data; /*!< variable for the recently grabbed image*/ diff --git a/common/addInInterface.h b/common/addInInterface.h index c6389ef78..31c42ecef 100644 --- a/common/addInInterface.h +++ b/common/addInInterface.h @@ -1,7 +1,7 @@ /* ******************************************************************** itom software URL: http://www.uni-stuttgart.de/ito -Copyright (C) 2020, Institut fuer Technische Optik (ITO), +Copyright (C) 2023, Institut fuer Technische Optik (ITO), Universitaet Stuttgart, Germany This file is part of itom and its software development toolkit (SDK). @@ -25,8 +25,7 @@ You should have received a copy of the GNU Library General Public License along with itom. If not, see . *********************************************************************** */ -#ifndef ADDININTERFACE_H -#define ADDININTERFACE_H +#pragma once #include "commonGlobal.h" @@ -272,8 +271,8 @@ class ITOMCOMMONQT_EXPORT AddInInterfaceBase : public QObject //!< internal function used within the closing process virtual ito::RetVal closeThisInst(ito::AddInBase **addInInst) = 0; - QScopedPointer - d_ptr; //!> self-managed pointer to the private class container (deletes itself if d_ptr is destroyed) + //!> self-managed pointer to the private class container (deletes itself if d_ptr is destroyed) + QScopedPointer d_ptr; Q_DECLARE_PRIVATE(AddInInterfaceBase); protected: @@ -649,6 +648,12 @@ class ITOMCOMMONQT_EXPORT AddInBase : public QObject //! sets the interface of this instance to base. \sa AddInInterfaceBase void setBasePlugin(AddInInterfaceBase *base); + //! inserts the given param to the m_params map. + /* + equivalent to: m_params.insert(param.getName(), param); + */ + void insertParam(const Param& param); + QMap m_params; //!< map of the available parameters QString m_identifier; //!< unique identifier (serial number, com-port...) @@ -675,25 +680,31 @@ class ITOMCOMMONQT_EXPORT AddInBase : public QObject //! decrements reference counter of this plugin (thread-safe) void decRefCount(void); - QVector m_hwDecList; //!< list of hardware that was passed to the plugin on - //!< initialisation and whose refcounter was incremented + //!< list of hardware that was passed to the plugin on + //!< initialisation and whose refcounter was incremented + QVector m_hwDecList; + + //!< map with registered additional functions. funcExec-name -> (default mandParams, default + //!< optParams, default outParams, infoString) QMap - m_execFuncList; //!< map with registered additional functions. funcExec-name -> (default mandParams, default - //!< optParams, default outParams, infoString) + m_execFuncList; - QScopedPointer - d_ptr; //!> self-managed pointer to the private class container (deletes itself if d_ptr is destroyed). pointer - //!to private class of AddInBase defined in AddInInterface.cpp. This container is used to allow flexible - //!changes in the interface without destroying the binary compatibility + //!> self-managed pointer to the private class container (deletes itself if d_ptr is destroyed). pointer + //!to private class of AddInBase defined in AddInInterface.cpp. This container is used to allow flexible + //!changes in the interface without destroying the binary compatibility + QScopedPointer d_ptr; Q_DECLARE_PRIVATE(AddInBase); - friend class AddInInterfaceBase; //!< AddInBase is friend with AddInInterfaceBase, such that the interface can - //!< access methods like the protected constructor or destructor of this plugin - //!< class. + //!< AddInBase is friend with AddInInterfaceBase, such that the interface can + //!< access methods like the protected constructor or destructor of this plugin + //!< class. + friend class AddInInterfaceBase; static int m_instCounter; - static int maxThreadCount; //!< maximum number of threads algorithms can use e.g. with OpenMP parallelization. This - //!< is a number between 1 and QThread::idealThreadCount() + + //!< maximum number of threads algorithms can use e.g. with OpenMP parallelization. This + //!< is a number between 1 and QThread::idealThreadCount() + static int maxThreadCount; Q_SIGNALS: //! This signal usually is emitted if the vector m_params is changed. @@ -1309,5 +1320,3 @@ class ITOMCOMMONQT_EXPORT AddInAlgo : public AddInBase //! must be out of namespace ito, otherwise it results in a strange compiler error (template ...) Q_DECLARE_INTERFACE(ito::AddInInterfaceBase, ito_AddInInterface_CurrentVersion /*"ito.AddIn.InterfaceBase/4"*/) - -#endif diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index 6653d60fe..71554daa4 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -43,105 +43,57 @@ namespace ito class ITOMCOMMONQT_EXPORT AddInMultiChannelGrabber : public AbstractAddInGrabber { Q_OBJECT - private: - AddInMultiChannelGrabberPrivate *dd; - bool m_defaultConfigReady; - QMap m_paramChannelAvailabilityMap; protected: - struct ChannelContainer + class ChannelContainer { - ito::DataObject m_data; - QMap m_channelParam; - - ChannelContainer() - { - ito::Param paramVal; - int roi[] = { 0, 0, 1, 1 }; - paramVal = ito::Param("roi", ito::ParamBase::IntArray, 4, roi, "roi"); - m_channelParam.insert(paramVal.getName(), paramVal); - - paramVal = ito::Param("sizex", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 1, 1, "sizex"); - m_channelParam.insert(paramVal.getName(), paramVal); - - paramVal = ito::Param("sizey", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 1, 1, "sizey"); - m_channelParam.insert(paramVal.getName(), paramVal); - - paramVal = ito::Param("pixelFormat", ito::ParamBase::String, "mono8", "pixelFormat"); - m_channelParam.insert(paramVal.getName(), paramVal); - - double axisOffset[] = { 0.0, 0.0 }; - paramVal = ito::Param("axisOffset", ito::ParamBase::DoubleArray, 2, axisOffset, "axis offset"); - m_channelParam.insert(paramVal.getName(), paramVal); - - double axisScale[] = { 1.0, 1.0 }; - paramVal = ito::Param("axisScale", ito::ParamBase::DoubleArray, 2, axisScale, "axis scale"); - m_channelParam.insert(paramVal.getName(), paramVal); - - QString axisUnit[] = {"", ""}; - paramVal = ito::Param( - "axisUnit", - ito::ParamBase::StringList, - axisUnit->toLatin1().data(), "axis unit"); - m_channelParam.insert(paramVal.getName(), paramVal); - - QString axisDescription[] = {"", ""}; - paramVal = ito::Param( - "axisDescription", - ito::ParamBase::StringList, - axisDescription->toLatin1().data(), - "axis description"); - m_channelParam.insert(paramVal.getName(), paramVal); - - QString valueDescription = ""; - paramVal = ito::Param( - "valueDescription", - ito::ParamBase::String, - valueDescription.toLatin1().data(), - "value description"); - m_channelParam.insert(paramVal.getName(), paramVal); - - QString valueUnit = ""; - paramVal = ito::Param( - "valueUnit", ito::ParamBase::String, valueUnit.toLatin1().data(), "value unit"); - m_channelParam.insert(paramVal.getName(), paramVal); - }; - + public: + ChannelContainer(); ~ChannelContainer() = default; ChannelContainer(const ChannelContainer&) = default; ChannelContainer( - const ito::Param &roi, + const ito::Param& roi, const ito::Param& pixelFormat, const ito::Param& sizex, const ito::Param& sizey, - const ito::Param& axisOffset, - const ito::Param& axisScale, - const ito::Param& axisDescription, - const ito::Param& axisUnit, + const ito::Param& axisOffsets, + const ito::Param& axisScales, + const ito::Param& axisDescriptions, + const ito::Param& axisUnits, const ito::Param& valueDescription, - const ito::Param& valueUnit) - { - m_channelParam.insert("pixelFormat", pixelFormat); - m_channelParam.insert("roi", roi); - m_channelParam.insert("sizex", sizex); - m_channelParam.insert("sizey", sizey); - m_channelParam.insert("axisOffset", axisOffset); - m_channelParam.insert("axisScale", axisScale); - m_channelParam.insert("axisDescription", axisDescription); - m_channelParam.insert("axisUnit", axisUnit); - m_channelParam.insert("valueDescription", valueDescription); - m_channelParam.insert("valueUnit", valueUnit); - } + const ito::Param& valueUnit); + ChannelContainer( + const ito::Param& roi, + const ito::Param& pixelFormat, + const ito::Param& sizex, + const ito::Param& sizey); + + void addChannelParam(const ito::Param& param); + + //!< dataObject container with currently acquired data for this channel + ito::DataObject m_data; + + //!< map of individual parameters for this channel. Every channel has a set + //! of default parameters, namely: pixelFormat, roi, sizex, sizey, axisOffset, axisScale. + //! axisDescription, axisUnit, valueDescription, valueUnit. Further parameters + //! can be added. It is recommended to have the same parameter types and names + //! in every channel, since they are mirrored to the m_params map of the main + //! plugin class. + ParamMap m_channelParam; + + protected: + void addDefaultMetaParams(); }; - QMap m_channels; /*!< Map for recently grabbed images of various channels*/ - virtual ito::RetVal checkData(ito::DataObject *externalDataObject = NULL); + QMap m_channels; /*!< Map for recently grabbed images of various channels */ + + virtual ito::RetVal checkData(ito::DataObject *externalDataObject = nullptr); virtual ito::RetVal checkData(QMap& externalDataObject); virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ void addChannel(QString name); - virtual ito::RetVal switchDefaultChannel();/*!< synchronizes m_params with the params of default channel container */ + virtual ito::RetVal switchChannelSelector();/*!< synchronizes m_params with the params of default channel container */ virtual ito::RetVal applyParamsToChannelParams(const QStringList& keyList = QStringList()); void initializeDefaultConfiguration(const QMap& channelContainerMap, const QMap& nonChannelSpecificParams = QMap());/*!< sets the channel parameters.*/ @@ -172,6 +124,10 @@ namespace ito AddInMultiChannelGrabber(const QByteArray &grabberName); ~AddInMultiChannelGrabber(); + private: + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(AddInMultiChannelGrabber); + public slots: ito::RetVal setParam(QSharedPointer val, ItomSharedSemaphore *waitCond = nullptr) final; ito::RetVal getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) final; @@ -180,8 +136,8 @@ namespace ito ito::RetVal copyVal(QSharedPointer > dataObjMap, ItomSharedSemaphore* waitCond); signals: - - void newData(QSharedPointer > dataObjMap); /*! > dataObjMap); }; } #endif diff --git a/common/sources/abstractAddInConfigDialog.cpp b/common/sources/abstractAddInConfigDialog.cpp index 703df59ca..6b3a0499e 100644 --- a/common/sources/abstractAddInConfigDialog.cpp +++ b/common/sources/abstractAddInConfigDialog.cpp @@ -1,7 +1,7 @@ /* ******************************************************************** itom software URL: http://www.uni-stuttgart.de/ito - Copyright (C) 2020, Institut fuer Technische Optik (ITO), + Copyright (C) 2023, Institut fuer Technische Optik (ITO), Universitaet Stuttgart, Germany This file is part of itom and its software development toolkit (SDK). @@ -42,29 +42,30 @@ namespace ito class AbstractAddInConfigDialogPrivate { public: - AbstractAddInConfigDialogPrivate() : m_pPlugin(NULL) + AbstractAddInConfigDialogPrivate() : m_pPlugin(nullptr) {} ito::AddInBase *m_pPlugin; }; //------------------------------------------------------------------------------------------------------------------------------------------------- -AbstractAddInConfigDialog::AbstractAddInConfigDialog(ito::AddInBase *plugin) : QDialog(), d(NULL) +AbstractAddInConfigDialog::AbstractAddInConfigDialog(ito::AddInBase *plugin) : QDialog(), d_ptr(new AbstractAddInConfigDialogPrivate()) { - d = new AbstractAddInConfigDialogPrivate(); + Q_D(AbstractAddInConfigDialog); + d->m_pPlugin = plugin; } //------------------------------------------------------------------------------------------------------------------------------------------------- AbstractAddInConfigDialog::~AbstractAddInConfigDialog() { - delete d; } //------------------------------------------------------------------------------------------------------------------------------------------------- ito::RetVal AbstractAddInConfigDialog::setPluginParameter(QSharedPointer param, MessageLevel msgLevel /*= msgLevelWarningAndError*/) { ito::RetVal retval; + Q_D(AbstractAddInConfigDialog); if (d->m_pPlugin) { @@ -133,6 +134,7 @@ ito::RetVal AbstractAddInConfigDialog::setPluginParameter(QSharedPointer > params, MessageLevel msgLevel /*= msgLevelWarningAndError*/) { ito::RetVal retval; + Q_D(AbstractAddInConfigDialog); if (d->m_pPlugin) { @@ -186,6 +188,7 @@ ito::RetVal AbstractAddInConfigDialog::setPluginParameters(const QVectorm_pPlugin) { diff --git a/common/sources/abstractAddInDockWidget.cpp b/common/sources/abstractAddInDockWidget.cpp index 02a071c63..753f0c3ec 100644 --- a/common/sources/abstractAddInDockWidget.cpp +++ b/common/sources/abstractAddInDockWidget.cpp @@ -1,7 +1,7 @@ /* ******************************************************************** itom software URL: http://www.uni-stuttgart.de/ito - Copyright (C) 2020, Institut fuer Technische Optik (ITO), + Copyright (C) 2023, Institut fuer Technische Optik (ITO), Universitaet Stuttgart, Germany This file is part of itom and its software development toolkit (SDK). @@ -41,29 +41,30 @@ namespace ito class AbstractAddInDockWidgetPrivate { public: - AbstractAddInDockWidgetPrivate() : m_pPlugin(NULL) + AbstractAddInDockWidgetPrivate() : m_pPlugin(nullptr) {} ito::AddInBase *m_pPlugin; }; //------------------------------------------------------------------------------------------------------------------------------------------------- -AbstractAddInDockWidget::AbstractAddInDockWidget(ito::AddInBase *plugin) : d(NULL) +AbstractAddInDockWidget::AbstractAddInDockWidget(ito::AddInBase *plugin) : d_ptr(new AbstractAddInDockWidgetPrivate()) { - d = new AbstractAddInDockWidgetPrivate(); + Q_D(AbstractAddInDockWidget); + d->m_pPlugin = plugin; } //------------------------------------------------------------------------------------------------------------------------------------------------- AbstractAddInDockWidget::~AbstractAddInDockWidget() { - delete d; } //------------------------------------------------------------------------------------------------------------------------------------------------- ito::RetVal AbstractAddInDockWidget::setPluginParameter(QSharedPointer param, MessageLevel msgLevel /*= msgLevelWarningAndError*/) const { ito::RetVal retval; + Q_D(const AbstractAddInDockWidget); if (d->m_pPlugin) { @@ -112,6 +113,7 @@ ito::RetVal AbstractAddInDockWidget::setPluginParameter(QSharedPointer > params, MessageLevel msgLevel /*= msgLevelWarningAndError*/) const { ito::RetVal retval; + Q_D(const AbstractAddInDockWidget); if (d->m_pPlugin) { @@ -160,6 +162,7 @@ ito::RetVal AbstractAddInDockWidget::setPluginParameters(const QVectorm_pPlugin) { @@ -210,6 +213,7 @@ ito::RetVal AbstractAddInDockWidget::observeInvocation(ItomSharedSemaphore *wait ito::RetVal AbstractAddInDockWidget::setActuatorPosition(QVector axes, QVector positions, bool relNotAbs, MessageLevel msgLevel) const { ito::RetVal retval; + Q_D(const AbstractAddInDockWidget); QByteArray funcName = relNotAbs ? "setPosRel" : "setPosAbs"; @@ -268,6 +272,7 @@ ito::RetVal AbstractAddInDockWidget::setActuatorPosition(QVector axes, QVec ito::RetVal AbstractAddInDockWidget::setActuatorPosition(int axis, double position, bool relNotAbs, MessageLevel msgLevel) const { ito::RetVal retval; + Q_D(const AbstractAddInDockWidget); QByteArray funcName = relNotAbs ? "setPosRel" : "setPosAbs"; @@ -326,6 +331,7 @@ ito::RetVal AbstractAddInDockWidget::setActuatorPosition(int axis, double positi ito::RetVal AbstractAddInDockWidget::requestActuatorStatusAndPositions(bool sendCurrentPos, bool sendTargetPos, MessageLevel msgLevel) const { ito::RetVal retval; + Q_D(const AbstractAddInDockWidget); if (d->m_pPlugin) { @@ -376,6 +382,7 @@ ito::RetVal AbstractAddInDockWidget::requestActuatorStatusAndPositions(bool send ito::RetVal AbstractAddInDockWidget::setActuatorInterrupt() const { ito::RetVal retval; + Q_D(const AbstractAddInDockWidget); if (d->m_pPlugin) { diff --git a/common/sources/abstractAddInGrabber.cpp b/common/sources/abstractAddInGrabber.cpp index 5e11dd566..007765372 100644 --- a/common/sources/abstractAddInGrabber.cpp +++ b/common/sources/abstractAddInGrabber.cpp @@ -38,9 +38,23 @@ namespace ito class AbstractAddInGrabberPrivate { public: + AbstractAddInGrabberPrivate() : m_nrLiveImageErrors(0), m_started(0) + { + + } + // number of consecutive errors when automatically grabbing the next image. If this number // becomes bigger than a threshold, auto grabbing will be disabled. int m_nrLiveImageErrors; + + //! counter indicating how many times startDevice has been called + /*! + increment this variable every time startDevice is called (by incGrabberStarted()) + decrement this variable every time stopDevice is called (by decGrabberStarted()) + + \sa grabberStartedCount, incGrabberStarted, decGrabberStarted, setGrabberStarted + */ + int m_started; }; @@ -58,17 +72,14 @@ class. //------------------------------------------------------------------------------------- //! constructor -AbstractAddInGrabber::AbstractAddInGrabber() : AddInDataIO(), m_started(0) +AbstractAddInGrabber::AbstractAddInGrabber() : AddInDataIO(), d_ptr(new AbstractAddInGrabberPrivate()) { - dd = new AbstractAddInGrabberPrivate(); - dd->m_nrLiveImageErrors = 0; } //------------------------------------------------------------------------------------- //! destructor AbstractAddInGrabber::~AbstractAddInGrabber() { - DELETE_AND_SET_NULL(dd); } //------------------------------------------------------------------------------------- @@ -148,6 +159,8 @@ int AbstractAddInGrabber::itoDataTypeFromPixelFormat(const QByteArray &pixelForm */ void AbstractAddInGrabber::timerEvent(QTimerEvent * /*event*/) { + Q_D(AbstractAddInGrabber); + QCoreApplication::sendPostedEvents(this, 0); ito::RetVal retValue = ito::retOk; @@ -178,7 +191,7 @@ void AbstractAddInGrabber::timerEvent(QTimerEvent * /*event*/) << std::endl; } - dd->m_nrLiveImageErrors = 0; + d->m_nrLiveImageErrors = 0; } else if (retValue.containsError()) { @@ -193,12 +206,12 @@ void AbstractAddInGrabber::timerEvent(QTimerEvent * /*event*/) << std::endl; } - dd->m_nrLiveImageErrors++; + d->m_nrLiveImageErrors++; - if (dd->m_nrLiveImageErrors > 10) + if (d->m_nrLiveImageErrors > 10) { disableAutoGrabbing(); - dd->m_nrLiveImageErrors = 0; + d->m_nrLiveImageErrors = 0; std::cout << "Auto grabbing of grabber " << this->getIdentifier().toLatin1().data() << " was stopped due to consecutive errors in the previous tries\n" << std::endl; @@ -206,9 +219,52 @@ void AbstractAddInGrabber::timerEvent(QTimerEvent * /*event*/) } else { - dd->m_nrLiveImageErrors = 0; + d->m_nrLiveImageErrors = 0; } } } +//------------------------------------------------------------------------------------- +/*!< returns the number of started devices \see m_started */ +int AbstractAddInGrabber::grabberStartedCount() const +{ + Q_D(const AbstractAddInGrabber); + return d->m_started; +} + +//------------------------------------------------------------------------------------- +/*!< increments the number of started devices \see m_started */ +void AbstractAddInGrabber::incGrabberStarted() +{ + Q_D(AbstractAddInGrabber); + d->m_started++; + + if (d->m_started == 1) + { + runStatusChanged(true); //now, the device is started -> check if any listener is connected and if so start the auto grabbing timer (if flag is true, too) + } +} + +//------------------------------------------------------------------------------------- +/*!< decrements the number of started devices \see m_started */ +void AbstractAddInGrabber::decGrabberStarted() +{ + Q_D(AbstractAddInGrabber); + d->m_started--; + + if (d->m_started == 0) + { + runStatusChanged(false); //now, the device is stopped -> stop any possibly started auto grabbing listener + } +} + +//------------------------------------------------------------------------------------- +/*!< sets the number of started devices to a given value \see m_started */ +void AbstractAddInGrabber::setGrabberStarted(int value) +{ + Q_D(AbstractAddInGrabber); + d->m_started = value; + runStatusChanged(value > 0); +} + } // end namespace ito diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index 712c01026..0740e972b 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -43,16 +43,15 @@ class AddInGrabberPrivate //------------------------------------------------------------------------------------- //! constructor -AddInGrabber::AddInGrabber() : AbstractAddInGrabber() +AddInGrabber::AddInGrabber() : AbstractAddInGrabber(), d_ptr(new AddInGrabberPrivate()) { - dd = new AddInGrabberPrivate(); } //------------------------------------------------------------------------------------- //! destructor AddInGrabber::~AddInGrabber() { - DELETE_AND_SET_NULL(dd); + } //------------------------------------------------------------------------------------- ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) diff --git a/common/sources/addInInterface.cpp b/common/sources/addInInterface.cpp index 33b52842d..6769c505e 100644 --- a/common/sources/addInInterface.cpp +++ b/common/sources/addInInterface.cpp @@ -1,7 +1,7 @@ /* ******************************************************************** itom software URL: http://www.uni-stuttgart.de/ito - Copyright (C) 2020, Institut fuer Technische Optik (ITO), + Copyright (C) 2023, Institut fuer Technische Optik (ITO), Universitaet Stuttgart, Germany This file is part of itom and its software development toolkit (SDK). @@ -48,7 +48,7 @@ namespace ito { - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- class AddInInterfaceBasePrivate { public: @@ -63,7 +63,7 @@ namespace ito int AddInBase::m_instCounter = 0; int AddInBase::maxThreadCount = QThread::idealThreadCount(); - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- AddInInterfaceBase::AddInInterfaceBase() : m_type(0), m_version(CREATEVERSION(0, 0, 0)), @@ -84,39 +84,39 @@ namespace ito d_ptr(new AddInInterfaceBasePrivate()) { } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- AddInInterfaceBase::~AddInInterfaceBase() { m_initParamsMand.clear(); m_initParamsOpt.clear(); } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInInterfaceBase::closeInst(ito::AddInBase **addInInst) { ito::RetVal ret = closeThisInst(addInInst); return ret; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- void AddInInterfaceBase::incRef(ito::AddInBase *addIn) { addIn->incRefCount(); } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- void AddInInterfaceBase::decRef(ito::AddInBase *addIn) { addIn->decRefCount(); } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- int AddInInterfaceBase::getRef(ito::AddInBase *addIn) { return addIn->getRefCount(); } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! set api function pointer void AddInInterfaceBase::setApiFunctions(void **apiFunctions) { @@ -125,7 +125,7 @@ namespace ito ito::ITOM_API_FUNCS = apiFunctions; //this propagates the api pointer to the itomCommonQt dll where this source file has been compiled } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- void AddInInterfaceBase::setApiFunctionsGraph(void ** apiFunctionsGraph) { m_apiFunctionsGraphBasePtr = apiFunctionsGraph; @@ -133,7 +133,7 @@ namespace ito ito::ITOM_API_FUNCS_GRAPH = apiFunctionsGraph; //this propagates the api pointer to the itomCommonQt dll where this source file has been compiled } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- bool AddInInterfaceBase::event(QEvent *e) { //the event User+123 is emitted by AddInManager, if the API has been prepared and can @@ -151,21 +151,21 @@ namespace ito return QObject::event(e); } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- void AddInInterfaceBase::setLoader(QPluginLoader *loader) { Q_D(AddInInterfaceBase); d_ptr->m_pLoader = loader; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- QPluginLoader * AddInInterfaceBase::getLoader(void) const { Q_D(const AddInInterfaceBase); return d->m_pLoader; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- class AddInBasePrivate { public: @@ -203,7 +203,7 @@ namespace ito QMutex m_userMutex; }; - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! Constructor. /*! This constructor is called by any constructor of classes AddInActuator, AddInDataIO or AddInAlgo. @@ -222,7 +222,7 @@ namespace ito d->m_uniqueID = (++m_instCounter); } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! Destructor. /*! This destructor is automatically called if any plugin instance is destroyed. It does the following steps: @@ -251,7 +251,13 @@ namespace ito } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- + void AddInBase::insertParam(const Param& param) + { + m_params.insert(param.getName(), param); + } + + //--------------------------------------------------------------------------------- //! retrieve the uniqueID of this instance int AddInBase::getID() const { @@ -259,7 +265,7 @@ namespace ito return d->m_uniqueID; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! increments reference counter of this plugin (thread-safe) void AddInBase::incRefCount(void) { @@ -268,7 +274,7 @@ namespace ito d->m_refCount++; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! decrements reference counter of this plugin (thread-safe) void AddInBase::decRefCount(void) { @@ -283,7 +289,7 @@ namespace ito return d->m_refCount; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! returns true if this instance has firstly been created by the GUI int AddInBase::createdByGUI() const { @@ -291,7 +297,7 @@ namespace ito return d->m_createdByGUI; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! method to set whether this instance has been firstly created by the GUI (true) or by any other component (Python, C++, other plugin,..) (false) void AddInBase::setCreatedByGUI(int value) { @@ -299,7 +305,7 @@ namespace ito d->m_createdByGUI = value; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! returns in a thread-safe way the status of the m_initialized-member variable. This variable should be set to true at the end of the init-method. bool AddInBase::isInitialized(void) const { @@ -307,7 +313,7 @@ namespace ito return d->m_initialized; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! sets in a thread-safe way the status of the m_initialized-member /* \param [in] initialized is the value to set @@ -318,7 +324,7 @@ namespace ito d->m_initialized = initialized; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! returns the alive-flag of this plugin /* Any time-consuming operation of the plugin should regularly set the alive-flag to true @@ -336,7 +342,7 @@ namespace ito return wasalive; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! sets the alive-flag to 1 ("still alive") /* This method is thread-safe. @@ -349,14 +355,14 @@ namespace ito d->m_alive = 1; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- QMutex& AddInBase::getUserMutex() { Q_D(AddInBase); return d->m_userMutex; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! method for setting various parameters in a sequence /*! Using this method, only one over-thread call needs to be executed in order to set various parameters @@ -387,7 +393,7 @@ namespace ito return retValue; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! method for setting various parameters in a sequence /*! Using this method, only one over-thread call needs to be executed in order to set various parameters @@ -418,7 +424,7 @@ namespace ito return retValue; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! creates new thread for the class instance and moves this instance to the new thread ito::RetVal AddInBase::MoveToThread(void) { @@ -437,7 +443,7 @@ namespace ito return retOk; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! method to retrieve a parameter from the parameter map (m_params) /*! returns parameter from m_params vector. If the parameter could not be found or if the given name is invalid an invalid Param is returned. @@ -490,7 +496,7 @@ namespace ito return Param(); } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! this method can handle additional functions of your plugin. /*! Use registerExecFunc to register a specific function name and a set of mandatory and optional default parameters. @@ -521,14 +527,14 @@ namespace ito return retValue; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- bool AddInBase::hasDockWidget(void) const { Q_D(const AddInBase); return !d->m_dockWidget.isNull(); } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! Returns the reference to the dock widget of this plugin or NULL, if no dock widget is provided. /* \sa hasDockWidget @@ -539,7 +545,7 @@ namespace ito return d->m_dockWidget; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! Creates the dock-widget for this plugin /* Call this method ONLY in the constructor of your plugin, since it must be executed in the main thread. @@ -580,7 +586,7 @@ namespace ito } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- void AddInBase::setIdentifier(const QString &identifier) { Q_D(AddInBase); @@ -596,7 +602,7 @@ namespace ito } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! sets the interface of this instance to base. \sa AddInInterfaceBase void AddInBase::setBasePlugin(AddInInterfaceBase *base) { @@ -604,13 +610,13 @@ namespace ito d->m_pBasePlugin = base; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- /*static*/ int AddInBase::getMaximumThreadCount() { return maxThreadCount; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- /*static*/ RetVal AddInBase::setMaximumThreadCount(int threadCount) { if (QThread::idealThreadCount() > 0) @@ -633,14 +639,14 @@ namespace ito return ito::retOk; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- AddInInterfaceBase* AddInBase::getBasePlugin(void) const { Q_D(const AddInBase); return d->m_pBasePlugin; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! Registers an additional function with specific name and default parameters /* After having registered the function, the method execFunc can be called with the specific function name @@ -727,7 +733,7 @@ namespace ito return retValue; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! returns default style properties for dock-widget of plugin /* This method is called by the AddInManager at initialization of a plugin instance. Then, @@ -756,7 +762,7 @@ namespace ito } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! method indicates whether this plugin instance has a configuration dialog. /*! Overwrite this method if your plugin provides such a configuration dialog by simply returning 1 instead of 0. @@ -769,7 +775,7 @@ namespace ito return 0; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! method called if the configuration dialog of the plugin should be shown. /*! Overwrite this method if your plugin provides a configuration dialog. This method is directly called by the main (GUI) thread. @@ -783,7 +789,7 @@ namespace ito return ito::RetVal(ito::retWarning,0, tr("Your plugin is supposed to have a configuration dialog, but you did not implement the showConfDialog-method").toLatin1().data()); } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! method invoked by AddInManager if the plugin should be pulled back to the main thread of itom. /*! Do not invoke this method in any other case. It should only be invoked by AddInManager of the itom core. @@ -813,7 +819,7 @@ namespace ito return retOk; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- class AddInDataIOPrivate { public: @@ -823,7 +829,7 @@ namespace ito }; - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- AddInDataIO::AddInDataIO() : AddInBase(), m_timerID(0), @@ -834,7 +840,7 @@ namespace ito qDebug() << "AddInDataIO constructor. ThreadID: " << QThread::currentThreadId(); } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- AddInDataIO::~AddInDataIO() { if (m_timerID > 0) @@ -844,7 +850,7 @@ namespace ito } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInDataIO::startDeviceAndRegisterListener(QObject* obj, ItomSharedSemaphore *waitCond) { qDebug("begin: startDeviceAndRegisterListener"); @@ -907,7 +913,7 @@ namespace ito return retValue; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInDataIO::stopDeviceAndUnregisterListener(QObject* obj, ItomSharedSemaphore *waitCond) { qDebug("start: stopDeviceAndUnregisterListener"); @@ -963,7 +969,7 @@ namespace ito return retValue; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInDataIO::disableAutoGrabbing(ItomSharedSemaphore *waitCond) { m_autoGrabbingEnabled = false; @@ -984,7 +990,7 @@ namespace ito return ito::retOk; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInDataIO::enableAutoGrabbing(ItomSharedSemaphore *waitCond) { m_autoGrabbingEnabled = true; @@ -1004,7 +1010,7 @@ namespace ito return ito::retOk; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInDataIO::setAutoGrabbingInterval(QSharedPointer interval, ItomSharedSemaphore *waitCond /*= NULL*/) { ito::RetVal retval; @@ -1042,7 +1048,7 @@ namespace ito return retval; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- void AddInDataIO::runStatusChanged(bool deviceStarted) { if (deviceStarted && m_autoGrabbingEnabled) @@ -1064,7 +1070,7 @@ namespace ito } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInDataIO::startDevice(ItomSharedSemaphore *waitCond) { Q_ASSERT_X(1, "AddInDataIO::startDevice", tr("not implemented").toLatin1().data()); @@ -1084,7 +1090,7 @@ namespace ito } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInDataIO::stopDevice(ItomSharedSemaphore *waitCond) { Q_ASSERT_X(1, "AddInDataIO::stopDevice", tr("not implemented").toLatin1().data()); @@ -1102,7 +1108,7 @@ namespace ito } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInDataIO::acquire(const int /*trigger*/, ItomSharedSemaphore *waitCond) { Q_ASSERT_X(1, "AddInDataIO::acquire", tr("not implemented").toLatin1().data()); @@ -1120,7 +1126,7 @@ namespace ito } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInDataIO::stop(ItomSharedSemaphore *waitCond) { Q_ASSERT_X(1, "AddInDataIO::stop", tr("not implemented").toLatin1().data()); @@ -1138,7 +1144,7 @@ namespace ito } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInDataIO::getVal(void * /*data*/, ItomSharedSemaphore *waitCond) { Q_ASSERT_X(1, "AddInDataIO::getVal(ito::RetVal, void *data, ItomSharedSemaphore *waitCond)", tr("not implemented").toLatin1().data()); @@ -1155,7 +1161,7 @@ namespace ito return ito::retError; } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInDataIO::getVal(QSharedPointer> dataObjMap, ItomSharedSemaphore* waitCond) { if (waitCond) @@ -1180,7 +1186,7 @@ namespace ito { return ito::retError; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInDataIO::getVal(QSharedPointer /*data*/, QSharedPointer /*length*/, ItomSharedSemaphore *waitCond) { Q_ASSERT_X(1, "AddInDataIO::getVal(ito::RetVal, QSharedPointer data, QSharedPointer length, ItomSharedSemaphore *waitCond)", tr("not implemented").toLatin1().data()); @@ -1198,7 +1204,7 @@ namespace ito } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInDataIO::copyVal(void * /*data*/, ItomSharedSemaphore *waitCond) { Q_ASSERT_X(1, "AddInDataIO::copyVal(void *data, ItomSharedSemaphore *waitCond)", tr("not implemented").toLatin1().data()); @@ -1216,7 +1222,7 @@ namespace ito } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInDataIO::setVal(const char * /*data*/, const int /*length*/, ItomSharedSemaphore *waitCond) { Q_ASSERT_X(1, "AddInDataIO::setVal(const char *data, const int length, ItomSharedSemaphore *waitCond)", tr("not implemented").toLatin1().data()); @@ -1235,7 +1241,7 @@ namespace ito } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- class AddInActuatorPrivate { public: @@ -1253,19 +1259,19 @@ namespace ito }; - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- AddInActuator::AddInActuator() : AddInBase(), d_ptr(new AddInActuatorPrivate()) { } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- AddInActuator::~AddInActuator() { } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! method emits the actuatorStatusChanged signal if any slot is connected to this signal. /*! The emitted values are the member variables m_currentStatus and m_currentPos (optional). @@ -1294,7 +1300,7 @@ namespace ito } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! method emits the targetChanged signal if any slot is connected to this signal. /*! The emitted values is the member variable m_targetPos @@ -1313,7 +1319,7 @@ namespace ito emit targetChanged(m_targetPos); } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! method invoked in order to force a re-emitation of the current status, the current positions (if desired) and the target positions (if desired) /*! This method is mainly invoked by a dock widget of the actuator such that the plugin re-emits the current values, that are then @@ -1338,7 +1344,7 @@ namespace ito return retval; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInActuator::getLastSignalledStates(QVector &status, QVector ¤tPos, QVector &targetPos) { Q_D(AddInActuator); @@ -1358,13 +1364,13 @@ namespace ito } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- void AddInActuator::setStatus(int &status, const int newFlags, const int keepMask /*= 0*/) { status = (status & keepMask) | newFlags; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- void AddInActuator::setStatus(const QVector &axis, const int newFlags, const int keepMask /*= 0*/) { foreach(const int &i, axis) @@ -1373,7 +1379,7 @@ namespace ito } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- void AddInActuator::replaceStatus(const QVector &axis, const int existingFlag, const int replaceFlag) { foreach(const int &i, axis) @@ -1382,7 +1388,7 @@ namespace ito } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- void AddInActuator::replaceStatus(int &status, const int existingFlag, const int replaceFlag) { if (status & existingFlag) @@ -1417,7 +1423,7 @@ namespace ito } } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! checks whether any axis is still moving (moving flag is set) bool AddInActuator::isMotorMoving() const { @@ -1431,7 +1437,7 @@ namespace ito return false; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- bool AddInActuator::isInterrupted() { Q_D(AddInActuator); @@ -1441,7 +1447,7 @@ namespace ito return res; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- void AddInActuator::setInterrupt() { Q_D(AddInActuator); @@ -1449,7 +1455,7 @@ namespace ito d->m_interruptFlag = true; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- void AddInActuator::resetInterrupt() { Q_D(AddInActuator); @@ -1457,7 +1463,7 @@ namespace ito d->m_interruptFlag = false; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInActuator::getStatus(const int axis, QSharedPointer status, ItomSharedSemaphore *waitCond) { ito::RetVal retval; @@ -1492,14 +1498,14 @@ namespace ito return retval; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- class AddInAlgoPrivate { public: AddInAlgoPrivate() {} }; - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- AddInAlgo::AddInAlgo() : AddInBase(), d_ptr(new AddInAlgoPrivate()) { @@ -1507,7 +1513,7 @@ namespace ito return; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- AddInAlgo::~AddInAlgo() { FilterDef *filter; @@ -1525,21 +1531,21 @@ namespace ito m_algoWidgetList.clear(); } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInAlgo::getFilterList(QHash &fList) const { fList = m_filterList; return ito::retOk; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInAlgo::getAlgoWidgetList(QHash &awList) const { awList = m_algoWidgetList; return ito::retOk; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInAlgo::rejectFilter(const QString &name) { QHash::iterator it = m_filterList.find(name); @@ -1553,7 +1559,7 @@ namespace ito return ito::retError; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInAlgo::rejectAlgoWidget(const QString &name) { QHash::iterator it = m_algoWidgetList.find(name); @@ -1567,7 +1573,7 @@ namespace ito return ito::retError; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- /*static*/ ito::RetVal AddInAlgo::prepareParamVectors(QVector *paramsMand, QVector *paramsOpt, QVector *paramsOut) { if (!paramsMand) @@ -1588,5 +1594,5 @@ namespace ito return ito::retOk; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- } // namespace ito diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index c868238b0..ff97a27a6 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -1,7 +1,7 @@ /* ******************************************************************** itom software URL: http://www.uni-stuttgart.de/ito - Copyright (C) 2020, Institut fuer Technische Optik (ITO), + Copyright (C) 2023, Institut fuer Technische Optik (ITO), Universitaet Stuttgart, Germany This file is part of itom and its software development toolkit (SDK). @@ -37,26 +37,169 @@ namespace ito { + //--------------------------------------------------------------------------------- class AddInMultiChannelGrabberPrivate { + public: + AddInMultiChannelGrabberPrivate() : m_channelParamsProxyInitialized(false) + { + + } + + //!< true if an appropriate parameter is created in the m_params map of the + //! plugin for every parameter of the channels. The m_params value is a + //! proxy for the currently selected channel. + bool m_channelParamsProxyInitialized; + + + QMap m_paramChannelAvailabilityMap; }; - //---------------------------------------------------------------------------------------------------------------------------------- - //! constructor - AddInMultiChannelGrabber::AddInMultiChannelGrabber(const QByteArray &grabberName) : - AbstractAddInGrabber(), - m_defaultConfigReady(false) + + //--------------------------------------------------------------------------------- + AddInMultiChannelGrabber::ChannelContainer::ChannelContainer() + { + ito::Param paramVal; + int roi[] = { 0, 0, 1, 1 }; + paramVal = ito::Param("roi", ito::ParamBase::IntArray, 4, roi, "roi"); + m_channelParam.insert(paramVal.getName(), paramVal); + + paramVal = ito::Param("sizex", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 1, 1, "sizex"); + m_channelParam.insert(paramVal.getName(), paramVal); + + paramVal = ito::Param("sizey", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 1, 1, "sizey"); + m_channelParam.insert(paramVal.getName(), paramVal); + + paramVal = ito::Param("pixelFormat", ito::ParamBase::String, "mono8", "pixelFormat"); + m_channelParam.insert(paramVal.getName(), paramVal); + + addDefaultMetaParams(); + }; + + //--------------------------------------------------------------------------------- + AddInMultiChannelGrabber::ChannelContainer::ChannelContainer( + const ito::Param& roi, + const ito::Param& pixelFormat, + const ito::Param& sizex, + const ito::Param& sizey) { - dd = new AddInMultiChannelGrabberPrivate(); + Q_ASSERT(QByteArray(roi.getName()) == "roi"); + Q_ASSERT(QByteArray(pixelFormat.getName()) == "pixelFormat"); + Q_ASSERT(QByteArray(sizex.getName()) == "sizex"); + Q_ASSERT(QByteArray(sizey.getName()) == "sizey"); + + addChannelParam(roi); + addChannelParam(pixelFormat); + addChannelParam(sizex); + addChannelParam(sizey); + addDefaultMetaParams(); + } + + //--------------------------------------------------------------------------------- + AddInMultiChannelGrabber::ChannelContainer::ChannelContainer( + const ito::Param& roi, + const ito::Param& pixelFormat, + const ito::Param& sizex, + const ito::Param& sizey, + const ito::Param& axisOffsets, + const ito::Param& axisScales, + const ito::Param& axisDescriptions, + const ito::Param& axisUnits, + const ito::Param& valueDescription, + const ito::Param& valueUnit) + { + Q_ASSERT(QByteArray(roi.getName()) == "roi"); + Q_ASSERT(QByteArray(pixelFormat.getName()) == "pixelFormat"); + Q_ASSERT(QByteArray(sizex.getName()) == "sizex"); + Q_ASSERT(QByteArray(sizey.getName()) == "sizey"); + Q_ASSERT(QByteArray(axisOffsets.getName()) == "axisOffsets"); + Q_ASSERT(QByteArray(axisScales.getName()) == "axisScales"); + Q_ASSERT(QByteArray(axisDescriptions.getName()) == "axisDescriptions"); + Q_ASSERT(QByteArray(axisUnits.getName()) == "axisUnits"); + Q_ASSERT(QByteArray(valueDescription.getName()) == "valueDescription"); + Q_ASSERT(QByteArray(valueUnit.getName()) == "valueUnit"); + + addChannelParam(roi); + addChannelParam(pixelFormat); + addChannelParam(sizex); + addChannelParam(sizey); + addChannelParam(axisOffsets); + addChannelParam(axisScales); + addChannelParam(axisDescriptions); + addChannelParam(axisUnits); + addChannelParam(axisDescriptions); + addChannelParam(axisUnits); + addChannelParam(valueDescription); + addChannelParam(valueUnit); + } + + //--------------------------------------------------------------------------------- + void AddInMultiChannelGrabber::ChannelContainer::addDefaultMetaParams() + { + ito::Param paramVal; + + double axisOffsets[] = { 0.0, 0.0 }; + paramVal = ito::Param("axisOffsets", ito::ParamBase::DoubleArray, 2, axisOffsets, "the offset values of the y- and x-axis of this channel image."); + paramVal.setMeta(new ito::DoubleArrayMeta(-DBL_MAX, DBL_MAX, 0.0, 2, 2, 1, "MetaInformation"), true); + addChannelParam(paramVal); + + double axisScales[] = { 1.0, 1.0 }; + paramVal = ito::Param("axisScales", ito::ParamBase::DoubleArray, 2, axisOffsets, "the scale values of the y- and x-axis of this channel image."); + paramVal.setMeta(new ito::DoubleArrayMeta(-DBL_MAX, DBL_MAX, 0.0, 2, 2, 1, "MetaInformation"), true); + addChannelParam(paramVal); + + ito::ByteArray axisUnits[] = { "", "" }; + paramVal = ito::Param( + "axisUnits", + ito::ParamBase::StringList, 2, + axisUnits, "The unit strings for the y- and x-axis of the grabber image"); + paramVal.setMeta(new ito::StringListMeta(ito::StringMeta::Wildcard, "*", 2, 2, 1, "MetaInformation"), true); + addChannelParam(paramVal); + + ito::ByteArray axisDescriptions[] = { "", "" }; + paramVal = ito::Param( + "axisDescriptions", + ito::ParamBase::StringList, 2, + axisDescriptions, + "axis description"); + paramVal.setMeta(new ito::StringListMeta(ito::StringMeta::Wildcard, "*", 2, 2, 1, "MetaInformation"), true); + addChannelParam(paramVal); + + paramVal = ito::Param( + "valueDescription", + ito::ParamBase::String, + "", + "value description"); + addChannelParam(paramVal); + + paramVal = ito::Param( + "valueUnit", ito::ParamBase::String, "", "The unit string of the values of this channel image"); + addChannelParam(paramVal); + } + + //--------------------------------------------------------------------------------- + void AddInMultiChannelGrabber::ChannelContainer::addChannelParam(const ito::Param& param) + { + m_channelParam.insert(param.getName(), param); + } + //--------------------------------------------------------------------------------- + //! constructor + AddInMultiChannelGrabber::AddInMultiChannelGrabber(const QByteArray& grabberName) : + AbstractAddInGrabber(), + d_ptr(new AddInMultiChannelGrabberPrivate()) + { ito::Param paramVal("name", ito::ParamBase::String | ito::ParamBase::Readonly, grabberName.data(), "GrabberName"); paramVal.setMeta(new ito::StringMeta(ito::StringMeta::String, "General"), true); - m_params.insert(paramVal.getName(), paramVal); + insertParam(paramVal); - paramVal = ito::Param("defaultChannel", ito::ParamBase::String, "", tr("indicates the current default channel").toLatin1().data()); - m_params.insert(paramVal.getName(), paramVal); + paramVal = ito::Param("defaultChannel", ito::ParamBase::String, "", tr("indicates the default channel name, that is for instance plot if not otherwise stated.").toLatin1().data()); + insertParam(paramVal); - paramVal = ito::Param("channelList", ito::ParamBase::StringList | ito::ParamBase::Readonly, {}, tr("names of the channels provided by the plugin").toLatin1().data()); - m_params.insert(paramVal.getName(), paramVal); + paramVal = ito::Param("channelSelector", ito::ParamBase::String, "", tr("The channel dependent parameters (like sizex, sizey, roi, pixelFormat...) are related to this channel.").toLatin1().data()); + insertParam(paramVal); + + paramVal = ito::Param("availableChannels", ito::ParamBase::StringList | ito::ParamBase::Readonly, {}, tr("names of the channels provided by the plugin").toLatin1().data()); + insertParam(paramVal); //int roi[] = { 0, 0, 2048, 2048 }; //paramVal = ito::Param("roi", ito::ParamBase::IntArray, 4, roi, tr("ROI (x,y,width,height) [this replaces the values x0,x1,y0,y1]").toLatin1().data()); @@ -82,19 +225,20 @@ namespace ito } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- //! destructor AddInMultiChannelGrabber::~AddInMultiChannelGrabber() { - DELETE_AND_SET_NULL(dd); } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- void AddInMultiChannelGrabber::initializeDefaultConfiguration(const QMap& channelContainerMap, const QMap& nonChannelSpecificParams /*QMap()*/) { ito::RetVal retValue(ito::retOk); + Q_D(AddInMultiChannelGrabber); bool channelSpecificParam = false; - if (!m_defaultConfigReady) + + if (!d->m_channelParamsProxyInitialized) { assert(channelContainerMap.size() != 0); QMapIterator channel(channelContainerMap); @@ -109,22 +253,23 @@ namespace ito channelParamIterator.next(); if (!m_params.contains(channelParamIterator.key())) { - m_params.insert(channelParamIterator.key(),channelParamIterator.value()); + m_params.insert(channelParamIterator.key(), channelParamIterator.value()); } - if (!m_paramChannelAvailabilityMap.contains(channelParamIterator.key())) + if (!d->m_paramChannelAvailabilityMap.contains(channelParamIterator.key())) { - m_paramChannelAvailabilityMap.insert(channelParamIterator.key(), QStringList(channel.key())); + d->m_paramChannelAvailabilityMap.insert(channelParamIterator.key(), QStringList(channel.key())); } else { - m_paramChannelAvailabilityMap[channelParamIterator.key()].append(channel.key()); + d->m_paramChannelAvailabilityMap[channelParamIterator.key()].append(channel.key()); } } channelList.append(channel.key().toLatin1().data()); } - m_params["channelList"].setVal(channelList.data(), channelList.length()); + m_params["availableChannels"].setVal(channelList.data(), channelList.length()); m_params["defaultChannel"].setVal(channelContainerMap.firstKey().toLatin1().data()); + m_params["channelSelector"].setVal(channelContainerMap.firstKey().toLatin1().data()); m_channels = channelContainerMap; QMapIterator nonChannelSpecificParamsIt(nonChannelSpecificParams); @@ -132,8 +277,8 @@ namespace ito { nonChannelSpecificParamsIt.next(); assert(!m_params.contains(nonChannelSpecificParamsIt.key())); - assert(!m_paramChannelAvailabilityMap.contains(nonChannelSpecificParamsIt.key())); - m_paramChannelAvailabilityMap.insert(nonChannelSpecificParamsIt.key(), QStringList()); + assert(!d->m_paramChannelAvailabilityMap.contains(nonChannelSpecificParamsIt.key())); + d->m_paramChannelAvailabilityMap.insert(nonChannelSpecificParamsIt.key(), QStringList()); m_params.insert(nonChannelSpecificParamsIt.key(), nonChannelSpecificParamsIt.value()); } @@ -141,11 +286,11 @@ namespace ito while (initialParamsIt.hasNext()) { initialParamsIt.next(); - assert(!m_paramChannelAvailabilityMap.contains(initialParamsIt.key())); - m_paramChannelAvailabilityMap.insert(nonChannelSpecificParamsIt.key(), QStringList()); + assert(!d->m_paramChannelAvailabilityMap.contains(initialParamsIt.key())); + d->m_paramChannelAvailabilityMap.insert(nonChannelSpecificParamsIt.key(), QStringList()); } - m_defaultConfigReady = true; - switchDefaultChannel(); + d->m_channelParamsProxyInitialized = true; + switchChannelSelector(); } @@ -161,7 +306,9 @@ namespace ito //*/ ito::RetVal AddInMultiChannelGrabber::sendDataToListeners(int waitMS) { - assert(m_defaultConfigReady); + Q_D(AddInMultiChannelGrabber); + + assert(d->m_channelParamsProxyInitialized); ito::RetVal retValue = ito::retOk; int size = m_autoGrabbingListeners.size(); if (waitMS == 0) @@ -181,7 +328,7 @@ namespace ito } else if (m_autoGrabbingListeners.size() > 0) { - ItomSharedSemaphore** waitConds = new ItomSharedSemaphore*[size]; + ItomSharedSemaphore** waitConds = new ItomSharedSemaphore * [size]; int i = 0; QMultiMap::iterator it = m_autoGrabbingListeners.begin(); while (it != m_autoGrabbingListeners.end()) @@ -220,14 +367,16 @@ namespace ito //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal ito::AddInMultiChannelGrabber::checkData(QMap& externalDataObject) { - assert(m_defaultConfigReady); + Q_D(AddInMultiChannelGrabber); + + assert(d->m_channelParamsProxyInitialized); ito::RetVal retVal(ito::retOk); unsigned int futureType = 0; bool ok; - ito::float64 axisOffset[] = {0.0, 0.0}; - ito::float64 axisScale[] = {1.0, 1.0}; - QString axisUnit[] = {"", ""}; - QString axisDescription[] = {"", ""}; + ito::float64 axisOffset[] = { 0.0, 0.0 }; + ito::float64 axisScale[] = { 1.0, 1.0 }; + QString axisUnit[] = { "", "" }; + QString axisDescription[] = { "", "" }; QString valueDescription = ""; QString valueUnit = ""; @@ -255,26 +404,26 @@ namespace ito if (m_channels[it.key()].m_channelParam.contains("axisDescription")) { axisDescription[0] = QString::fromUtf8(m_channels[it.key()] - .m_channelParam["axisDescription"] - .getVal()[0] - .data()); + .m_channelParam["axisDescription"] + .getVal()[0] + .data()); axisDescription[1] = QString::fromUtf8(m_channels[it.key()] - .m_channelParam["axisDescription"] - .getVal()[1] - .data()); + .m_channelParam["axisDescription"] + .getVal()[1] + .data()); } // only if exists in plugin if (m_channels[it.key()].m_channelParam.contains("axisUnit")) { axisUnit[0] = QString::fromUtf8(m_channels[it.key()] - .m_channelParam["axisUnit"] - .getVal()[0] - .data()); + .m_channelParam["axisUnit"] + .getVal()[0] + .data()); axisUnit[1] = QString::fromUtf8(m_channels[it.key()] - .m_channelParam["axisUnit"] - .getVal()[1] - .data()); + .m_channelParam["axisUnit"] + .getVal()[1] + .data()); } // only if exists in plugin @@ -331,15 +480,17 @@ namespace ito } //---------------------------------------------------------------------------------------------------------------------------------- - ito::RetVal ito::AddInMultiChannelGrabber::checkData(ito::DataObject *externalDataObject) + ito::RetVal ito::AddInMultiChannelGrabber::checkData(ito::DataObject* externalDataObject) { - assert(m_defaultConfigReady); + Q_D(AddInMultiChannelGrabber); + + assert(d->m_channelParamsProxyInitialized); ito::RetVal retVal(ito::retOk); bool ok; - ito::float64 axisOffset[] = {0.0, 0.0}; - ito::float64 axisScale[] = {1.0, 1.0}; - QString axisUnit[] = {"", ""}; - QString axisDescription[] = {"", ""}; + ito::float64 axisOffset[] = { 0.0, 0.0 }; + ito::float64 axisScale[] = { 1.0, 1.0 }; + QString axisUnit[] = { "", "" }; + QString axisDescription[] = { "", "" }; QString valueDescription = ""; QString valueUnit = ""; unsigned int futureType; @@ -354,11 +505,11 @@ namespace ito if (m_channels[it.key()].m_channelParam.contains("axisOffset")) { axisOffset[0] = m_channels[it.key()] - .m_channelParam["axisOffset"] - .getVal()[0]; + .m_channelParam["axisOffset"] + .getVal()[0]; axisOffset[1] = m_channels[it.key()] - .m_channelParam["axisOffset"] - .getVal()[1]; + .m_channelParam["axisOffset"] + .getVal()[1]; } // only if exists in plugin @@ -374,26 +525,26 @@ namespace ito if (m_channels[it.key()].m_channelParam.contains("axisDescription")) { axisDescription[0] = QString::fromUtf8(m_channels[it.key()] - .m_channelParam["axisDescription"] - .getVal()[0] - .data()); + .m_channelParam["axisDescription"] + .getVal()[0] + .data()); axisDescription[1] = QString::fromUtf8(m_channels[it.key()] - .m_channelParam["axisDescription"] - .getVal()[1] - .data()); + .m_channelParam["axisDescription"] + .getVal()[1] + .data()); } // only if exists in plugin if (m_channels[it.key()].m_channelParam.contains("axisUnit")) { axisUnit[0] = QString::fromUtf8(m_channels[it.key()] - .m_channelParam["axisUnit"] - .getVal()[0] - .data()); + .m_channelParam["axisUnit"] + .getVal()[0] + .data()); axisUnit[1] = QString::fromUtf8(m_channels[it.key()] - .m_channelParam["axisUnit"] - .getVal()[1] - .data()); + .m_channelParam["axisUnit"] + .getVal()[1] + .data()); } // only if exists in plugin @@ -440,7 +591,8 @@ namespace ito } else { - char* channel = m_params["defaultChannel"].getVal(); + const char* channel = m_params["defaultChannel"].getVal(); + if (m_channels.contains(channel)) { futureType = itoDataTypeFromPixelFormat(m_channels[channel].m_channelParam["pixelFormat"].getVal(), &ok); @@ -486,13 +638,13 @@ namespace ito m_params["valueDescription"], m_params["valueUnit"]); m_channels[name] = container; - const ByteArray* channelList = m_params["channelList"].getVal(); + const ByteArray* channelList = m_params["availableChannels"].getVal(); int len = 0; - m_params["channelList"].getVal(len); + m_params["availableChannels"].getVal(len); QVector qVectorList(len, *channelList); qVectorList.append(ByteArray(name.toLatin1().data())); - m_params["channelList"].setVal(qVectorList.data(), qVectorList.length()); + m_params["availableChannels"].setVal(qVectorList.data(), qVectorList.length()); } //---------------------------------------------------------------------------------------------------------------------------------- @@ -504,9 +656,11 @@ namespace ito } //---------------------------------------------------------------------------------------------------------------------------------- - ito::RetVal AddInMultiChannelGrabber::getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) + ito::RetVal AddInMultiChannelGrabber::getParam(QSharedPointer val, ItomSharedSemaphore* waitCond) { - assert(m_defaultConfigReady); + Q_D(AddInMultiChannelGrabber); + + assert(d->m_channelParamsProxyInitialized); ItomSharedSemaphoreLocker locker(waitCond); ito::RetVal retValue; QString key; @@ -521,7 +675,7 @@ namespace ito if (!retValue.containsError()) { - retValue += apiGetParamFromMapByKey(m_params, key, it, false); + retValue += apiGetParamFromMapByKey(m_params, key, it, false); } if (!retValue.containsError()) { @@ -544,7 +698,9 @@ namespace ito //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::changeChannelForListeners(const QString& newChannel, QObject* obj) { - assert(m_defaultConfigReady); + Q_D(AddInMultiChannelGrabber); + + assert(d->m_channelParamsProxyInitialized); ito::RetVal retValue(ito::retOk); bool found = false; @@ -594,9 +750,11 @@ namespace ito //\param [in] waitCond //\return retOk if everything was ok, else retError //*/ - ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer val, ItomSharedSemaphore *waitCond/* = NULL*/) + ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer val, ItomSharedSemaphore* waitCond/* = NULL*/) { - assert(m_defaultConfigReady); + Q_D(AddInMultiChannelGrabber); + + assert(d->m_channelParamsProxyInitialized); ItomSharedSemaphoreLocker locker(waitCond); ito::RetVal retValue; bool hasIndex, ok; @@ -649,7 +807,7 @@ namespace ito } if (key == "defaultChannel") { - retValue += switchDefaultChannel(); + retValue += switchChannelSelector(); } retValue += applyParamsToChannelParams(paramUpdateList); retValue += checkData(); @@ -682,12 +840,14 @@ namespace ito //\return retOk if everything was ok, else retError //*/ - ito::RetVal AddInMultiChannelGrabber::switchDefaultChannel() + ito::RetVal AddInMultiChannelGrabber::switchChannelSelector() { - assert(m_defaultConfigReady); + Q_D(AddInMultiChannelGrabber); + + assert(d->m_channelParamsProxyInitialized); ito::RetVal retValue(ito::retOk); unsigned int flag = 0; - QString selectedChannel = QLatin1String(m_params["defaultChannel"].getVal()); + QString selectedChannel = QLatin1String(m_params["channelSelector"].getVal()); if (m_channels.contains(selectedChannel)) { @@ -697,11 +857,11 @@ namespace ito { itParam.next(); - if (m_paramChannelAvailabilityMap[itParam.key()].contains(selectedChannel)) + if (d->m_paramChannelAvailabilityMap[itParam.key()].contains(selectedChannel)) { itParam.value() = m_channels[selectedChannel].m_channelParam[itParam.key()]; } - else if (!m_paramChannelAvailabilityMap[itParam.key()].isEmpty()) + else if (!d->m_paramChannelAvailabilityMap[itParam.key()].isEmpty()) { flag = itParam.value().getFlags(); flag |= ito::ParamBase::Readonly; @@ -727,22 +887,24 @@ namespace ito //*/ ito::RetVal AddInMultiChannelGrabber::applyParamsToChannelParams(const QStringList& keyList) { - assert(m_defaultConfigReady); + Q_D(AddInMultiChannelGrabber); + + assert(d->m_channelParamsProxyInitialized); ito::RetVal retVal(ito::retOk); - QString currentChannel = QLatin1String(m_params["defaultChannel"].getVal()); + QString channelSelector = QLatin1String(m_params["channelSelector"].getVal()); if (!keyList.isEmpty()) { - if (m_channels.contains(currentChannel)) + if (m_channels.contains(channelSelector)) { QString tmp; foreach(tmp, keyList) { - if (m_channels[currentChannel].m_channelParam.contains(tmp)) + if (m_channels[channelSelector].m_channelParam.contains(tmp)) { if (m_params.contains(tmp)) { - m_channels[currentChannel].m_channelParam[tmp] = m_params[tmp]; + m_channels[channelSelector].m_channelParam[tmp] = m_params[tmp]; } else { @@ -754,19 +916,20 @@ namespace ito else { - retVal = ito::RetVal(ito::retError, 0, tr("unknown channel %1").arg(currentChannel).toLatin1().data()); + retVal = ito::RetVal(ito::retError, 0, tr("unknown channel %1").arg(channelSelector).toLatin1().data()); } } else { - QMapIterator it(m_channels[m_params["defaultChannel"].getVal()].m_channelParam); + QMapIterator it(m_channels[m_params["channelSelector"].getVal()].m_channelParam); + while (it.hasNext()) { it.next(); const_cast(it.value()) = m_params[it.key()]; - } } + return retVal; } @@ -780,7 +943,9 @@ namespace ito //*/ void AddInMultiChannelGrabber::updateSizeXY() { - assert(m_defaultConfigReady); + Q_D(AddInMultiChannelGrabber); + + assert(d->m_channelParamsProxyInitialized); const int* roi = m_params["roi"].getVal(); int height = roi[3]; int width = roi[2]; @@ -789,16 +954,18 @@ namespace ito } //---------------------------------------------------------------------------------------------------------------------------------- - ito::RetVal AddInMultiChannelGrabber::setParamMeta(const QByteArray& paramName, ito::ParamMeta* meta, bool takeOwnerShip ,const QList& channelList/* = QList()*/) + ito::RetVal AddInMultiChannelGrabber::setParamMeta(const QByteArray& paramName, ito::ParamMeta* meta, bool takeOwnerShip, const QList& channelList/* = QList()*/) { - assert(m_defaultConfigReady); + Q_D(AddInMultiChannelGrabber); + + assert(d->m_channelParamsProxyInitialized); ito::RetVal retValue(ito::retOk); - if (m_paramChannelAvailabilityMap.contains(paramName) && m_params.contains(paramName)) + if (d->m_paramChannelAvailabilityMap.contains(paramName) && m_params.contains(paramName)) { if (channelList.isEmpty()) //we want to update the param for all channels even if it is a global one { m_params[paramName].setMeta(meta, takeOwnerShip); - QStringListIterator it(m_paramChannelAvailabilityMap[paramName]); + QStringListIterator it(d->m_paramChannelAvailabilityMap[paramName]); while (it.hasNext()) // update param for all channels { m_channels[it.next()].m_channelParam[paramName].setMeta(meta, takeOwnerShip); @@ -810,7 +977,7 @@ namespace ito { if (m_channels.contains(channelList[i])) { - if (m_paramChannelAvailabilityMap[paramName].contains(channelList[i])) + if (d->m_paramChannelAvailabilityMap[paramName].contains(channelList[i])) { m_channels[channelList[i]].m_channelParam[paramName].setMeta(meta, takeOwnerShip); } @@ -824,7 +991,7 @@ namespace ito if (!retValue.containsError()) { //update m_params if the current default channel is listed in channelList or if the current default channel does not support the param (the param in m_params then is set to readonly) - if (channelList.contains(m_params["defaultChannel"].getVal()) || !m_paramChannelAvailabilityMap[paramName].contains(m_params["defaultChannel"].getVal())) + if (channelList.contains(m_params["defaultChannel"].getVal()) || !d->m_paramChannelAvailabilityMap[paramName].contains(m_params["defaultChannel"].getVal())) { m_params[paramName].setMeta(meta, takeOwnerShip); } @@ -843,14 +1010,16 @@ namespace ito //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::setParamFlags(const QByteArray& paramName, const unsigned int& flags, const QList& channelList/* = QList()*/) { - assert(m_defaultConfigReady); + Q_D(AddInMultiChannelGrabber); + + assert(d->m_channelParamsProxyInitialized); ito::RetVal retValue(ito::retOk); - if (m_paramChannelAvailabilityMap.contains(paramName) && m_params.contains(paramName)) + if (d->m_paramChannelAvailabilityMap.contains(paramName) && m_params.contains(paramName)) { if (channelList.isEmpty()) //we want to update the param for all channels even if it is a global one { m_params[paramName].setFlags(flags); - QStringListIterator it(m_paramChannelAvailabilityMap[paramName]); + QStringListIterator it(d->m_paramChannelAvailabilityMap[paramName]); while (it.hasNext()) // update param for all channels { m_channels[it.next()].m_channelParam[paramName].setFlags(flags); @@ -862,7 +1031,7 @@ namespace ito { if (m_channels.contains(channelList[i])) { - if (m_paramChannelAvailabilityMap[paramName].contains(channelList[i])) + if (d->m_paramChannelAvailabilityMap[paramName].contains(channelList[i])) { m_channels[channelList[i]].m_channelParam[paramName].setFlags(flags); } @@ -876,7 +1045,7 @@ namespace ito if (!retValue.containsError()) { //update m_params if the current default channel is listed in channelList or if the current default channel does not support the param (the param in m_params then is set to readonly) - if (channelList.contains(m_params["defaultChannel"].getVal()) || !m_paramChannelAvailabilityMap[paramName].contains(m_params["defaultChannel"].getVal())) + if (channelList.contains(m_params["defaultChannel"].getVal()) || !d->m_paramChannelAvailabilityMap[paramName].contains(m_params["defaultChannel"].getVal())) { m_params[paramName].setFlags(flags); } @@ -895,11 +1064,11 @@ namespace ito //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::getVal(QSharedPointer> dataObjMap, ItomSharedSemaphore* waitCond) { - ito::RetVal retval(ito::retOk); ItomSharedSemaphoreLocker locker(waitCond); QMap::const_iterator it = (*dataObjMap).constBegin(); bool validChannelNames = true; + while (it != (*dataObjMap).constEnd()) { if (!m_channels.contains(it.key())) @@ -908,15 +1077,18 @@ namespace ito } ++it; } + if (!retval.containsError()) { retval = getValByMap(dataObjMap); } + if (waitCond) { waitCond->returnValue = retval; waitCond->release(); } + return retval; } diff --git a/plot/sources/AbstractDObjFigure.cpp b/plot/sources/AbstractDObjFigure.cpp index 1c5eaa054..a63b8e404 100644 --- a/plot/sources/AbstractDObjFigure.cpp +++ b/plot/sources/AbstractDObjFigure.cpp @@ -417,7 +417,7 @@ ito::RetVal AbstractDObjFigure::setDisplayedCameraChannel(const QString& channel if (isMultiChannel) { ItomSharedSemaphoreLocker locker(new ItomSharedSemaphore()); - QSharedPointer channelListParam(new ito::Param("channelList", ito::ParamBase::StringList)); + QSharedPointer channelListParam(new ito::Param("availableChannels", ito::ParamBase::StringList)); if (QMetaObject::invokeMethod(liveSource, "getParam", Q_ARG(QSharedPointer, channelListParam), Q_ARG(ItomSharedSemaphore*, locker.getSemaphore()))) { From ca2b2b5f0725be7ddbd5086fbceefb0398985718 Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Thu, 20 Jul 2023 00:05:47 +0200 Subject: [PATCH 50/62] some improvements for addInMultiChannelGrabber --- common/addInMultiChannelGrabber.h | 7 +- common/sources/addInMultiChannelGrabber.cpp | 185 +++++++++++--------- 2 files changed, 105 insertions(+), 87 deletions(-) diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index 71554daa4..66e48e4c9 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -95,7 +95,12 @@ namespace ito void addChannel(QString name); virtual ito::RetVal switchChannelSelector();/*!< synchronizes m_params with the params of default channel container */ virtual ito::RetVal applyParamsToChannelParams(const QStringList& keyList = QStringList()); - void initializeDefaultConfiguration(const QMap& channelContainerMap, const QMap& nonChannelSpecificParams = QMap());/*!< sets the channel parameters.*/ + + //!< initializes the channels, channel parameters and global parameters. + void initChannelsAndGlobalParameters( + const QMap& channelContainerMap, + const QString &defaultChannelName, + const QList& globalParameters = QList()); ito::RetVal setParamMeta(const QByteArray& paramName, ito::ParamMeta* meta, bool takeOwnerShip, const QList& channelList = QList()); ito::RetVal setParamFlags(const QByteArray& paramName, const unsigned int& flags, const QList& channelList = QList()); diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index ff97a27a6..6700022ff 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -192,7 +192,7 @@ namespace ito paramVal.setMeta(new ito::StringMeta(ito::StringMeta::String, "General"), true); insertParam(paramVal); - paramVal = ito::Param("defaultChannel", ito::ParamBase::String, "", tr("indicates the default channel name, that is for instance plot if not otherwise stated.").toLatin1().data()); + paramVal = ito::Param("defaultChannel", ito::ParamBase::String, "", tr("indicates the default channel name, that is for instance used in plots if not otherwise stated.").toLatin1().data()); insertParam(paramVal); paramVal = ito::Param("channelSelector", ito::ParamBase::String, "", tr("The channel dependent parameters (like sizex, sizey, roi, pixelFormat...) are related to this channel.").toLatin1().data()); @@ -200,29 +200,6 @@ namespace ito paramVal = ito::Param("availableChannels", ito::ParamBase::StringList | ito::ParamBase::Readonly, {}, tr("names of the channels provided by the plugin").toLatin1().data()); insertParam(paramVal); - - //int roi[] = { 0, 0, 2048, 2048 }; - //paramVal = ito::Param("roi", ito::ParamBase::IntArray, 4, roi, tr("ROI (x,y,width,height) [this replaces the values x0,x1,y0,y1]").toLatin1().data()); - //ito::RectMeta *rm = new ito::RectMeta(ito::RangeMeta(roi[0], roi[0] + roi[2] - 1), ito::RangeMeta(roi[1], roi[1] + roi[3] - 1), "ImageFormatControl"); - //paramVal.setMeta(rm, true); - //m_params.insert(paramVal.getName(), paramVal); - - //paramVal = ito::Param("sizex", ito::ParamBase::Int | ito::ParamBase::Readonly, 4, 4096, 4096, tr("size in x (cols) [px]").toLatin1().data()); - //paramVal.getMetaT()->setCategory("ImageFormatControl"); - //m_params.insert(paramVal.getName(), paramVal); - - //paramVal = ito::Param("sizey", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 4096, 4096, tr("size in y (rows) [px]").toLatin1().data()); - //paramVal.getMetaT()->setCategory("ImageFormatControl"); - //m_params.insert(paramVal.getName(), paramVal); - - //ito::StringMeta *m = new ito::StringMeta(ito::StringMeta::String, "mono8"); - //m->addItem("mono10"); - //m->addItem("mono12"); - //m->addItem("mono16"); - //paramVal = ito::Param("pixelFormat", ito::ParamBase::String, "mono8", tr("bitdepth of images: mono8, mono10, mono12, mono16, rgb32").toLatin1().data()); - //paramVal.setMeta(m, true); - //m_params.insert(paramVal.getName(), paramVal); - } //--------------------------------------------------------------------------------- @@ -232,71 +209,107 @@ namespace ito } //--------------------------------------------------------------------------------- - void AddInMultiChannelGrabber::initializeDefaultConfiguration(const QMap& channelContainerMap, const QMap& nonChannelSpecificParams /*QMap()*/) + void AddInMultiChannelGrabber::initChannelsAndGlobalParameters( + const QMap& channelContainerMap, + const QString& defaultChannelName, + const QList& globalParameters /*= QList()*/) { - ito::RetVal retValue(ito::retOk); Q_D(AddInMultiChannelGrabber); + + ito::RetVal retValue(ito::retOk); + + Q_ASSERT_X( + channelContainerMap.contains(defaultChannelName), + "initChannelsAndGlobalParameters", + "a channel with the defaultChannelName must exist"); + + Q_ASSERT_X(!d->m_channelParamsProxyInitialized, + "initChannelsAndGlobalParameters", + "channels and global parameters must not be initialized yet"); + + // initialize default global parameters + m_params["channelName"].setVal(defaultChannelName.toLatin1().constData()); + m_params["channelSelector"].setVal(defaultChannelName.toLatin1().constData()); + + QList channelNames; + + foreach(const QString & channelName, channelContainerMap.keys()) + { + channelNames << ito::ByteArray(channelName.toLatin1().constData()); + } + + m_params["availableChannels"].setVal(channelNames.data(), channelNames.size()); + + /* + * todo: + * bool channelSpecificParam = false; - if (!d->m_channelParamsProxyInitialized) + assert(channelContainerMap.size() != 0); + QMapIterator channel(channelContainerMap); + QVector channelList; + QMapinitialParams = m_params; + + while (channel.hasNext()) { - assert(channelContainerMap.size() != 0); - QMapIterator channel(channelContainerMap); - QVector channelList; - QMapinitialParams = m_params; - while (channel.hasNext()) + channel.next(); + QMapIterator channelParamIterator(channel.value().m_channelParam); + + while (channelParamIterator.hasNext())//iterate through channel params { - channel.next(); - QMapIterator channelParamIterator(channel.value().m_channelParam); - while (channelParamIterator.hasNext())//iterate through channel params + channelParamIterator.next(); + + if (!m_params.contains(channelParamIterator.key())) { - channelParamIterator.next(); - if (!m_params.contains(channelParamIterator.key())) - { - m_params.insert(channelParamIterator.key(), channelParamIterator.value()); - } - if (!d->m_paramChannelAvailabilityMap.contains(channelParamIterator.key())) - { - d->m_paramChannelAvailabilityMap.insert(channelParamIterator.key(), QStringList(channel.key())); - } - else - { - d->m_paramChannelAvailabilityMap[channelParamIterator.key()].append(channel.key()); - } + m_params.insert(channelParamIterator.key(), channelParamIterator.value()); + } + if (!d->m_paramChannelAvailabilityMap.contains(channelParamIterator.key())) + { + d->m_paramChannelAvailabilityMap.insert(channelParamIterator.key(), QStringList(channel.key())); + } + else + { + d->m_paramChannelAvailabilityMap[channelParamIterator.key()].append(channel.key()); } - channelList.append(channel.key().toLatin1().data()); + } - m_params["availableChannels"].setVal(channelList.data(), channelList.length()); - m_params["defaultChannel"].setVal(channelContainerMap.firstKey().toLatin1().data()); - m_params["channelSelector"].setVal(channelContainerMap.firstKey().toLatin1().data()); - m_channels = channelContainerMap; - QMapIterator nonChannelSpecificParamsIt(nonChannelSpecificParams); - while (nonChannelSpecificParamsIt.hasNext()) - { - nonChannelSpecificParamsIt.next(); - assert(!m_params.contains(nonChannelSpecificParamsIt.key())); - assert(!d->m_paramChannelAvailabilityMap.contains(nonChannelSpecificParamsIt.key())); - d->m_paramChannelAvailabilityMap.insert(nonChannelSpecificParamsIt.key(), QStringList()); - m_params.insert(nonChannelSpecificParamsIt.key(), nonChannelSpecificParamsIt.value()); + channelList.append(channel.key().toLatin1().data()); + } - } - QMapIterator initialParamsIt(initialParams); - while (initialParamsIt.hasNext()) - { - initialParamsIt.next(); - assert(!d->m_paramChannelAvailabilityMap.contains(initialParamsIt.key())); - d->m_paramChannelAvailabilityMap.insert(nonChannelSpecificParamsIt.key(), QStringList()); - } - d->m_channelParamsProxyInitialized = true; - switchChannelSelector(); + m_params["availableChannels"].setVal(channelList.data(), channelList.length()); + m_params["defaultChannel"].setVal(channelContainerMap.firstKey().toLatin1().data()); + m_params["channelSelector"].setVal(channelContainerMap.firstKey().toLatin1().data()); + m_channels = channelContainerMap; + QMapIterator nonChannelSpecificParamsIt(nonChannelSpecificParams); + + while (nonChannelSpecificParamsIt.hasNext()) + { + nonChannelSpecificParamsIt.next(); + assert(!m_params.contains(nonChannelSpecificParamsIt.key())); + assert(!d->m_paramChannelAvailabilityMap.contains(nonChannelSpecificParamsIt.key())); + d->m_paramChannelAvailabilityMap.insert(nonChannelSpecificParamsIt.key(), QStringList()); + m_params.insert(nonChannelSpecificParamsIt.key(), nonChannelSpecificParamsIt.value()); } + + QMapIterator initialParamsIt(initialParams); + + while (initialParamsIt.hasNext()) + { + initialParamsIt.next(); + assert(!d->m_paramChannelAvailabilityMap.contains(initialParamsIt.key())); + d->m_paramChannelAvailabilityMap.insert(nonChannelSpecificParamsIt.key(), QStringList()); + } + */ + + d->m_channelParamsProxyInitialized = true; + switchChannelSelector(); } - ////---------------------------------------------------------------------------------------------------------------------------------- + ////------------------------------------------------------------------------------- ////! sends m_image to all registered listeners. ///*! //This method is continuously called from timerEvent. Also call this method from your getVal-Method (usually with 0-timeout). The function adds axis scale and axis unit to the dataObject. @@ -364,7 +377,7 @@ namespace ito return retValue; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal ito::AddInMultiChannelGrabber::checkData(QMap& externalDataObject) { Q_D(AddInMultiChannelGrabber); @@ -479,7 +492,7 @@ namespace ito return retVal; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal ito::AddInMultiChannelGrabber::checkData(ito::DataObject* externalDataObject) { Q_D(AddInMultiChannelGrabber); @@ -623,7 +636,7 @@ namespace ito return retVal; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- void AddInMultiChannelGrabber::addChannel(QString name) { ChannelContainer container( @@ -647,7 +660,7 @@ namespace ito m_params["availableChannels"].setVal(qVectorList.data(), qVectorList.length()); } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::adaptDefaultChannelParams() { ito::RetVal retVal(ito::retOk); @@ -655,7 +668,7 @@ namespace ito return retVal; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::getParam(QSharedPointer val, ItomSharedSemaphore* waitCond) { Q_D(AddInMultiChannelGrabber); @@ -695,7 +708,7 @@ namespace ito return retValue; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::changeChannelForListeners(const QString& newChannel, QObject* obj) { Q_D(AddInMultiChannelGrabber); @@ -737,7 +750,7 @@ namespace ito return retValue; } - ////---------------------------------------------------------------------------------------------------------------------------------- + ////------------------------------------------------------------------------------- ////! Sets a new value to a parameter. ///*! // This function parses the given parameter and calls setParameter. If the bool parameter ok in the setParameter (to be implemented in the individual plugins) @@ -833,7 +846,7 @@ namespace ito return retValue; } - ////---------------------------------------------------------------------------------------------------------------------------------- + ////------------------------------------------------------------------------------- ////! synchronizes m_params with the params of default channel container ///*! //This method synchronizes the parameters from the current selected channel container with m_params. Call this function after changing the defaultChannel parameter.Parameters which are not available for the current default channel are set to readonly @@ -876,7 +889,7 @@ namespace ito return retValue; } - ////---------------------------------------------------------------------------------------------------------------------------------- + ////------------------------------------------------------------------------------- ////! copies value m_params to the channel params of the current default channel ///*! //This method copies params of m_params to the params of the channel container if the param is contained in the channel container . This function is usally called after setParam to apply the changed entries of m_params to the corresponding channel container. @@ -933,7 +946,7 @@ namespace ito return retVal; } - ////---------------------------------------------------------------------------------------------------------------------------------- + ////------------------------------------------------------------------------------- ////! updates sizex and sizey ///*! //Call this function to update sizex and sizey. If the roi is changed via setParam this function will be called automatically. @@ -953,7 +966,7 @@ namespace ito m_params["sizey"].setVal(height); } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::setParamMeta(const QByteArray& paramName, ito::ParamMeta* meta, bool takeOwnerShip, const QList& channelList/* = QList()*/) { Q_D(AddInMultiChannelGrabber); @@ -1007,7 +1020,7 @@ namespace ito return retValue; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::setParamFlags(const QByteArray& paramName, const unsigned int& flags, const QList& channelList/* = QList()*/) { Q_D(AddInMultiChannelGrabber); @@ -1061,7 +1074,7 @@ namespace ito return retValue; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::getVal(QSharedPointer> dataObjMap, ItomSharedSemaphore* waitCond) { ito::RetVal retval(ito::retOk); @@ -1092,7 +1105,7 @@ namespace ito return retval; } - //---------------------------------------------------------------------------------------------------------------------------------- + //--------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::copyVal(QSharedPointer> dataObjMap, ItomSharedSemaphore* waitCond) { From a8b4059002a15ead74cea07843b7e83508f66c88 Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Tue, 1 Aug 2023 00:08:21 +0200 Subject: [PATCH 51/62] some improvements concerning MultiGrabber --- common/addInMultiChannelGrabber.h | 26 ++- common/sharedStructuresQt.h | 1 + common/sources/addInMultiChannelGrabber.cpp | 196 +++++++++++--------- 3 files changed, 124 insertions(+), 99 deletions(-) diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index 66e48e4c9..e62faa664 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -40,6 +40,8 @@ namespace ito { class AddInMultiChannelGrabberPrivate; + + class ITOMCOMMONQT_EXPORT AddInMultiChannelGrabber : public AbstractAddInGrabber { Q_OBJECT @@ -86,9 +88,13 @@ namespace ito void addDefaultMetaParams(); }; - QMap m_channels; /*!< Map for recently grabbed images of various channels */ + typedef QMap ChannelContainerMap; + typedef ChannelContainerMap::iterator ChannelContainerMapIterator; + typedef ChannelContainerMap::const_iterator ChannelContainerMapConstIterator; + + ChannelContainerMap m_channels; /*!< Map for recently grabbed images of various channels */ - virtual ito::RetVal checkData(ito::DataObject *externalDataObject = nullptr); + virtual ito::RetVal checkData(ito::DataObject* externalDataObject = nullptr); virtual ito::RetVal checkData(QMap& externalDataObject); virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ @@ -96,10 +102,10 @@ namespace ito virtual ito::RetVal switchChannelSelector();/*!< synchronizes m_params with the params of default channel container */ virtual ito::RetVal applyParamsToChannelParams(const QStringList& keyList = QStringList()); - //!< initializes the channels, channel parameters and global parameters. + //! registers all channel containers, initializes their parameters as well as all common, global parameters void initChannelsAndGlobalParameters( - const QMap& channelContainerMap, - const QString &defaultChannelName, + const ChannelContainerMap& channelContainerMap, + const QString& defaultChannelName, const QList& globalParameters = QList()); ito::RetVal setParamMeta(const QByteArray& paramName, ito::ParamMeta* meta, bool takeOwnerShip, const QList& channelList = QList()); @@ -119,14 +125,14 @@ namespace ito //\param [in] add key of changed channel specific parameters to pendingUpdate. //\return retOk if everything was ok, else retError //*/ - virtual ito::RetVal setParameter(QSharedPointer& val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok, QStringList &pendingUpdate) = 0; - virtual ito::RetVal getParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool &ok) = 0; + virtual ito::RetVal setParameter(QSharedPointer& val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool& ok, QStringList& pendingUpdate) = 0; + virtual ito::RetVal getParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool& ok) = 0; virtual ito::RetVal getValByMap(QSharedPointer> dataObjMap) = 0; virtual ito::RetVal copyValByMap(QSharedPointer> dataObjMap) = 0; void updateSizeXY(); /*!< updates sizex und sizey*/ public: - AddInMultiChannelGrabber(const QByteArray &grabberName); + AddInMultiChannelGrabber(const QByteArray& grabberName); ~AddInMultiChannelGrabber(); private: @@ -134,8 +140,8 @@ namespace ito Q_DECLARE_PRIVATE(AddInMultiChannelGrabber); public slots: - ito::RetVal setParam(QSharedPointer val, ItomSharedSemaphore *waitCond = nullptr) final; - ito::RetVal getParam(QSharedPointer val, ItomSharedSemaphore *waitCond) final; + ito::RetVal setParam(QSharedPointer val, ItomSharedSemaphore* waitCond = nullptr) final; + ito::RetVal getParam(QSharedPointer val, ItomSharedSemaphore* waitCond) final; ito::RetVal changeChannelForListeners(const QString& newChannel, QObject* obj); ito::RetVal getVal(QSharedPointer > dataObjMap, ItomSharedSemaphore* waitCond); ito::RetVal copyVal(QSharedPointer > dataObjMap, ItomSharedSemaphore* waitCond); diff --git a/common/sharedStructuresQt.h b/common/sharedStructuresQt.h index 399290a4f..d75d3b404 100644 --- a/common/sharedStructuresQt.h +++ b/common/sharedStructuresQt.h @@ -50,6 +50,7 @@ typedef QMap ParamMap; typedef ParamMap::iterator ParamMapIterator; +typedef ParamMap::const_iterator ParamMapConstIterator; //namespace ito //{ diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index 6700022ff..ed45bc45e 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -51,7 +51,10 @@ namespace ito //! proxy for the currently selected channel. bool m_channelParamsProxyInitialized; - + //!< this map contains all parameter names in m_param, that belong to a + //! channel parameter. The value string list contains all channel names, + //! where this parameter is explicitely contained. Global parameters, + //! that are independent on channels, are not listed here. QMap m_paramChannelAvailabilityMap; }; @@ -210,7 +213,7 @@ namespace ito //--------------------------------------------------------------------------------- void AddInMultiChannelGrabber::initChannelsAndGlobalParameters( - const QMap& channelContainerMap, + const ChannelContainerMap& channelContainerMap, const QString& defaultChannelName, const QList& globalParameters /*= QList()*/) { @@ -227,6 +230,10 @@ namespace ito "initChannelsAndGlobalParameters", "channels and global parameters must not be initialized yet"); + Q_ASSERT_X(channelContainerMap.size() > 0, + "initChannelsAndGlobalParameters", + "at least one channel container must be given"); + // initialize default global parameters m_params["channelName"].setVal(defaultChannelName.toLatin1().constData()); m_params["channelSelector"].setVal(defaultChannelName.toLatin1().constData()); @@ -240,83 +247,82 @@ namespace ito m_params["availableChannels"].setVal(channelNames.data(), channelNames.size()); - /* - * todo: - * - bool channelSpecificParam = false; + m_channels = channelContainerMap; + + // iterate over all channels and register their parameters as global parameter, + // however store a flag, that this is a channel parameter. - assert(channelContainerMap.size() != 0); - QMapIterator channel(channelContainerMap); - QVector channelList; - QMapinitialParams = m_params; + QString paramName; + ChannelContainerMapConstIterator channelIter = channelContainerMap.constBegin(); - while (channel.hasNext()) + while (channelIter != channelContainerMap.constEnd()) { - channel.next(); - QMapIterator channelParamIterator(channel.value().m_channelParam); + ParamMapConstIterator channelParamIter = channelIter->m_channelParam.constBegin(); - while (channelParamIterator.hasNext())//iterate through channel params + while (channelParamIter != channelIter->m_channelParam.constEnd()) { - channelParamIterator.next(); + //iterate through channel params - if (!m_params.contains(channelParamIterator.key())) + paramName = channelParamIter.key(); + + if (m_params.contains(paramName)) { - m_params.insert(channelParamIterator.key(), channelParamIterator.value()); + // if another channel already registered this key, it must have the same type + Q_ASSERT_X(m_params[paramName].getType() == channelParamIter->getType(), + "initChannelsAndGlobalParameters", + "The type of channel parameters of the same name must be equal."); + } + else + { + // add a deep copy of the channel parameter to m_params + m_params.insert(paramName, Param(channelParamIter.value())); } - if (!d->m_paramChannelAvailabilityMap.contains(channelParamIterator.key())) + if (!d->m_paramChannelAvailabilityMap.contains(paramName)) { - d->m_paramChannelAvailabilityMap.insert(channelParamIterator.key(), QStringList(channel.key())); + d->m_paramChannelAvailabilityMap[paramName] = QStringList(channelIter.key()); } else { - d->m_paramChannelAvailabilityMap[channelParamIterator.key()].append(channel.key()); + d->m_paramChannelAvailabilityMap[paramName].append(channelIter.key()); } + channelParamIter++; } - channelList.append(channel.key().toLatin1().data()); - } - - m_params["availableChannels"].setVal(channelList.data(), channelList.length()); - m_params["defaultChannel"].setVal(channelContainerMap.firstKey().toLatin1().data()); - m_params["channelSelector"].setVal(channelContainerMap.firstKey().toLatin1().data()); - m_channels = channelContainerMap; - - QMapIterator nonChannelSpecificParamsIt(nonChannelSpecificParams); - - while (nonChannelSpecificParamsIt.hasNext()) - { - nonChannelSpecificParamsIt.next(); - assert(!m_params.contains(nonChannelSpecificParamsIt.key())); - assert(!d->m_paramChannelAvailabilityMap.contains(nonChannelSpecificParamsIt.key())); - d->m_paramChannelAvailabilityMap.insert(nonChannelSpecificParamsIt.key(), QStringList()); - m_params.insert(nonChannelSpecificParamsIt.key(), nonChannelSpecificParamsIt.value()); - + channelIter++; } - QMapIterator initialParamsIt(initialParams); + // add all global parameters to m_params, unless they exist already: error - while (initialParamsIt.hasNext()) + foreach(const ito::Param& p, globalParameters) { - initialParamsIt.next(); - assert(!d->m_paramChannelAvailabilityMap.contains(initialParamsIt.key())); - d->m_paramChannelAvailabilityMap.insert(nonChannelSpecificParamsIt.key(), QStringList()); + paramName = QLatin1String(p.getName()); + Q_ASSERT_X(!m_params.contains(paramName), + "initChannelsAndGlobalParameters", + "the globalParameters must not contain a parameter whose name is already contained in at least one channel."); + m_params[paramName] = p; } - */ d->m_channelParamsProxyInitialized = true; + + // call switchChannelSelector to synchronize the values in the channel specific parameters with + // to these of the current channel (channelSelector). switchChannelSelector(); } - ////------------------------------------------------------------------------------- - ////! sends m_image to all registered listeners. - ///*! - //This method is continuously called from timerEvent. Also call this method from your getVal-Method (usually with 0-timeout). The function adds axis scale and axis unit to the dataObject. - - //\param [in] waitMS indicates the time (in ms) that should be waiting until every registered live image source node received m_image. 0: no wait, -1: infinit waiting time, else time in milliseconds - //\return retOk if everything was ok, retWarning if live image could not be invoked - //*/ + //------------------------------------------------------------------------------- + //! sends m_image to all registered listeners. + /* + This method is continuously called from timerEvent. Also call this method from + your getVal-Method (usually with 0-timeout). The function adds axis scale and + axis unit to the dataObject. + + \param [in] waitMS indicates the time (in ms) that should be waiting until every + registered live image source node received m_image. 0: no wait, -1: + infinit waiting time, else time in milliseconds + \return retOk if everything was ok, retWarning if live image could not be invoked + */ ito::RetVal AddInMultiChannelGrabber::sendDataToListeners(int waitMS) { Q_D(AddInMultiChannelGrabber); @@ -324,9 +330,11 @@ namespace ito assert(d->m_channelParamsProxyInitialized); ito::RetVal retValue = ito::retOk; int size = m_autoGrabbingListeners.size(); + if (waitMS == 0) { QMultiMap::iterator it = m_autoGrabbingListeners.begin(); + while (it != m_autoGrabbingListeners.end()) { const ChannelContainer& container = m_channels[it.key().toLatin1().data()]; @@ -336,6 +344,7 @@ namespace ito { retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); } + it++; } } @@ -344,6 +353,7 @@ namespace ito ItomSharedSemaphore** waitConds = new ItomSharedSemaphore * [size]; int i = 0; QMultiMap::iterator it = m_autoGrabbingListeners.begin(); + while (it != m_autoGrabbingListeners.end()) { waitConds[i] = new ItomSharedSemaphore(); @@ -365,12 +375,12 @@ namespace ito { qDebug() << "timeout in number: " << i << "number of items: " << size; } + waitConds[i]->deleteSemaphore(); - waitConds[i] = NULL; + waitConds[i] = nullptr; } - delete[] waitConds; - waitConds = NULL; + DELETE_AND_SET_NULL_ARRAY(waitConds); } @@ -750,19 +760,19 @@ namespace ito return retValue; } - ////------------------------------------------------------------------------------- - ////! Sets a new value to a parameter. - ///*! - // This function parses the given parameter and calls setParameter. If the bool parameter ok in the setParameter (to be implemented in the individual plugins) - // function returns false, it gets assumed that the plugin didn't process the parameter. In this case the value of the parameter gets copied here. - // If the parameter name is "roi" sizex and sizey gets updated by setParam. If the key of the parameter is "defaultChannel" the function "switchDefaultChannel" gets called. - // Both happens also if the "ok" value of setParameter is true. - // "applyParamsToChannelParams" is called to synchronize the parameters of the channel container follwed by a call of checkData. - - //\param [in] val is a QSharedPOinter of type ParamBase containing the paremeter to be set. - //\param [in] waitCond - //\return retOk if everything was ok, else retError - //*/ + //------------------------------------------------------------------------------- + //! Sets a new value to a parameter. + /*! + This function parses the given parameter and calls setParameter. If the bool parameter ok in the setParameter (to be implemented in the individual plugins) + function returns false, it gets assumed that the plugin didn't process the parameter. In this case the value of the parameter gets copied here. + If the parameter name is "roi" sizex and sizey gets updated by setParam. If the key of the parameter is "defaultChannel" the function "switchDefaultChannel" gets called. + Both happens also if the "ok" value of setParameter is true. + "applyParamsToChannelParams" is called to synchronize the parameters of the channel container follwed by a call of checkData. + + \param [in] val is a QSharedPOinter of type ParamBase containing the paremeter to be set. + \param [in] waitCond + \return retOk if everything was ok, else retError + */ ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer val, ItomSharedSemaphore* waitCond/* = NULL*/) { Q_D(AddInMultiChannelGrabber); @@ -806,7 +816,7 @@ namespace ito } else { - retValue += retValue += ito::RetVal(ito::retError, 0, tr("could not switch to channel %1. The channel is unknown.").arg(val->getVal()).toLatin1().data()); + retValue += ito::RetVal(ito::retError, 0, tr("could not switch to channel %1. The channel is unknown.").arg(val->getVal()).toLatin1().data()); } } } @@ -846,46 +856,54 @@ namespace ito return retValue; } - ////------------------------------------------------------------------------------- - ////! synchronizes m_params with the params of default channel container - ///*! - //This method synchronizes the parameters from the current selected channel container with m_params. Call this function after changing the defaultChannel parameter.Parameters which are not available for the current default channel are set to readonly + //------------------------------------------------------------------------------- + //! synchronizes m_params with the params of default channel container + /*! + This method synchronizes the parameters from the current selected channel container + with m_params. Call this function after changing the defaultChannel parameter. + Parameters which are not available for the current default channel are set to readonly - //\return retOk if everything was ok, else retError - //*/ + \return retOk if everything was ok, else retError + */ ito::RetVal AddInMultiChannelGrabber::switchChannelSelector() { Q_D(AddInMultiChannelGrabber); assert(d->m_channelParamsProxyInitialized); ito::RetVal retValue(ito::retOk); - unsigned int flag = 0; + ito::uint32 flag = 0; QString selectedChannel = QLatin1String(m_params["channelSelector"].getVal()); if (m_channels.contains(selectedChannel)) { - QMutableMapIterator itParam(m_params); + const auto& selChannel = m_channels[selectedChannel]; + auto paramsInChannelIter = d->m_paramChannelAvailabilityMap.constBegin(); - while (itParam.hasNext()) + while (paramsInChannelIter != d->m_paramChannelAvailabilityMap.constEnd()) { - itParam.next(); - - if (d->m_paramChannelAvailabilityMap[itParam.key()].contains(selectedChannel)) + if (paramsInChannelIter->contains(selectedChannel)) { - itParam.value() = m_channels[selectedChannel].m_channelParam[itParam.key()]; - } - else if (!d->m_paramChannelAvailabilityMap[itParam.key()].isEmpty()) - { - flag = itParam.value().getFlags(); - flag |= ito::ParamBase::Readonly; - itParam.value().setFlags(flag); + // this parameters is contained in the selected channel. Copy its value and flags + // from the channel to m_params + const ito::Param p = selChannel.m_channelParam[paramsInChannelIter.key()]; + m_params[paramsInChannelIter.key()].copyValueFrom(&p); + m_params[paramsInChannelIter.key()].setFlags(selChannel.m_channelParam[paramsInChannelIter.key()].getFlags()); } + + paramsInChannelIter++; } } else { - retValue += ito::RetVal(ito::retError, 0, tr("could not switch to channel %1. The channel is not registered.").arg(selectedChannel).toLatin1().data()); + retValue += ito::RetVal( + ito::retError, + 0, + tr("could not switch to channel %1. The channel is not registered.").arg(selectedChannel).toLatin1().data() + ); } + + emit parametersChanged(m_params); + return retValue; } From 54dce158bead6a4066d07177f70be04c6eae96d1 Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Wed, 2 Aug 2023 23:57:25 +0200 Subject: [PATCH 52/62] more fixes and improvements of multichannelGrabber --- common/abstractAddInConfigDialog.h | 6 +- common/addInMultiChannelGrabber.h | 76 ++++++++++++++++----- common/sources/addInMultiChannelGrabber.cpp | 52 +++++++++----- 3 files changed, 98 insertions(+), 36 deletions(-) diff --git a/common/abstractAddInConfigDialog.h b/common/abstractAddInConfigDialog.h index e79bbcd34..efc6ab5fc 100644 --- a/common/abstractAddInConfigDialog.h +++ b/common/abstractAddInConfigDialog.h @@ -153,7 +153,9 @@ namespace ito */ virtual ito::RetVal observeInvocation(ItomSharedSemaphore *waitCond, MessageLevel msgLevel) const; - QMap m_currentParameters; /*! use this map to save the current values of all parameters. For instance it is conventient to copy the map given in parametersChanged to this map */ + /*! use this map to save the current values of all parameters. + For instance it is conventient to copy the map given in parametersChanged to this map */ + QMap m_currentParameters; private: /*! private data pointer of this class. */ @@ -173,5 +175,3 @@ namespace ito virtual void parametersChanged(QMap params) = 0; }; } //end namespace ito - -#endif //ABSTRACTADDINCONFIGDIALOG_H diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index e62faa664..43131a0f1 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -103,7 +103,7 @@ namespace ito virtual ito::RetVal applyParamsToChannelParams(const QStringList& keyList = QStringList()); //! registers all channel containers, initializes their parameters as well as all common, global parameters - void initChannelsAndGlobalParameters( + ito::RetVal initChannelsAndGlobalParameters( const ChannelContainerMap& channelContainerMap, const QString& defaultChannelName, const QList& globalParameters = QList()); @@ -111,23 +111,43 @@ namespace ito ito::RetVal setParamMeta(const QByteArray& paramName, ito::ParamMeta* meta, bool takeOwnerShip, const QList& channelList = QList()); ito::RetVal setParamFlags(const QByteArray& paramName, const unsigned int& flags, const QList& channelList = QList()); - ////! Specific function to set the parameters in the respective plugin class - ///*! - //This function is a specific implementation of setParam. Overload this function to process parameters individually in the plugin class. This function is called by setParam after the parameter has been parsed and checked . - - //\param [in] val parameter to be processed - //\param [in] it ParamMapIterator iterator to the parameter in m_params - //\param [in] suffix possible suffix of the parameter - //\param [in] key of the parameter - //\param [in] index of the parameter - //\param [in] hasIndex is set to true if parameter has an index - //\param [in] set ok to true if parameter was processed - //\param [in] add key of changed channel specific parameters to pendingUpdate. - //\return retOk if everything was ok, else retError - //*/ + //! Specific function to set the parameters in the respective plugin class + /*! + This function is a specific implementation of setParam. Overload this function to process parameters individually in the plugin class. This function is called by setParam after the parameter has been parsed and checked . + + \param [in] val parameter to be processed + \param [in] it ParamMapIterator iterator to the parameter in m_params + \param [in] suffix possible suffix of the parameter + \param [in] key of the parameter + \param [in] index of the parameter + \param [in] hasIndex is set to true if parameter has an index + \param [in] set ok to true if parameter was processed + \param [in] add key of changed channel specific parameters to pendingUpdate. + \return retOk if everything was ok, else retError + */ virtual ito::RetVal setParameter(QSharedPointer& val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool& ok, QStringList& pendingUpdate) = 0; - virtual ito::RetVal getParameter(QSharedPointer val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool& ok) = 0; + + //! Specific function to get a parameter in the respective plugin class. + /* + This method has to be overwritten in every plugin class and is called within + the ``getParam`` method, which is final in this base class. Overload this method + instead of the ``getParam`` method to deliver the value of the requested parameter. + It is either possible, that this method delivers the content of the requested parameter, + or that the ``ok`` argument is set to true, the return value is retOk. In this case, + the calling ``getParam`` method will deliver the corresponding value in m_params as + it is. + */ + virtual ito::RetVal getParameter( + QSharedPointer val, + const ParamMapIterator& it, + const QString& key, + const QString& suffix, + int index, + bool hasIndex, + bool& ok) = 0; + virtual ito::RetVal getValByMap(QSharedPointer> dataObjMap) = 0; + virtual ito::RetVal copyValByMap(QSharedPointer> dataObjMap) = 0; void updateSizeXY(); /*!< updates sizex und sizey*/ @@ -141,7 +161,31 @@ namespace ito public slots: ito::RetVal setParam(QSharedPointer val, ItomSharedSemaphore* waitCond = nullptr) final; + + //! returns the current value of a selected parameter + /* + Approach: This method calls the abstract method ``getParameter`` that has to be overloaded + by the plugin in order to obtain the parameter. If this method sets its argument ``ok`` to false, + the current value of the parameter is returned per default by this base implementation. + + This method can either be invoked as ansychronous call, while the argument ``waitCond`` can + be used to handle a notification about end of the call or a timeout, or as a direct call. Then, + ``waitCond`` can also be set to a nullptr. + + getParam will always return the values of the parameters on the top level. If a parameter + is individual per channel, the value of the current channel is returned. This current channel + can be set via the parameter ``channelSelector``. + + \params val is the parameter, whose value is requested. It is a shared pointer of an ito::Param + object, whose name is the only thing that has to be given when calling this method. If this + method succeeds, this value is filled with the full parameter information including its current + value. + \params waitCond is the wait condition, that is used to observe the call state of an asychronous call. + \returns a RetVal object, that indicates the success of this call. The same return value is also + contained in the argument ``waitCond`` if given. + */ ito::RetVal getParam(QSharedPointer val, ItomSharedSemaphore* waitCond) final; + ito::RetVal changeChannelForListeners(const QString& newChannel, QObject* obj); ito::RetVal getVal(QSharedPointer > dataObjMap, ItomSharedSemaphore* waitCond); ito::RetVal copyVal(QSharedPointer > dataObjMap, ItomSharedSemaphore* waitCond); diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index ed45bc45e..8ec2de183 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -212,7 +212,7 @@ namespace ito } //--------------------------------------------------------------------------------- - void AddInMultiChannelGrabber::initChannelsAndGlobalParameters( + ito::RetVal AddInMultiChannelGrabber::initChannelsAndGlobalParameters( const ChannelContainerMap& channelContainerMap, const QString& defaultChannelName, const QList& globalParameters /*= QList()*/) @@ -308,7 +308,9 @@ namespace ito // call switchChannelSelector to synchronize the values in the channel specific parameters with // to these of the current channel (channelSelector). - switchChannelSelector(); + retValue += switchChannelSelector(); + + return retValue; } //------------------------------------------------------------------------------- @@ -682,8 +684,8 @@ namespace ito ito::RetVal AddInMultiChannelGrabber::getParam(QSharedPointer val, ItomSharedSemaphore* waitCond) { Q_D(AddInMultiChannelGrabber); - assert(d->m_channelParamsProxyInitialized); + ItomSharedSemaphoreLocker locker(waitCond); ito::RetVal retValue; QString key; @@ -700,12 +702,15 @@ namespace ito { retValue += apiGetParamFromMapByKey(m_params, key, it, false); } + if (!retValue.containsError()) { - retValue += getParameter(val, it, suffix, key, index, hasIndex, ok); + retValue += getParameter(val, it, key, suffix, index, hasIndex, ok); } - if (!retValue.containsError() && !ok)//the parameter was not processed by the plugin, so it is done here + + if (!retValue.containsError() && !ok) { + //the parameter was not processed by the plugin, so it is done here *val = it.value(); } @@ -763,43 +768,52 @@ namespace ito //------------------------------------------------------------------------------- //! Sets a new value to a parameter. /*! - This function parses the given parameter and calls setParameter. If the bool parameter ok in the setParameter (to be implemented in the individual plugins) - function returns false, it gets assumed that the plugin didn't process the parameter. In this case the value of the parameter gets copied here. - If the parameter name is "roi" sizex and sizey gets updated by setParam. If the key of the parameter is "defaultChannel" the function "switchDefaultChannel" gets called. + This function parses the given parameter and calls setParameter. If the bool + parameter ok in the setParameter (to be implemented in the individual plugins) + function returns false, it gets assumed that the plugin didn't process the + parameter. In this case the value of the parameter gets copied here. + If the parameter name is "roi" sizex and sizey gets updated by setParam. If the + key of the parameter is "defaultChannel" the function "switchDefaultChannel" gets called. Both happens also if the "ok" value of setParameter is true. - "applyParamsToChannelParams" is called to synchronize the parameters of the channel container follwed by a call of checkData. + "applyParamsToChannelParams" is called to synchronize the parameters of the + channel container follwed by a call of checkData. \param [in] val is a QSharedPOinter of type ParamBase containing the paremeter to be set. \param [in] waitCond \return retOk if everything was ok, else retError */ - ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer val, ItomSharedSemaphore* waitCond/* = NULL*/) + ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer val, ItomSharedSemaphore* waitCond/* = nullptr*/) { Q_D(AddInMultiChannelGrabber); - assert(d->m_channelParamsProxyInitialized); + ItomSharedSemaphoreLocker locker(waitCond); ito::RetVal retValue; - bool hasIndex, ok; + bool hasIndex; + bool ok = false; int index; - QString suffix, key; + QString suffix; + QString key; QStringList paramUpdateList; ParamMapIterator it; + int cntStartedDevices = grabberStartedCount(); - retValue += ito::parseParamName(val->getName(), key, hasIndex, index, suffix); + + retValue += apiParseParamName(val->getName(), key, hasIndex, index, suffix); retValue += apiGetParamFromMapByKey(m_params, key, it, true); retValue += apiValidateParam(*it, *val, false, true); + if (!retValue.containsError()) { retValue += setParameter(val, it, suffix, key, index, hasIndex, ok, paramUpdateList); + if (ok && !paramUpdateList.contains(val->getName())) { paramUpdateList << val->getName(); } + if (!retValue.containsError() && !ok) { - - if (!retValue.containsError()) { if (key != "defaultChannel") @@ -821,6 +835,7 @@ namespace ito } } } + if (!retValue.containsError()) { if (key == "roi" || paramUpdateList.contains("roi")) @@ -835,19 +850,22 @@ namespace ito retValue += applyParamsToChannelParams(paramUpdateList); retValue += checkData(); } + if (!retValue.containsError()) { emit parametersChanged(m_params); } } + if (cntStartedDevices < grabberStartedCount()) { if (cntStartedDevices != 0) { - retValue += startDevice(NULL); + retValue += startDevice(nullptr); setGrabberStarted(cntStartedDevices); } } + if (waitCond) { waitCond->returnValue = retValue; From cf40e693ded5fef4dba1b449c5a35845d09d405d Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Sun, 13 Aug 2023 00:27:43 +0200 Subject: [PATCH 53/62] more work for multi grabber interface --- common/addInInterface.h | 34 +- common/addInMultiChannelGrabber.h | 80 +- common/sources/addInGrabber.cpp | 126 +- common/sources/addInInterface.cpp | 50 +- common/sources/addInMultiChannelGrabber.cpp | 1827 +++++++++---------- plot/AbstractDObjFigure.h | 2 +- plot/sources/AbstractDObjFigure.cpp | 2 +- 7 files changed, 1094 insertions(+), 1027 deletions(-) diff --git a/common/addInInterface.h b/common/addInInterface.h index 31c42ecef..49d0de92a 100644 --- a/common/addInInterface.h +++ b/common/addInInterface.h @@ -836,10 +836,12 @@ class ITOMCOMMONQT_EXPORT AddInDataIO : public AddInBase this variable becomes false and any timer is activated, this timer is killed.*/ public: + + /*!< returns the state of m_autoGrabbingEnabled; consider this method as final */ inline int getAutoGrabbing() { return m_autoGrabbingEnabled; - } /*!< returns the state of m_autoGrabbingEnabled; consider this method as final */ + } Q_SIGNALS: @@ -851,54 +853,54 @@ class ITOMCOMMONQT_EXPORT AddInDataIO : public AddInBase virtual ito::RetVal stopDevice(ItomSharedSemaphore *waitCond); //! freeze the current data and prepare it for retrieval - virtual ito::RetVal acquire(const int trigger, ItomSharedSemaphore *waitCond = NULL); + virtual ito::RetVal acquire(const int trigger, ItomSharedSemaphore *waitCond = nullptr); //! stops a continuous acquisition (usually only required by AD/DA converters). This method has not to be //! implemented in every plugin. New from itom.AddIn.Interface/4.0.0 on - virtual ito::RetVal stop(ItomSharedSemaphore *waitCond = NULL); + virtual ito::RetVal stop(ItomSharedSemaphore *waitCond = nullptr); //! read data from the device into a dataObject (which is passed as void pointer actually). Output is a shallow-copy //! to the grabber internal buffer-object. - virtual ito::RetVal getVal(void *data, ItomSharedSemaphore *waitCond = NULL); + virtual ito::RetVal getVal(void *data, ItomSharedSemaphore *waitCond = nullptr); //! read data from the device into a "raw data pointer" (in this case a char * is passed, pointing to the start of //! the preallocated memory) virtual ito::RetVal getVal(QSharedPointer data, QSharedPointer length, - ItomSharedSemaphore *waitCond = NULL); + ItomSharedSemaphore *waitCond = nullptr); //! read data from the device into a dataObject (which is passed as void pointer actually). The map contains //! dataObjects for different channels. Output is a shallow-copy to the grabber internal buffer-object. virtual ito::RetVal getVal(QSharedPointer> dataObjMap, - ItomSharedSemaphore *waitCond = NULL); + ItomSharedSemaphore *waitCond = nullptr); - virtual ito::RetVal getVal(ItomSharedSemaphore* waitCond = NULL); + virtual ito::RetVal getVal(ItomSharedSemaphore* waitCond = nullptr); //! read data from the device into a dataObject (which is passed as void pointer actually). Output is a deep-copy to //! the grabber internal object. virtual ito::RetVal copyVal(void *dObj, ItomSharedSemaphore *waitCond); //! write data, e.g. to the DA part of an ADDA card - virtual ito::RetVal setVal(const char *data, const int length, ItomSharedSemaphore *waitCond = NULL); + virtual ito::RetVal setVal(const char *data, const int length, ItomSharedSemaphore *waitCond = nullptr); //! enables the timer for auto grabbing (live image), if any live image has signed on (usually this method must not //! be overwritten) - ito::RetVal enableAutoGrabbing(ItomSharedSemaphore *waitCond = NULL); // consider this method as final + ito::RetVal enableAutoGrabbing(ItomSharedSemaphore *waitCond = nullptr); // consider this method as final //! disables the timer for auto grabbing (live image) (usually this method must not be overwritten) - ito::RetVal disableAutoGrabbing(ItomSharedSemaphore *waitCond = NULL); // consider this method as final + ito::RetVal disableAutoGrabbing(ItomSharedSemaphore *waitCond = nullptr); // consider this method as final //! sets a new interval for the auto-grabbing timer (in ms). If interval <= 0 is passed, nothing is changed, but the //! current interval is returned. This method does not enable or disable the timer. ito::RetVal setAutoGrabbingInterval(QSharedPointer interval, - ItomSharedSemaphore *waitCond = NULL); // consider this method as final + ItomSharedSemaphore *waitCond = nullptr); // consider this method as final //! starts device and registers obj as listener (live image). This listener must have a slot void - //! setSource(QSharedPointer, ItomSaredSemaphore). - ito::RetVal startDeviceAndRegisterListener(QObject *obj, - ItomSharedSemaphore *waitCond = NULL); // consider this method as final + //! setSource(QSharedPointer, ItomSharedSemaphore). + ito::RetVal startDeviceAndRegisterListener(QObject *listener, + ItomSharedSemaphore *waitCond = nullptr); // consider this method as final //! stops device and unregisters obj (live image). - ito::RetVal stopDeviceAndUnregisterListener(QObject *obj, - ItomSharedSemaphore *waitCond = NULL); // consider this method as final + ito::RetVal stopDeviceAndUnregisterListener(QObject * listener, + ItomSharedSemaphore *waitCond = nullptr); // consider this method as final }; //---------------------------------------------------------------------------------------------------------------------------------- diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index 43131a0f1..f18b20497 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -34,20 +34,34 @@ #include "sharedStructuresQt.h" #include "sharedStructures.h" -#if !defined(Q_MOC_RUN) || defined(ITOMCOMMONQT_MOC) //only moc this file in itomCommonQtLib but not in other libraries or executables linking against this itomCommonQtLib +// only moc this file in itomCommonQtLib but not in other libraries or executables linking against this itomCommonQtLib +#if !defined(Q_MOC_RUN) || defined(ITOMCOMMONQT_MOC) namespace ito { class AddInMultiChannelGrabberPrivate; - - class ITOMCOMMONQT_EXPORT AddInMultiChannelGrabber : public AbstractAddInGrabber { Q_OBJECT protected: + //! enumeration values, that can be combined + enum class DataStatus + { + //! idle = no new data in object + Idle = 0, + + //! newData = new data in object, not emitted via newData + //! yet, not fetched via getVal/copyVal yet + NewData = 1, + + //! same than newData, however data is already emitted, + //! but not fetched via getVal/copyVal yet + NewDataAndEmitted = 2 + }; + class ChannelContainer { public: @@ -76,13 +90,16 @@ namespace ito //!< dataObject container with currently acquired data for this channel ito::DataObject m_data; + //!< state of the dataObject container + DataStatus m_dataStatus; + //!< map of individual parameters for this channel. Every channel has a set //! of default parameters, namely: pixelFormat, roi, sizex, sizey, axisOffset, axisScale. //! axisDescription, axisUnit, valueDescription, valueUnit. Further parameters //! can be added. It is recommended to have the same parameter types and names //! in every channel, since they are mirrored to the m_params map of the main //! plugin class. - ParamMap m_channelParam; + ParamMap m_channelParams; protected: void addDefaultMetaParams(); @@ -95,10 +112,13 @@ namespace ito ChannelContainerMap m_channels; /*!< Map for recently grabbed images of various channels */ virtual ito::RetVal checkData(ito::DataObject* externalDataObject = nullptr); - virtual ito::RetVal checkData(QMap& externalDataObject); + virtual ito::RetVal checkData(const QString &channelName, ito::DataObject* externalDataObject = nullptr); + virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ + void addChannel(QString name); + virtual ito::RetVal switchChannelSelector();/*!< synchronizes m_params with the params of default channel container */ virtual ito::RetVal applyParamsToChannelParams(const QStringList& keyList = QStringList()); @@ -111,9 +131,27 @@ namespace ito ito::RetVal setParamMeta(const QByteArray& paramName, ito::ParamMeta* meta, bool takeOwnerShip, const QList& channelList = QList()); ito::RetVal setParamFlags(const QByteArray& paramName, const unsigned int& flags, const QList& channelList = QList()); + //! This method fetches the latest acquired images or datasets from the grabber and store it into the channel. + /* + This method has to be overloaded by the specific plugin instance. It should + fetch the latest acquired images or datasets for all given channels and store + it into the internal buffers (m_data) of all corresponding channels. + + The new data is not emitted yet. Its state has to be set to DataStatus::NewData. + + \param channels are the desired channels. If empty, all registered channels should + be fetched. + \return ito::retError if at least one dataset of at least one desired channel + is not available. + + */ + virtual ito::RetVal retrieveData(const QStringList& channels = QStringList()) = 0; + //! Specific function to set the parameters in the respective plugin class /*! - This function is a specific implementation of setParam. Overload this function to process parameters individually in the plugin class. This function is called by setParam after the parameter has been parsed and checked . + This function is a specific implementation of setParam. Overload this function to + process parameters individually in the plugin class. This function is called + by setParam after the parameter has been parsed and checked . \param [in] val parameter to be processed \param [in] it ParamMapIterator iterator to the parameter in m_params @@ -125,7 +163,15 @@ namespace ito \param [in] add key of changed channel specific parameters to pendingUpdate. \return retOk if everything was ok, else retError */ - virtual ito::RetVal setParameter(QSharedPointer& val, const ParamMapIterator& it, const QString& suffix, const QString& key, int index, bool hasIndex, bool& ok, QStringList& pendingUpdate) = 0; + virtual ito::RetVal setParameter( + QSharedPointer& val, + const ParamMapIterator& it, + const QString& suffix, + const QString& key, + int index, + bool hasIndex, + bool& ok, + QStringList& pendingUpdate) = 0; //! Specific function to get a parameter in the respective plugin class. /* @@ -146,11 +192,11 @@ namespace ito bool hasIndex, bool& ok) = 0; - virtual ito::RetVal getValByMap(QSharedPointer> dataObjMap) = 0; - - virtual ito::RetVal copyValByMap(QSharedPointer> dataObjMap) = 0; void updateSizeXY(); /*!< updates sizex und sizey*/ + const ChannelContainer& getCurrentDefaultChannel() const; + ChannelContainer& getCurrentDefaultChannel(); + public: AddInMultiChannelGrabber(const QByteArray& grabberName); ~AddInMultiChannelGrabber(); @@ -186,13 +232,19 @@ namespace ito */ ito::RetVal getParam(QSharedPointer val, ItomSharedSemaphore* waitCond) final; - ito::RetVal changeChannelForListeners(const QString& newChannel, QObject* obj); - ito::RetVal getVal(QSharedPointer > dataObjMap, ItomSharedSemaphore* waitCond); - ito::RetVal copyVal(QSharedPointer > dataObjMap, ItomSharedSemaphore* waitCond); + virtual ito::RetVal getVal(void* vpdObj, ItomSharedSemaphore* waitCond); + virtual ito::RetVal copyVal(void* vpdObj, ItomSharedSemaphore* waitCond); + + virtual ito::RetVal getVal(QSharedPointer > channelDatasets, ItomSharedSemaphore* waitCond); + virtual ito::RetVal copyVal(QSharedPointer > channelDatasets, ItomSharedSemaphore* waitCond); + + ito::RetVal changeChannelForListener(QObject* listener, const QString& newChannel); signals: /*!< Signals that a new image or set of images is available. Connect to this signal to obtain a shallow copy of the new images */ - void newData(QSharedPointer > dataObjMap); + void newData(QSharedPointer > channelDatasets); }; + } + #endif diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index 0740e972b..35be1561d 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -64,51 +64,51 @@ ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) ito::float64 axisOffset[] = {0.0, 0.0}; ito::float64 axisScale[] = {1.0, 1.0}; - QString axisUnit[] = {"", ""}; - QString axisDescription[] = {"", ""}; - QString valueDescription = ""; - QString valueUnit = ""; + ito::ByteArray axisUnit[] = {"", ""}; + ito::ByteArray axisDescription[] = {"", ""}; + ito::ByteArray valueDescription = ""; + ito::ByteArray valueUnit = ""; // only if exists in plugin if (m_params.contains("axisOffset")) { - axisOffset[0] = m_params["axisOffset"].getVal()[0]; - axisOffset[1] = m_params["axisOffset"].getVal()[1]; + axisOffset[0] = m_params["axisOffset"].getVal()[0]; + axisOffset[1] = m_params["axisOffset"].getVal()[1]; } // only if exists in plugin if (m_params.contains("axisScale")) { - axisScale[0] = m_params["axisScale"].getVal()[0]; - axisScale[1] = m_params["axisScale"].getVal()[1]; + axisScale[0] = m_params["axisScale"].getVal()[0]; + axisScale[1] = m_params["axisScale"].getVal()[1]; } // only if exists in plugin if (m_params.contains("axisDescription")) { axisDescription[0] = - QString::fromUtf8(m_params["axisDescription"].getVal()[0].data()); + m_params["axisDescription"].getVal()[0]); axisDescription[1] = - QString::fromUtf8(m_params["axisDescription"].getVal()[1].data()); + m_params["axisDescription"].getVal()[1]); } // only if exists in plugin if (m_params.contains("axisUnit")) { - axisUnit[0] = QString::fromUtf8(m_params["axisUnit"].getVal()[0].data()); - axisUnit[1] = QString::fromUtf8(m_params["axisUnit"].getVal()[1].data()); + axisUnit[0] = m_params["axisUnit"].getVal()[0]; + axisUnit[1] = m_params["axisUnit"].getVal()[1]; } // only if exists in plugin if (m_params.contains("valueDescription")) { - valueDescription = QString::fromLatin1(m_params["valueDescription"].getVal()); + valueDescription = m_params["valueDescription"].getVal(); } // only if exists in plugin if (m_params.contains("valueUnit")) { - valueUnit = QString::fromLatin1(m_params["valueUnit"].getVal()); + valueUnit = m_params["valueUnit"].getVal(); } if (bpp <= 8) @@ -127,98 +127,116 @@ ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) { futureType = ito::tFloat64; } + if (!m_params.contains("sizez")) { - if (externalDataObject == NULL) + if (externalDataObject == nullptr) { - if (m_data.getDims() < 2 || m_data.getSize(0) != (unsigned int)futureHeight || - m_data.getSize(1) != (unsigned int)futureWidth || m_data.getType() != futureType) + if (m_data.getDims() < 2 || m_data.getSize(0) != futureHeight || + m_data.getSize(1) != futureWidth || m_data.getType() != futureType) { m_data = ito::DataObject(futureHeight, futureWidth, futureType); } + m_data.setAxisScale(0, axisScale[0]); m_data.setAxisScale(1, axisScale[1]); m_data.setAxisOffset(0, axisOffset[0]); m_data.setAxisOffset(1, axisOffset[1]); - m_data.setAxisDescription(0, axisDescription[0].toLatin1().data()); - m_data.setAxisDescription(1, axisDescription[1].toLatin1().data()); - m_data.setAxisUnit(0, axisUnit[0].toLatin1().data()); - m_data.setAxisUnit(1, axisUnit[1].toLatin1().data()); - m_data.setValueDescription(valueDescription.toLatin1().data()); - m_data.setValueUnit(valueUnit.toLatin1().data()); + m_data.setAxisDescription(0, axisDescription[0].data()); + m_data.setAxisDescription(1, axisDescription[1].data()); + m_data.setAxisUnit(0, axisUnit[0].data()); + m_data.setAxisUnit(1, axisUnit[1].data()); + m_data.setValueDescription(valueDescription.data()); + m_data.setValueUnit(valueUnit.data()); } else { int dims = externalDataObject->getDims(); + if (externalDataObject->getDims() == 0) { *externalDataObject = ito::DataObject(futureHeight, futureWidth, futureType); + externalDataObject->setAxisScale(0, axisScale[0]); + externalDataObject->setAxisScale(1, axisScale[1]); + externalDataObject->setAxisOffset(0, axisOffset[0]); + externalDataObject->setAxisOffset(1, axisOffset[1]); + externalDataObject->setAxisDescription(0, axisDescription[0].data()); + externalDataObject->setAxisDescription(1, axisDescription[1].data()); + externalDataObject->setAxisUnit(0, axisUnit[0].data()); + externalDataObject->setAxisUnit(1, axisUnit[1].data()); + externalDataObject->setValueDescription(valueDescription.data()); + externalDataObject->setValueUnit(valueUnit.data()); } else if (externalDataObject->calcNumMats() != 1) { - return ito::RetVal(ito::retError, 0, - tr("Error during check data, external dataObject invalid. Object has more or less " - "than 1 plane. It must be of right size and type or an uninitilized image.") - .toLatin1() - .data()); + return ito::RetVal( + ito::retError, 0, + tr("Error during check data, external dataObject invalid. Object has more or less " + "than 1 plane. It must be of right size and type or an uninitilized image.") + .toLatin1() + .data()); } else if (externalDataObject->getSize(dims - 2) != (unsigned int)futureHeight || externalDataObject->getSize(dims - 1) != (unsigned int)futureWidth || externalDataObject->getType() != futureType) { - return ito::RetVal(ito::retError, 0, - tr("Error during check data, external dataObject invalid. Object must be of right " - "size and type or an uninitilized image.") - .toLatin1() - .data()); + return ito::RetVal( + ito::retError, 0, + tr("Error during check data, external dataObject invalid. Object must be of right " + "size and type or an uninitilized image.") + .toLatin1() + .data()); } } } else { int numChannel = m_params["sizez"].getVal(); - if (externalDataObject == NULL) + + if (externalDataObject == nullptr) { - if (m_data.getDims() < 3 || m_data.getSize(0) != (unsigned int)numChannel || - m_data.getSize(1) != (unsigned int)futureHeight || m_data.getSize(2) != (unsigned int)futureWidth || + if (m_data.getDims() < 3 || m_data.getSize(0) != numChannel || + m_data.getSize(1) != futureHeight || m_data.getSize(2) != futureWidth || m_data.getType() != futureType) { m_data = ito::DataObject(numChannel, futureHeight, futureWidth, futureType); } + m_data.setAxisScale(0, axisScale[0]); m_data.setAxisScale(1, axisScale[1]); m_data.setAxisOffset(0, axisOffset[0]); m_data.setAxisOffset(1, axisOffset[1]); - m_data.setAxisDescription(0, axisDescription[0].toLatin1().data()); - m_data.setAxisDescription(1, axisDescription[1].toLatin1().data()); - m_data.setAxisUnit(0, axisUnit[0].toLatin1().data()); - m_data.setAxisUnit(1, axisUnit[1].toLatin1().data()); - m_data.setValueDescription(valueDescription.toLatin1().data()); - m_data.setValueUnit(valueUnit.toLatin1().data()); + m_data.setAxisDescription(0, axisDescription[0].data()); + m_data.setAxisDescription(1, axisDescription[1].data()); + m_data.setAxisUnit(0, axisUnit[0].data()); + m_data.setAxisUnit(1, axisUnit[1].data()); + m_data.setValueDescription(valueDescription.data()); + m_data.setValueUnit(valueUnit.data()); } else { int dims = externalDataObject->getDims(); + if (externalDataObject->getDims() == 0) { *externalDataObject = ito::DataObject(numChannel, futureHeight, futureWidth, futureType); } - else if (externalDataObject->getSize(dims - 3) != (unsigned int)numChannel || - externalDataObject->getSize(dims - 2) != (unsigned int)futureHeight || - externalDataObject->getSize(dims - 1) != (unsigned int)futureWidth || + else if (externalDataObject->getSize(dims - 3) != numChannel || + externalDataObject->getSize(dims - 2) != futureHeight || + externalDataObject->getSize(dims - 1) != futureWidth || externalDataObject->getType() != futureType) { - return ito::RetVal(ito::retError, 0, - tr("Error during check data, external dataObject invalid. Object must be of right " - "size and type or an uninitilized image.") - .toLatin1() - .data()); + return ito::RetVal( + ito::retError, 0, + tr("Error during check data, external dataObject invalid. Object must be of right " + "size and type or an uninitilized image.") + .toLatin1() + .data()); } } } - return ito::retOk; } //------------------------------------------------------------------------------------- @@ -245,7 +263,7 @@ ito::RetVal AddInGrabber::sendDataToListeners(int waitMS) if (!QMetaObject::invokeMethod(obj, "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_data))), - Q_ARG(ItomSharedSemaphore *, NULL))) + Q_ARG(ItomSharedSemaphore *, nullptr))) { retValue += ito::RetVal(ito::retWarning, 1001, @@ -283,11 +301,11 @@ ito::RetVal AddInGrabber::sendDataToListeners(int waitMS) qDebug() << "timeout in number: " << i << "number of items: " << size; } waitConds[i]->deleteSemaphore(); - waitConds[i] = NULL; + waitConds[i] = nullptr; } delete[] waitConds; - waitConds = NULL; + waitConds = nullptr; } return retValue; diff --git a/common/sources/addInInterface.cpp b/common/sources/addInInterface.cpp index 6769c505e..81289a7b4 100644 --- a/common/sources/addInInterface.cpp +++ b/common/sources/addInInterface.cpp @@ -851,35 +851,41 @@ namespace ito } //--------------------------------------------------------------------------------- - ito::RetVal AddInDataIO::startDeviceAndRegisterListener(QObject* obj, ItomSharedSemaphore *waitCond) + ito::RetVal AddInDataIO::startDeviceAndRegisterListener(QObject* listener, ItomSharedSemaphore *waitCond) { qDebug("begin: startDeviceAndRegisterListener"); ItomSharedSemaphoreLocker locker(waitCond); ito::RetVal retValue(ito::retOk); QString defaultChannel; - bool isMultiChannel = false; - isMultiChannel = this->inherits("ito::AddInMultiChannelGrabber"); + bool isMultiChannel = inherits("ito::AddInMultiChannelGrabber"); + QByteArray setSourceSignature = + QMetaObject::normalizedSignature( + "setSource(QSharedPointer,ItomSharedSemaphore*)" + ); if (isMultiChannel) { - defaultChannel = m_params["defaultChannel"].getVal(); + defaultChannel = QLatin1String(m_params["defaultChannel"].getVal()); } - if (obj->metaObject()->indexOfSlot(QMetaObject::normalizedSignature("setSource(QSharedPointer,ItomSharedSemaphore*)")) == -1) + if (listener->metaObject()->indexOfSlot(setSourceSignature) == -1) { - retValue += ito::RetVal(ito::retError, 2002, tr("listener does not have a slot ").toLatin1().data()); + retValue += ito::RetVal(ito::retError, 2002, tr("listener does not have the mandatory slot ``setSource``.").toLatin1().data()); } - else if ((!isMultiChannel && m_autoGrabbingListeners.contains("",obj))||(isMultiChannel && m_autoGrabbingListeners.contains(defaultChannel, obj))) + else if ( + (!isMultiChannel && m_autoGrabbingListeners.contains("",listener)) || + (isMultiChannel && m_autoGrabbingListeners.contains(defaultChannel, listener)) + ) { - retValue += ito::RetVal(ito::retWarning, 1011, tr("this object already has been registered as listener").toLatin1().data()); + retValue += ito::RetVal(ito::retWarning, 1011, tr("this object has already been registered as listener").toLatin1().data()); } else { - retValue += startDevice(NULL); + retValue += startDevice(nullptr); if (!retValue.containsError()) { - if (m_autoGrabbingEnabled == true && m_autoGrabbingListeners.size() >= 0 && m_timerID == 0) + if (m_autoGrabbingEnabled && m_autoGrabbingListeners.size() >= 0 && m_timerID == 0) { m_timerID = startTimer(m_timerIntervalMS); @@ -888,13 +894,14 @@ namespace ito retValue += ito::RetVal(ito::retError, 2001, tr("timer could not be set").toLatin1().data()); } } + if (!isMultiChannel) { - m_autoGrabbingListeners.insert("",obj); + m_autoGrabbingListeners.insert("", listener); } else { - m_autoGrabbingListeners.insert(defaultChannel, obj); + m_autoGrabbingListeners.insert(defaultChannel, listener); } } } @@ -914,29 +921,30 @@ namespace ito } //--------------------------------------------------------------------------------- - ito::RetVal AddInDataIO::stopDeviceAndUnregisterListener(QObject* obj, ItomSharedSemaphore *waitCond) + ito::RetVal AddInDataIO::stopDeviceAndUnregisterListener(QObject* listener, ItomSharedSemaphore *waitCond) { qDebug("start: stopDeviceAndUnregisterListener"); ItomSharedSemaphoreLocker locker(waitCond); ito::RetVal retValue(ito::retOk); - if (obj) + if (listener) { bool found = false; - QMultiMap::iterator i = m_autoGrabbingListeners.begin(); - while (i != m_autoGrabbingListeners.end()) + auto it = m_autoGrabbingListeners.begin(); + + while (it != m_autoGrabbingListeners.end()) { - if (i.value() == obj) + if (*it == listener) { found = true; - m_autoGrabbingListeners.remove(i.key(), i.value()); + m_autoGrabbingListeners.erase(it); break; } - } + if (!found) { - retValue += ito::RetVal(ito::retWarning, 1012, tr("the object could not been found in m_autoGrabbingListeners").toLatin1().data()); + retValue += ito::RetVal(ito::retWarning, 1012, tr("The given listener (e.g. plot) is not among the list of currently registered listeners.").toLatin1().data()); } } else @@ -952,7 +960,7 @@ namespace ito } } - retValue += stopDevice(NULL); + retValue += stopDevice(nullptr); } if (waitCond) diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index 8ec2de183..326d2fcff 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -37,1136 +37,1123 @@ namespace ito { - //--------------------------------------------------------------------------------- - class AddInMultiChannelGrabberPrivate - { - public: - AddInMultiChannelGrabberPrivate() : m_channelParamsProxyInitialized(false) - { - - } - - //!< true if an appropriate parameter is created in the m_params map of the - //! plugin for every parameter of the channels. The m_params value is a - //! proxy for the currently selected channel. - bool m_channelParamsProxyInitialized; - - //!< this map contains all parameter names in m_param, that belong to a - //! channel parameter. The value string list contains all channel names, - //! where this parameter is explicitely contained. Global parameters, - //! that are independent on channels, are not listed here. - QMap m_paramChannelAvailabilityMap; - }; - //--------------------------------------------------------------------------------- - AddInMultiChannelGrabber::ChannelContainer::ChannelContainer() +//------------------------------------------------------------------------------------- +class AddInMultiChannelGrabberPrivate +{ +public: + AddInMultiChannelGrabberPrivate() : m_channelParamsProxyInitialized(false) { - ito::Param paramVal; - int roi[] = { 0, 0, 1, 1 }; - paramVal = ito::Param("roi", ito::ParamBase::IntArray, 4, roi, "roi"); - m_channelParam.insert(paramVal.getName(), paramVal); - paramVal = ito::Param("sizex", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 1, 1, "sizex"); - m_channelParam.insert(paramVal.getName(), paramVal); + } - paramVal = ito::Param("sizey", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 1, 1, "sizey"); - m_channelParam.insert(paramVal.getName(), paramVal); + //!< true if an appropriate parameter is created in the m_params map of the + //! plugin for every parameter of the channels. The m_params value is a + //! proxy for the currently selected channel. + bool m_channelParamsProxyInitialized; + + //!< this map contains all parameter names in m_param, that belong to a + //! channel parameter. The value string list contains all channel names, + //! where this parameter is explicitely contained. Global parameters, + //! that are independent on channels, are not listed here. + QMap m_paramChannelAvailabilityMap; +}; + +//------------------------------------------------------------------------------------- +AddInMultiChannelGrabber::ChannelContainer::ChannelContainer() : + m_dataStatus(DataStatus::Idle) +{ + ito::Param paramVal; + int roi[] = { 0, 0, 1, 1 }; + paramVal = ito::Param("roi", ito::ParamBase::IntArray, 4, roi, "roi"); + m_channelParams.insert(paramVal.getName(), paramVal); + + paramVal = ito::Param("sizex", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 1, 1, "sizex"); + m_channelParams.insert(paramVal.getName(), paramVal); + + paramVal = ito::Param("sizey", ito::ParamBase::Int | ito::ParamBase::Readonly, 1, 1, 1, "sizey"); + m_channelParams.insert(paramVal.getName(), paramVal); + + paramVal = ito::Param("pixelFormat", ito::ParamBase::String, "mono8", "pixelFormat"); + m_channelParams.insert(paramVal.getName(), paramVal); + + addDefaultMetaParams(); +}; + +//------------------------------------------------------------------------------------- +AddInMultiChannelGrabber::ChannelContainer::ChannelContainer( + const ito::Param& roi, + const ito::Param& pixelFormat, + const ito::Param& sizex, + const ito::Param& sizey) : + m_dataStatus(DataStatus::Idle) +{ + Q_ASSERT(QByteArray(roi.getName()) == "roi"); + Q_ASSERT(QByteArray(pixelFormat.getName()) == "pixelFormat"); + Q_ASSERT(QByteArray(sizex.getName()) == "sizex"); + Q_ASSERT(QByteArray(sizey.getName()) == "sizey"); + + addChannelParam(roi); + addChannelParam(pixelFormat); + addChannelParam(sizex); + addChannelParam(sizey); + addDefaultMetaParams(); +} + +//------------------------------------------------------------------------------------- +AddInMultiChannelGrabber::ChannelContainer::ChannelContainer( + const ito::Param& roi, + const ito::Param& pixelFormat, + const ito::Param& sizex, + const ito::Param& sizey, + const ito::Param& axisOffsets, + const ito::Param& axisScales, + const ito::Param& axisDescriptions, + const ito::Param& axisUnits, + const ito::Param& valueDescription, + const ito::Param& valueUnit) : + m_dataStatus(DataStatus::Idle) +{ + Q_ASSERT(QByteArray(roi.getName()) == "roi"); + Q_ASSERT(QByteArray(pixelFormat.getName()) == "pixelFormat"); + Q_ASSERT(QByteArray(sizex.getName()) == "sizex"); + Q_ASSERT(QByteArray(sizey.getName()) == "sizey"); + Q_ASSERT(QByteArray(axisOffsets.getName()) == "axisOffsets"); + Q_ASSERT(QByteArray(axisScales.getName()) == "axisScales"); + Q_ASSERT(QByteArray(axisDescriptions.getName()) == "axisDescriptions"); + Q_ASSERT(QByteArray(axisUnits.getName()) == "axisUnits"); + Q_ASSERT(QByteArray(valueDescription.getName()) == "valueDescription"); + Q_ASSERT(QByteArray(valueUnit.getName()) == "valueUnit"); + + addChannelParam(roi); + addChannelParam(pixelFormat); + addChannelParam(sizex); + addChannelParam(sizey); + addChannelParam(axisOffsets); + addChannelParam(axisScales); + addChannelParam(axisDescriptions); + addChannelParam(axisUnits); + addChannelParam(axisDescriptions); + addChannelParam(axisUnits); + addChannelParam(valueDescription); + addChannelParam(valueUnit); +} + +//------------------------------------------------------------------------------------- +void AddInMultiChannelGrabber::ChannelContainer::addDefaultMetaParams() +{ + ito::Param paramVal; + + double axisOffsets[] = { 0.0, 0.0 }; + paramVal = ito::Param("axisOffsets", ito::ParamBase::DoubleArray, 2, axisOffsets, "the offset values of the y- and x-axis of this channel image."); + paramVal.setMeta(new ito::DoubleArrayMeta(-DBL_MAX, DBL_MAX, 0.0, 2, 2, 1, "MetaInformation"), true); + addChannelParam(paramVal); + + double axisScales[] = { 1.0, 1.0 }; + paramVal = ito::Param("axisScales", ito::ParamBase::DoubleArray, 2, axisOffsets, "the scale values of the y- and x-axis of this channel image."); + paramVal.setMeta(new ito::DoubleArrayMeta(-DBL_MAX, DBL_MAX, 0.0, 2, 2, 1, "MetaInformation"), true); + addChannelParam(paramVal); + + ito::ByteArray axisUnits[] = { "", "" }; + paramVal = ito::Param( + "axisUnits", + ito::ParamBase::StringList, 2, + axisUnits, "The unit strings for the y- and x-axis of the grabber image"); + paramVal.setMeta(new ito::StringListMeta(ito::StringMeta::Wildcard, "*", 2, 2, 1, "MetaInformation"), true); + addChannelParam(paramVal); + + ito::ByteArray axisDescriptions[] = { "", "" }; + paramVal = ito::Param( + "axisDescriptions", + ito::ParamBase::StringList, 2, + axisDescriptions, + "axis description"); + paramVal.setMeta(new ito::StringListMeta(ito::StringMeta::Wildcard, "*", 2, 2, 1, "MetaInformation"), true); + addChannelParam(paramVal); + + paramVal = ito::Param( + "valueDescription", + ito::ParamBase::String, + "", + "value description"); + addChannelParam(paramVal); + + paramVal = ito::Param( + "valueUnit", ito::ParamBase::String, "", "The unit string of the values of this channel image"); + addChannelParam(paramVal); +} + +//------------------------------------------------------------------------------------- +void AddInMultiChannelGrabber::ChannelContainer::addChannelParam(const ito::Param& param) +{ + m_channelParams.insert(param.getName(), param); +} + +//------------------------------------------------------------------------------------- +//! constructor +AddInMultiChannelGrabber::AddInMultiChannelGrabber(const QByteArray& grabberName) : + AbstractAddInGrabber(), + d_ptr(new AddInMultiChannelGrabberPrivate()) +{ + ito::Param paramVal("name", ito::ParamBase::String | ito::ParamBase::Readonly, grabberName.data(), "GrabberName"); + paramVal.setMeta(new ito::StringMeta(ito::StringMeta::String, "General"), true); + insertParam(paramVal); - paramVal = ito::Param("pixelFormat", ito::ParamBase::String, "mono8", "pixelFormat"); - m_channelParam.insert(paramVal.getName(), paramVal); + paramVal = ito::Param("defaultChannel", ito::ParamBase::String, "", tr("indicates the default channel name, that is for instance used in plots if not otherwise stated.").toLatin1().data()); + insertParam(paramVal); - addDefaultMetaParams(); - }; + paramVal = ito::Param("channelSelector", ito::ParamBase::String, "", tr("The channel dependent parameters (like sizex, sizey, roi, pixelFormat...) are related to this channel.").toLatin1().data()); + insertParam(paramVal); - //--------------------------------------------------------------------------------- - AddInMultiChannelGrabber::ChannelContainer::ChannelContainer( - const ito::Param& roi, - const ito::Param& pixelFormat, - const ito::Param& sizex, - const ito::Param& sizey) - { - Q_ASSERT(QByteArray(roi.getName()) == "roi"); - Q_ASSERT(QByteArray(pixelFormat.getName()) == "pixelFormat"); - Q_ASSERT(QByteArray(sizex.getName()) == "sizex"); - Q_ASSERT(QByteArray(sizey.getName()) == "sizey"); - - addChannelParam(roi); - addChannelParam(pixelFormat); - addChannelParam(sizex); - addChannelParam(sizey); - addDefaultMetaParams(); - } + paramVal = ito::Param("availableChannels", ito::ParamBase::StringList | ito::ParamBase::Readonly, {}, tr("names of the channels provided by the plugin").toLatin1().data()); + insertParam(paramVal); +} - //--------------------------------------------------------------------------------- - AddInMultiChannelGrabber::ChannelContainer::ChannelContainer( - const ito::Param& roi, - const ito::Param& pixelFormat, - const ito::Param& sizex, - const ito::Param& sizey, - const ito::Param& axisOffsets, - const ito::Param& axisScales, - const ito::Param& axisDescriptions, - const ito::Param& axisUnits, - const ito::Param& valueDescription, - const ito::Param& valueUnit) - { - Q_ASSERT(QByteArray(roi.getName()) == "roi"); - Q_ASSERT(QByteArray(pixelFormat.getName()) == "pixelFormat"); - Q_ASSERT(QByteArray(sizex.getName()) == "sizex"); - Q_ASSERT(QByteArray(sizey.getName()) == "sizey"); - Q_ASSERT(QByteArray(axisOffsets.getName()) == "axisOffsets"); - Q_ASSERT(QByteArray(axisScales.getName()) == "axisScales"); - Q_ASSERT(QByteArray(axisDescriptions.getName()) == "axisDescriptions"); - Q_ASSERT(QByteArray(axisUnits.getName()) == "axisUnits"); - Q_ASSERT(QByteArray(valueDescription.getName()) == "valueDescription"); - Q_ASSERT(QByteArray(valueUnit.getName()) == "valueUnit"); - - addChannelParam(roi); - addChannelParam(pixelFormat); - addChannelParam(sizex); - addChannelParam(sizey); - addChannelParam(axisOffsets); - addChannelParam(axisScales); - addChannelParam(axisDescriptions); - addChannelParam(axisUnits); - addChannelParam(axisDescriptions); - addChannelParam(axisUnits); - addChannelParam(valueDescription); - addChannelParam(valueUnit); - } +//------------------------------------------------------------------------------------- +//! destructor +AddInMultiChannelGrabber::~AddInMultiChannelGrabber() +{ +} - //--------------------------------------------------------------------------------- - void AddInMultiChannelGrabber::ChannelContainer::addDefaultMetaParams() - { - ito::Param paramVal; - - double axisOffsets[] = { 0.0, 0.0 }; - paramVal = ito::Param("axisOffsets", ito::ParamBase::DoubleArray, 2, axisOffsets, "the offset values of the y- and x-axis of this channel image."); - paramVal.setMeta(new ito::DoubleArrayMeta(-DBL_MAX, DBL_MAX, 0.0, 2, 2, 1, "MetaInformation"), true); - addChannelParam(paramVal); - - double axisScales[] = { 1.0, 1.0 }; - paramVal = ito::Param("axisScales", ito::ParamBase::DoubleArray, 2, axisOffsets, "the scale values of the y- and x-axis of this channel image."); - paramVal.setMeta(new ito::DoubleArrayMeta(-DBL_MAX, DBL_MAX, 0.0, 2, 2, 1, "MetaInformation"), true); - addChannelParam(paramVal); - - ito::ByteArray axisUnits[] = { "", "" }; - paramVal = ito::Param( - "axisUnits", - ito::ParamBase::StringList, 2, - axisUnits, "The unit strings for the y- and x-axis of the grabber image"); - paramVal.setMeta(new ito::StringListMeta(ito::StringMeta::Wildcard, "*", 2, 2, 1, "MetaInformation"), true); - addChannelParam(paramVal); - - ito::ByteArray axisDescriptions[] = { "", "" }; - paramVal = ito::Param( - "axisDescriptions", - ito::ParamBase::StringList, 2, - axisDescriptions, - "axis description"); - paramVal.setMeta(new ito::StringListMeta(ito::StringMeta::Wildcard, "*", 2, 2, 1, "MetaInformation"), true); - addChannelParam(paramVal); - - paramVal = ito::Param( - "valueDescription", - ito::ParamBase::String, - "", - "value description"); - addChannelParam(paramVal); - - paramVal = ito::Param( - "valueUnit", ito::ParamBase::String, "", "The unit string of the values of this channel image"); - addChannelParam(paramVal); - } +//------------------------------------------------------------------------------------- +ito::RetVal AddInMultiChannelGrabber::initChannelsAndGlobalParameters( + const ChannelContainerMap& channelContainerMap, + const QString& defaultChannelName, + const QList& globalParameters /*= QList()*/) +{ + Q_D(AddInMultiChannelGrabber); - //--------------------------------------------------------------------------------- - void AddInMultiChannelGrabber::ChannelContainer::addChannelParam(const ito::Param& param) - { - m_channelParam.insert(param.getName(), param); - } + ito::RetVal retValue(ito::retOk); - //--------------------------------------------------------------------------------- - //! constructor - AddInMultiChannelGrabber::AddInMultiChannelGrabber(const QByteArray& grabberName) : - AbstractAddInGrabber(), - d_ptr(new AddInMultiChannelGrabberPrivate()) - { - ito::Param paramVal("name", ito::ParamBase::String | ito::ParamBase::Readonly, grabberName.data(), "GrabberName"); - paramVal.setMeta(new ito::StringMeta(ito::StringMeta::String, "General"), true); - insertParam(paramVal); + Q_ASSERT_X( + channelContainerMap.contains(defaultChannelName), + "initChannelsAndGlobalParameters", + "a channel with the defaultChannelName must exist"); - paramVal = ito::Param("defaultChannel", ito::ParamBase::String, "", tr("indicates the default channel name, that is for instance used in plots if not otherwise stated.").toLatin1().data()); - insertParam(paramVal); + Q_ASSERT_X(!d->m_channelParamsProxyInitialized, + "initChannelsAndGlobalParameters", + "channels and global parameters must not be initialized yet"); - paramVal = ito::Param("channelSelector", ito::ParamBase::String, "", tr("The channel dependent parameters (like sizex, sizey, roi, pixelFormat...) are related to this channel.").toLatin1().data()); - insertParam(paramVal); + Q_ASSERT_X(channelContainerMap.size() > 0, + "initChannelsAndGlobalParameters", + "at least one channel container must be given"); - paramVal = ito::Param("availableChannels", ito::ParamBase::StringList | ito::ParamBase::Readonly, {}, tr("names of the channels provided by the plugin").toLatin1().data()); - insertParam(paramVal); - } + // initialize default global parameters + m_params["channelName"].setVal(defaultChannelName.toLatin1().constData()); + m_params["channelSelector"].setVal(defaultChannelName.toLatin1().constData()); - //--------------------------------------------------------------------------------- - //! destructor - AddInMultiChannelGrabber::~AddInMultiChannelGrabber() - { - } + QList channelNames; - //--------------------------------------------------------------------------------- - ito::RetVal AddInMultiChannelGrabber::initChannelsAndGlobalParameters( - const ChannelContainerMap& channelContainerMap, - const QString& defaultChannelName, - const QList& globalParameters /*= QList()*/) + foreach(const QString & channelName, channelContainerMap.keys()) { - Q_D(AddInMultiChannelGrabber); - - ito::RetVal retValue(ito::retOk); + channelNames << ito::ByteArray(channelName.toLatin1().constData()); + } - Q_ASSERT_X( - channelContainerMap.contains(defaultChannelName), - "initChannelsAndGlobalParameters", - "a channel with the defaultChannelName must exist"); + m_params["availableChannels"].setVal(channelNames.data(), channelNames.size()); - Q_ASSERT_X(!d->m_channelParamsProxyInitialized, - "initChannelsAndGlobalParameters", - "channels and global parameters must not be initialized yet"); + m_channels = channelContainerMap; - Q_ASSERT_X(channelContainerMap.size() > 0, - "initChannelsAndGlobalParameters", - "at least one channel container must be given"); + // iterate over all channels and register their parameters as global parameter, + // however store a flag, that this is a channel parameter. - // initialize default global parameters - m_params["channelName"].setVal(defaultChannelName.toLatin1().constData()); - m_params["channelSelector"].setVal(defaultChannelName.toLatin1().constData()); + QString paramName; + ChannelContainerMapConstIterator channelIter = channelContainerMap.constBegin(); - QList channelNames; + while (channelIter != channelContainerMap.constEnd()) + { + ParamMapConstIterator channelParamIter = channelIter->m_channelParams.constBegin(); - foreach(const QString & channelName, channelContainerMap.keys()) + while (channelParamIter != channelIter->m_channelParams.constEnd()) { - channelNames << ito::ByteArray(channelName.toLatin1().constData()); - } + //iterate through channel params - m_params["availableChannels"].setVal(channelNames.data(), channelNames.size()); + paramName = channelParamIter.key(); - m_channels = channelContainerMap; - - // iterate over all channels and register their parameters as global parameter, - // however store a flag, that this is a channel parameter. - - QString paramName; - ChannelContainerMapConstIterator channelIter = channelContainerMap.constBegin(); - - while (channelIter != channelContainerMap.constEnd()) - { - ParamMapConstIterator channelParamIter = channelIter->m_channelParam.constBegin(); + if (m_params.contains(paramName)) + { + // if another channel already registered this key, it must have the same type + Q_ASSERT_X(m_params[paramName].getType() == channelParamIter->getType(), + "initChannelsAndGlobalParameters", + "The type of channel parameters of the same name must be equal."); + } + else + { + // add a deep copy of the channel parameter to m_params + m_params.insert(paramName, Param(channelParamIter.value())); + } - while (channelParamIter != channelIter->m_channelParam.constEnd()) + if (!d->m_paramChannelAvailabilityMap.contains(paramName)) + { + d->m_paramChannelAvailabilityMap[paramName] = QStringList(channelIter.key()); + } + else { - //iterate through channel params + d->m_paramChannelAvailabilityMap[paramName].append(channelIter.key()); + } - paramName = channelParamIter.key(); + channelParamIter++; + } - if (m_params.contains(paramName)) - { - // if another channel already registered this key, it must have the same type - Q_ASSERT_X(m_params[paramName].getType() == channelParamIter->getType(), - "initChannelsAndGlobalParameters", - "The type of channel parameters of the same name must be equal."); - } - else - { - // add a deep copy of the channel parameter to m_params - m_params.insert(paramName, Param(channelParamIter.value())); - } + channelIter++; + } - if (!d->m_paramChannelAvailabilityMap.contains(paramName)) - { - d->m_paramChannelAvailabilityMap[paramName] = QStringList(channelIter.key()); - } - else - { - d->m_paramChannelAvailabilityMap[paramName].append(channelIter.key()); - } + // add all global parameters to m_params, unless they exist already: error - channelParamIter++; - } + foreach(const ito::Param& p, globalParameters) + { + paramName = QLatin1String(p.getName()); + Q_ASSERT_X(!m_params.contains(paramName), + "initChannelsAndGlobalParameters", + "the globalParameters must not contain a parameter whose name is already contained in at least one channel."); + m_params[paramName] = p; + } - channelIter++; - } + d->m_channelParamsProxyInitialized = true; - // add all global parameters to m_params, unless they exist already: error + // call switchChannelSelector to synchronize the values in the channel specific parameters with + // to these of the current channel (channelSelector). + retValue += switchChannelSelector(); - foreach(const ito::Param& p, globalParameters) - { - paramName = QLatin1String(p.getName()); - Q_ASSERT_X(!m_params.contains(paramName), - "initChannelsAndGlobalParameters", - "the globalParameters must not contain a parameter whose name is already contained in at least one channel."); - m_params[paramName] = p; - } + return retValue; +} - d->m_channelParamsProxyInitialized = true; +//------------------------------------------------------------------------------- +//! sends m_image to all registered listeners. +/* +This method is continuously called from timerEvent. Also call this method from +your getVal-Method (usually with 0-timeout). The function adds axis scale and +axis unit to the dataObject. - // call switchChannelSelector to synchronize the values in the channel specific parameters with - // to these of the current channel (channelSelector). - retValue += switchChannelSelector(); +\param [in] waitMS indicates the time (in ms) that should be waiting until every + registered live image source node received m_image. 0: no wait, -1: + infinit waiting time, else time in milliseconds +\return retOk if everything was ok, retWarning if live image could not be invoked +*/ +ito::RetVal AddInMultiChannelGrabber::sendDataToListeners(int waitMS) +{ + Q_D(AddInMultiChannelGrabber); - return retValue; - } + assert(d->m_channelParamsProxyInitialized); + ito::RetVal retValue = ito::retOk; + int size = m_autoGrabbingListeners.size(); - //------------------------------------------------------------------------------- - //! sends m_image to all registered listeners. - /* - This method is continuously called from timerEvent. Also call this method from - your getVal-Method (usually with 0-timeout). The function adds axis scale and - axis unit to the dataObject. - - \param [in] waitMS indicates the time (in ms) that should be waiting until every - registered live image source node received m_image. 0: no wait, -1: - infinit waiting time, else time in milliseconds - \return retOk if everything was ok, retWarning if live image could not be invoked - */ - ito::RetVal AddInMultiChannelGrabber::sendDataToListeners(int waitMS) + if (waitMS == 0) { - Q_D(AddInMultiChannelGrabber); + auto it = m_autoGrabbingListeners.constBegin(); - assert(d->m_channelParamsProxyInitialized); - ito::RetVal retValue = ito::retOk; - int size = m_autoGrabbingListeners.size(); - - if (waitMS == 0) + while (it != m_autoGrabbingListeners.constEnd()) { - QMultiMap::iterator it = m_autoGrabbingListeners.begin(); + const ChannelContainer& container = m_channels[it.key().toLatin1().data()]; + QSharedPointer pDObj(new ito::DataObject(container.m_data)); - while (it != m_autoGrabbingListeners.end()) + if (!QMetaObject::invokeMethod(it.value(), "setSource", Q_ARG(QSharedPointer, pDObj), Q_ARG(ItomSharedSemaphore*, nullptr))) { - const ChannelContainer& container = m_channels[it.key().toLatin1().data()]; - QSharedPointer pDObj(new ito::DataObject(container.m_data)); - - if (!QMetaObject::invokeMethod(it.value(), "setSource", Q_ARG(QSharedPointer, pDObj), Q_ARG(ItomSharedSemaphore*, NULL))) - { - retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); - } - - it++; + retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); } + + it++; } - else if (m_autoGrabbingListeners.size() > 0) - { - ItomSharedSemaphore** waitConds = new ItomSharedSemaphore * [size]; - int i = 0; - QMultiMap::iterator it = m_autoGrabbingListeners.begin(); + } + else if (m_autoGrabbingListeners.size() > 0) + { + ItomSharedSemaphore** waitConds = new ItomSharedSemaphore*[size]; + int i = 0; + auto it = m_autoGrabbingListeners.constBegin(); - while (it != m_autoGrabbingListeners.end()) + while (it != m_autoGrabbingListeners.constEnd()) + { + waitConds[i] = new ItomSharedSemaphore(); + // \todo On Linux a crash occurs here when closing the liveImage ... maybe the same reason why we get an error message on windows? + if (it.value()) { - waitConds[i] = new ItomSharedSemaphore(); - // \todo On Linux a crash occurs here when closing the liveImage ... maybe the same reason why we get an error message on windows? - if (it.value()) + if (!QMetaObject::invokeMethod(it.value(), "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[it.key().toLatin1().data()].m_data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) { - if (!QMetaObject::invokeMethod(it.value(), "setSource", Q_ARG(QSharedPointer, QSharedPointer(new ito::DataObject(m_channels[it.key().toLatin1().data()].m_data))), Q_ARG(ItomSharedSemaphore*, waitConds[i]))) - { - retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); - } + retValue += ito::RetVal(ito::retWarning, 1001, tr("slot 'setSource' of live source node could not be invoked").toLatin1().data()); } - it++; - i++; } - for (i = 0; i < size; i++) - { - if (!waitConds[i]->wait(waitMS)) - { - qDebug() << "timeout in number: " << i << "number of items: " << size; - } + it++; + i++; + } - waitConds[i]->deleteSemaphore(); - waitConds[i] = nullptr; + for (i = 0; i < size; i++) + { + if (!waitConds[i]->wait(waitMS)) + { + qDebug() << "timeout in number: " << i << "number of items: " << size; } - DELETE_AND_SET_NULL_ARRAY(waitConds); + waitConds[i]->deleteSemaphore(); + waitConds[i] = nullptr; } - - return retValue; + DELETE_AND_SET_NULL_ARRAY(waitConds); } - //--------------------------------------------------------------------------------- - ito::RetVal ito::AddInMultiChannelGrabber::checkData(QMap& externalDataObject) - { - Q_D(AddInMultiChannelGrabber); - - assert(d->m_channelParamsProxyInitialized); - ito::RetVal retVal(ito::retOk); - unsigned int futureType = 0; - bool ok; - ito::float64 axisOffset[] = { 0.0, 0.0 }; - ito::float64 axisScale[] = { 1.0, 1.0 }; - QString axisUnit[] = { "", "" }; - QString axisDescription[] = { "", "" }; - QString valueDescription = ""; - QString valueUnit = ""; - - QMap::const_iterator it = externalDataObject.constBegin(); - while (it != externalDataObject.constEnd()) - { - // only if exists in plugin - if (m_channels[it.key()].m_channelParam.contains("axisOffset")) - { - axisOffset[0] = m_channels[it.key()].m_channelParam["axisOffset"].getVal()[0]; - axisOffset[1] = - m_channels[it.key()].m_channelParam["axisOffset"].getVal()[1]; - } - // only if exists in plugin - if (m_channels[it.key()].m_channelParam.contains("axisScale")) - { - axisScale[0] = - m_channels[it.key()].m_channelParam["axisScale"].getVal()[0]; - axisScale[1] = - m_channels[it.key()].m_channelParam["axisScale"].getVal()[1]; - } + return retValue; +} - // only if exists in plugin - if (m_channels[it.key()].m_channelParam.contains("axisDescription")) - { - axisDescription[0] = QString::fromUtf8(m_channels[it.key()] - .m_channelParam["axisDescription"] - .getVal()[0] - .data()); - axisDescription[1] = QString::fromUtf8(m_channels[it.key()] - .m_channelParam["axisDescription"] - .getVal()[1] - .data()); - } +//------------------------------------------------------------------------------------- +ito::RetVal AddInMultiChannelGrabber::checkData(ito::DataObject* externalDataObject /*= nullptr*/) +{ + QString defaultChannel = QLatin1String(m_params["defaultChannel"].getVal()); + return checkData(defaultChannel, externalDataObject); +} - // only if exists in plugin - if (m_channels[it.key()].m_channelParam.contains("axisUnit")) - { - axisUnit[0] = QString::fromUtf8(m_channels[it.key()] - .m_channelParam["axisUnit"] - .getVal()[0] - .data()); - axisUnit[1] = QString::fromUtf8(m_channels[it.key()] - .m_channelParam["axisUnit"] - .getVal()[1] - .data()); - } +//------------------------------------------------------------------------------------- +ito::RetVal AddInMultiChannelGrabber::checkData(const QString& channelName, ito::DataObject* externalDataObject /*= nullptr*/) +{ + Q_D(AddInMultiChannelGrabber); - // only if exists in plugin - if (m_channels[it.key()].m_channelParam.contains("valueDescription")) - { - valueDescription = QString::fromLatin1( - m_channels[it.key()].m_channelParam["valueDescription"].getVal()); - } + assert(d->m_channelParamsProxyInitialized); + ito::RetVal retVal(ito::retOk); - // only if exists in plugin - if (m_channels[it.key()].m_channelParam.contains("valueUnit")) - { - valueUnit = QString::fromLatin1( - m_channels[it.key()].m_channelParam["valueUnit"].getVal()); - } + if (!m_channels.contains(channelName)) + { + return ito::RetVal(ito::retError, 0, tr("channel name does not exist").toLatin1().data()); + } - futureType = itoDataTypeFromPixelFormat(m_channels[it.key()].m_channelParam["pixelFormat"].getVal(), &ok); + ChannelContainer& channel = getCurrentDefaultChannel(); - if (ok) - { - int* roi = m_channels[it.key()].m_channelParam["roi"].getVal(); - int width = roi[2]; - int height = roi[3]; - if (it.value()->getDims() == 0) - { - *(it.value()) = ito::DataObject(height, width, futureType); - - m_channels[it.key()].m_data.setAxisScale(0, axisScale[0]); - m_channels[it.key()].m_data.setAxisScale(1, axisScale[1]); - m_channels[it.key()].m_data.setAxisOffset(0, axisOffset[0]); - m_channels[it.key()].m_data.setAxisOffset(1, axisOffset[1]); - m_channels[it.key()].m_data.setAxisDescription( - 0, axisDescription[0].toLatin1().data()); - m_channels[it.key()].m_data.setAxisDescription( - 1, axisDescription[1].toLatin1().data()); - m_channels[it.key()].m_data.setAxisUnit(0, axisUnit[0].toLatin1().data()); - m_channels[it.key()].m_data.setAxisUnit(1, axisUnit[1].toLatin1().data()); - m_channels[it.key()].m_data.setValueDescription( - valueDescription.toLatin1().data()); - m_channels[it.key()].m_data.setValueUnit(valueUnit.toLatin1().data()); - } - else if (it.value()->calcNumMats() != 1) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject for channel %1 is invalid. Object has more or less than 1 plane. It must be of right size and type or an uninitilized image.").arg(it.key()).toLatin1().data()); - } - else if (it.value()->getSize(it.value()->getDims() - 2) != height || it.value()->getSize(it.value()->getDims() - 1) != width || it.value()->getType() != futureType) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject for channel %1 is invalid. Object must be of right size and type or an uninitilized image.").arg(it.key()).toLatin1().data()); - } - } - ++it; - } - return retVal; - } + const int futureHeight = channel.m_channelParams["sizey"].getVal(); + const int futureWidth = channel.m_channelParams["sizex"].getVal(); + bool futureTypeOk; + int futureType = itoDataTypeFromPixelFormat(channel.m_channelParams["pixelFormat"].getVal(), &futureTypeOk); - //--------------------------------------------------------------------------------- - ito::RetVal ito::AddInMultiChannelGrabber::checkData(ito::DataObject* externalDataObject) + if (!futureTypeOk) { - Q_D(AddInMultiChannelGrabber); - - assert(d->m_channelParamsProxyInitialized); - ito::RetVal retVal(ito::retOk); - bool ok; - ito::float64 axisOffset[] = { 0.0, 0.0 }; - ito::float64 axisScale[] = { 1.0, 1.0 }; - QString axisUnit[] = { "", "" }; - QString axisDescription[] = { "", "" }; - QString valueDescription = ""; - QString valueUnit = ""; - unsigned int futureType; - - if (!externalDataObject) - { - QMutableMapIterator it(m_channels); - while (it.hasNext()) { - it.next(); + return ito::RetVal(ito::retError, 0, tr("unsupported or invalid pixelFormat").toLatin1().data()); + } - // only if exists in plugin - if (m_channels[it.key()].m_channelParam.contains("axisOffset")) - { - axisOffset[0] = m_channels[it.key()] - .m_channelParam["axisOffset"] - .getVal()[0]; - axisOffset[1] = m_channels[it.key()] - .m_channelParam["axisOffset"] - .getVal()[1]; - } + ito::float64 axisOffset[] = { + channel.m_channelParams["axisOffset"].getVal()[0], + channel.m_channelParams["axisOffset"].getVal()[1] + }; - // only if exists in plugin - if (m_channels[it.key()].m_channelParam.contains("axisScale")) - { - axisScale[0] = - m_channels[it.key()].m_channelParam["axisScale"].getVal()[0]; - axisScale[1] = - m_channels[it.key()].m_channelParam["axisScale"].getVal()[1]; - } + ito::float64 axisScale[] = { + channel.m_channelParams["axisScale"].getVal()[0], + channel.m_channelParams["axisScale"].getVal()[1] + }; - // only if exists in plugin - if (m_channels[it.key()].m_channelParam.contains("axisDescription")) - { - axisDescription[0] = QString::fromUtf8(m_channels[it.key()] - .m_channelParam["axisDescription"] - .getVal()[0] - .data()); - axisDescription[1] = QString::fromUtf8(m_channels[it.key()] - .m_channelParam["axisDescription"] - .getVal()[1] - .data()); - } + ito::ByteArray axisUnit[] = { + channel.m_channelParams["axisUnit"].getVal()[0], + channel.m_channelParams["axisUnit"].getVal()[1] + }; - // only if exists in plugin - if (m_channels[it.key()].m_channelParam.contains("axisUnit")) - { - axisUnit[0] = QString::fromUtf8(m_channels[it.key()] - .m_channelParam["axisUnit"] - .getVal()[0] - .data()); - axisUnit[1] = QString::fromUtf8(m_channels[it.key()] - .m_channelParam["axisUnit"] - .getVal()[1] - .data()); - } + ito::ByteArray axisDescription[] = { + channel.m_channelParams["axisDescription"].getVal()[0], + channel.m_channelParams["axisDescription"].getVal()[1] + }; - // only if exists in plugin - if (m_channels[it.key()].m_channelParam.contains("valueDescription")) - { - valueDescription = QString::fromLatin1( - m_channels[it.key()].m_channelParam["valueDescription"].getVal()); - } + ito::ByteArray valueDescription = channel.m_channelParams["valueDescription"].getVal(); + ito::ByteArray valueUnit = channel.m_channelParams["valueUnit"].getVal(); - // only if exists in plugin - if (m_channels[it.key()].m_channelParam.contains("valueUnit")) - { - valueUnit = QString::fromLatin1( - m_channels[it.key()].m_channelParam["valueUnit"].getVal()); - } + if (!externalDataObject) + { + if (channel.m_data.getDims() < 2 || channel.m_data.getSize(0) != futureHeight || + channel.m_data.getSize(1) != futureWidth || channel.m_data.getType() != futureType) + { + channel.m_data = ito::DataObject(futureHeight, futureWidth, futureType); + } - futureType = itoDataTypeFromPixelFormat(it.value().m_channelParam["pixelFormat"].getVal(), &ok); - if (ok) - { - int* roi = it.value().m_channelParam["roi"].getVal(); - int height = roi[3]; - int width = roi[2]; - if (it.value().m_data.getDims() < 2 || it.value().m_data.getSize(0) != height || it.value().m_data.getSize(1) != width || it.value().m_data.getType() != futureType) - { - it.value().m_data = ito::DataObject(height, width, futureType); - it.value().m_data.setAxisScale(0, axisScale[0]); - it.value().m_data.setAxisScale(1, axisScale[1]); - it.value().m_data.setAxisOffset(0, axisOffset[0]); - it.value().m_data.setAxisOffset(1, axisOffset[1]); - it.value().m_data.setAxisDescription(0, axisDescription[0].toLatin1().data()); - it.value().m_data.setAxisDescription(1, axisDescription[1].toLatin1().data()); - it.value().m_data.setAxisUnit(0, axisUnit[0].toLatin1().data()); - it.value().m_data.setAxisUnit(1, axisUnit[1].toLatin1().data()); - it.value().m_data.setValueDescription(valueDescription.toLatin1().data()); - it.value().m_data.setValueUnit(valueUnit.toLatin1().data()); - } - } - else - { - retVal += ito::RetVal(ito::retError, 0, tr("invalid pixel format").toLatin1().data()); - } + channel.m_data.setAxisScale(0, axisScale[0]); + channel.m_data.setAxisScale(1, axisScale[1]); + channel.m_data.setAxisOffset(0, axisOffset[0]); + channel.m_data.setAxisOffset(1, axisOffset[1]); + channel.m_data.setAxisDescription(0, axisDescription[0].data()); + channel.m_data.setAxisDescription(1, axisDescription[1].data()); + channel.m_data.setAxisUnit(0, axisUnit[0].data()); + channel.m_data.setAxisUnit(1, axisUnit[1].data()); + channel.m_data.setValueDescription(valueDescription.data()); + channel.m_data.setValueUnit(valueUnit.data()); + } + else + { + int dims = externalDataObject->getDims(); - } + if (dims == 0) + { + *externalDataObject = ito::DataObject(futureHeight, futureWidth, futureType); + externalDataObject->setAxisScale(0, axisScale[0]); + externalDataObject->setAxisScale(1, axisScale[1]); + externalDataObject->setAxisOffset(0, axisOffset[0]); + externalDataObject->setAxisOffset(1, axisOffset[1]); + externalDataObject->setAxisDescription(0, axisDescription[0].data()); + externalDataObject->setAxisDescription(1, axisDescription[1].data()); + externalDataObject->setAxisUnit(0, axisUnit[0].data()); + externalDataObject->setAxisUnit(1, axisUnit[1].data()); + externalDataObject->setValueDescription(valueDescription.data()); + externalDataObject->setValueUnit(valueUnit.data()); } - else + else if (externalDataObject->calcNumMats() != 1) { - const char* channel = m_params["defaultChannel"].getVal(); - - if (m_channels.contains(channel)) - { - futureType = itoDataTypeFromPixelFormat(m_channels[channel].m_channelParam["pixelFormat"].getVal(), &ok); - if (ok) - { - int* roi = m_channels[channel].m_channelParam["roi"].getVal(); - int width = roi[2]; - int height = roi[3]; - if (externalDataObject->getDims() == 0) - { - *externalDataObject = ito::DataObject(height, width, futureType); - } - else if (externalDataObject->calcNumMats() != 1) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object has more or less than 1 plane. It must be of right size and type or an uninitilized image.").toLatin1().data()); - } - else if (externalDataObject->getSize(externalDataObject->getDims() - 2) != height || externalDataObject->getSize(externalDataObject->getDims() - 1) != width || externalDataObject->getType() != futureType) - { - return ito::RetVal(ito::retError, 0, tr("Error during check data, external dataObject invalid. Object must be of right size and type or an uninitilized image.").toLatin1().data()); - } - } - else - { - retVal += ito::RetVal(ito::retError, 0, tr("invalid pixel format").toLatin1().data()); - } - } + return ito::RetVal( + ito::retError, 0, + tr("Error during check data, external dataObject invalid. Object has more or less " + "than 1 plane. It must be of right size and type or an uninitilized image.") + .toLatin1() + .data()); + } + else if (externalDataObject->getSize(dims - 2) != (unsigned int)futureHeight || + externalDataObject->getSize(dims - 1) != (unsigned int)futureWidth || + externalDataObject->getType() != futureType) + { + return ito::RetVal( + ito::retError, 0, + tr("Error during check data, external dataObject invalid. Object must be of right " + "size and type or an uninitilized image.") + .toLatin1() + .data()); } - return retVal; } - //--------------------------------------------------------------------------------- - void AddInMultiChannelGrabber::addChannel(QString name) + return ito::retOk; +} + +//------------------------------------------------------------------------------------- +void AddInMultiChannelGrabber::addChannel(QString name) +{ + ChannelContainer container( + m_params["roi"], + m_params["pixelFormat"], + m_params["sizex"], + m_params["sizey"], + m_params["axisOffset"], + m_params["axisScale"], + m_params["axisDescription"], + m_params["axisUnit"], + m_params["valueDescription"], + m_params["valueUnit"]); + m_channels[name] = container; + const ByteArray* channelList = m_params["availableChannels"].getVal(); + int len = 0; + m_params["availableChannels"].getVal(len); + + QVector qVectorList(len, *channelList); + qVectorList.append(ByteArray(name.toLatin1().data())); + m_params["availableChannels"].setVal(qVectorList.data(), qVectorList.length()); +} + +//--------------------------------------------------------------------------------- +ito::RetVal AddInMultiChannelGrabber::adaptDefaultChannelParams() +{ + ito::RetVal retVal(ito::retOk); + char* channel = m_params["defaultChannel"].getVal(); + return retVal; +} + +//--------------------------------------------------------------------------------- +ito::RetVal AddInMultiChannelGrabber::getParam(QSharedPointer val, ItomSharedSemaphore* waitCond) +{ + Q_D(AddInMultiChannelGrabber); + assert(d->m_channelParamsProxyInitialized); + + ItomSharedSemaphoreLocker locker(waitCond); + ito::RetVal retValue; + QString key; + bool hasIndex = false; + int index; + QString suffix; + ParamMapIterator it; + bool ok = false; + + //parse the given parameter-name (if you support indexed or suffix-based parameters) + retValue += apiParseParamName(val->getName(), key, hasIndex, index, suffix); + + if (!retValue.containsError()) { - ChannelContainer container( - m_params["roi"], - m_params["pixelFormat"], - m_params["sizex"], - m_params["sizey"], - m_params["axisOffset"], - m_params["axisScale"], - m_params["axisDescription"], - m_params["axisUnit"], - m_params["valueDescription"], - m_params["valueUnit"]); - m_channels[name] = container; - const ByteArray* channelList = m_params["availableChannels"].getVal(); - int len = 0; - m_params["availableChannels"].getVal(len); - - QVector qVectorList(len, *channelList); - qVectorList.append(ByteArray(name.toLatin1().data())); - m_params["availableChannels"].setVal(qVectorList.data(), qVectorList.length()); + retValue += apiGetParamFromMapByKey(m_params, key, it, false); } - //--------------------------------------------------------------------------------- - ito::RetVal AddInMultiChannelGrabber::adaptDefaultChannelParams() + if (!retValue.containsError()) { - ito::RetVal retVal(ito::retOk); - char* channel = m_params["defaultChannel"].getVal(); - return retVal; + retValue += getParameter(val, it, key, suffix, index, hasIndex, ok); } - //--------------------------------------------------------------------------------- - ito::RetVal AddInMultiChannelGrabber::getParam(QSharedPointer val, ItomSharedSemaphore* waitCond) + if (!retValue.containsError() && !ok) { - Q_D(AddInMultiChannelGrabber); - assert(d->m_channelParamsProxyInitialized); - - ItomSharedSemaphoreLocker locker(waitCond); - ito::RetVal retValue; - QString key; - bool hasIndex = false; - int index; - QString suffix; - ParamMapIterator it; - bool ok = false; - - //parse the given parameter-name (if you support indexed or suffix-based parameters) - retValue += apiParseParamName(val->getName(), key, hasIndex, index, suffix); - - if (!retValue.containsError()) - { - retValue += apiGetParamFromMapByKey(m_params, key, it, false); - } + //the parameter was not processed by the plugin, so it is done here + *val = it.value(); + } - if (!retValue.containsError()) - { - retValue += getParameter(val, it, key, suffix, index, hasIndex, ok); - } + if (waitCond) + { + waitCond->returnValue = retValue; + waitCond->release(); + } - if (!retValue.containsError() && !ok) - { - //the parameter was not processed by the plugin, so it is done here - *val = it.value(); - } + return retValue; +} - if (waitCond) - { - waitCond->returnValue = retValue; - waitCond->release(); - } +//--------------------------------------------------------------------------------- +ito::RetVal AddInMultiChannelGrabber::changeChannelForListener(QObject* listener, const QString& newChannel) +{ + Q_D(AddInMultiChannelGrabber); - return retValue; - } + assert(d->m_channelParamsProxyInitialized); + ito::RetVal retValue(ito::retOk); + bool found = false; - //--------------------------------------------------------------------------------- - ito::RetVal AddInMultiChannelGrabber::changeChannelForListeners(const QString& newChannel, QObject* obj) + if (listener) { - Q_D(AddInMultiChannelGrabber); - - assert(d->m_channelParamsProxyInitialized); - ito::RetVal retValue(ito::retOk); - bool found = false; + auto it = m_autoGrabbingListeners.begin(); - if (obj) + while (it != m_autoGrabbingListeners.end()) { - QMultiMap::iterator i = m_autoGrabbingListeners.begin(); - - while (i != m_autoGrabbingListeners.end()) + if (it.value() == listener) { - if (i.value() == obj) - { - found = true; - - if (i.key() != newChannel) - { - // the channel has changed - m_autoGrabbingListeners.remove(i.key(), obj); - m_autoGrabbingListeners.insert(newChannel, obj); - } + found = true; - break; + if (it.key() != newChannel) + { + // the channel has changed + m_autoGrabbingListeners.erase(it); + m_autoGrabbingListeners.insert(newChannel, listener); } - } - if (!found) - { - retValue += ito::RetVal(ito::retError, 0, tr("Could not find plot in m_autoGrabbingListeners").toLatin1().data()); + break; } + + it++; } - else + + if (!found) { - retValue += ito::RetVal(ito::retError, 0, "QObject not callable."); + retValue += ito::RetVal(ito::retError, 0, tr("The given listener (e.g. plot) must be registered first.").toLatin1().data()); } - return retValue; } - - //------------------------------------------------------------------------------- - //! Sets a new value to a parameter. - /*! - This function parses the given parameter and calls setParameter. If the bool - parameter ok in the setParameter (to be implemented in the individual plugins) - function returns false, it gets assumed that the plugin didn't process the - parameter. In this case the value of the parameter gets copied here. - If the parameter name is "roi" sizex and sizey gets updated by setParam. If the - key of the parameter is "defaultChannel" the function "switchDefaultChannel" gets called. - Both happens also if the "ok" value of setParameter is true. - "applyParamsToChannelParams" is called to synchronize the parameters of the - channel container follwed by a call of checkData. - - \param [in] val is a QSharedPOinter of type ParamBase containing the paremeter to be set. - \param [in] waitCond - \return retOk if everything was ok, else retError - */ - ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer val, ItomSharedSemaphore* waitCond/* = nullptr*/) + else { - Q_D(AddInMultiChannelGrabber); - assert(d->m_channelParamsProxyInitialized); - - ItomSharedSemaphoreLocker locker(waitCond); - ito::RetVal retValue; - bool hasIndex; - bool ok = false; - int index; - QString suffix; - QString key; - QStringList paramUpdateList; - ParamMapIterator it; - - int cntStartedDevices = grabberStartedCount(); + retValue += ito::RetVal(ito::retError, 0, "QObject not callable."); + } - retValue += apiParseParamName(val->getName(), key, hasIndex, index, suffix); - retValue += apiGetParamFromMapByKey(m_params, key, it, true); - retValue += apiValidateParam(*it, *val, false, true); + return retValue; +} + +//------------------------------------------------------------------------------- +//! Sets a new value to a parameter. +/*! + This function parses the given parameter and calls setParameter. If the bool + parameter ok in the setParameter (to be implemented in the individual plugins) + function returns false, it gets assumed that the plugin didn't process the + parameter. In this case the value of the parameter gets copied here. + If the parameter name is "roi" sizex and sizey gets updated by setParam. If the + key of the parameter is "defaultChannel" the function "switchDefaultChannel" gets called. + Both happens also if the "ok" value of setParameter is true. + "applyParamsToChannelParams" is called to synchronize the parameters of the + channel container follwed by a call of checkData. + +\param [in] val is a QSharedPOinter of type ParamBase containing the paremeter to be set. +\param [in] waitCond +\return retOk if everything was ok, else retError +*/ +ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer val, ItomSharedSemaphore* waitCond/* = nullptr*/) +{ + Q_D(AddInMultiChannelGrabber); + assert(d->m_channelParamsProxyInitialized); + + ItomSharedSemaphoreLocker locker(waitCond); + ito::RetVal retValue; + bool hasIndex; + bool ok = false; + int index; + QString suffix; + QString key; + QStringList paramUpdateList; + ParamMapIterator it; + + int cntStartedDevices = grabberStartedCount(); + + retValue += apiParseParamName(val->getName(), key, hasIndex, index, suffix); + retValue += apiGetParamFromMapByKey(m_params, key, it, true); + retValue += apiValidateParam(*it, *val, false, true); + + if (!retValue.containsError()) + { + retValue += setParameter(val, it, suffix, key, index, hasIndex, ok, paramUpdateList); - if (!retValue.containsError()) + if (ok && !paramUpdateList.contains(val->getName())) { - retValue += setParameter(val, it, suffix, key, index, hasIndex, ok, paramUpdateList); - - if (ok && !paramUpdateList.contains(val->getName())) - { - paramUpdateList << val->getName(); - } + paramUpdateList << val->getName(); + } - if (!retValue.containsError() && !ok) + if (!retValue.containsError() && !ok) + { + if (!retValue.containsError()) { - if (!retValue.containsError()) + if (key != "defaultChannel") { - if (key != "defaultChannel") + retValue += it->copyValueFrom(&(*val)); + paramUpdateList << val->getName(); + } + else + { + if (m_channels.find(val->getVal()) != m_channels.end()) { retValue += it->copyValueFrom(&(*val)); paramUpdateList << val->getName(); } else { - if (m_channels.find(val->getVal()) != m_channels.end()) - { - retValue += it->copyValueFrom(&(*val)); - paramUpdateList << val->getName(); - } - else - { - retValue += ito::RetVal(ito::retError, 0, tr("could not switch to channel %1. The channel is unknown.").arg(val->getVal()).toLatin1().data()); - } + retValue += ito::RetVal(ito::retError, 0, tr("could not switch to channel %1. The channel is unknown.").arg(val->getVal()).toLatin1().data()); } } } + } - if (!retValue.containsError()) + if (!retValue.containsError()) + { + if (key == "roi" || paramUpdateList.contains("roi")) { - if (key == "roi" || paramUpdateList.contains("roi")) - { - updateSizeXY(); - paramUpdateList << "sizex" << "sizey"; - } - if (key == "defaultChannel") - { - retValue += switchChannelSelector(); - } - retValue += applyParamsToChannelParams(paramUpdateList); - retValue += checkData(); + updateSizeXY(); + paramUpdateList << "sizex" << "sizey"; } - - if (!retValue.containsError()) + if (key == "defaultChannel") { - emit parametersChanged(m_params); + retValue += switchChannelSelector(); } + retValue += applyParamsToChannelParams(paramUpdateList); + retValue += checkData(); } - if (cntStartedDevices < grabberStartedCount()) + if (!retValue.containsError()) { - if (cntStartedDevices != 0) - { - retValue += startDevice(nullptr); - setGrabberStarted(cntStartedDevices); - } + emit parametersChanged(m_params); } + } - if (waitCond) + if (cntStartedDevices < grabberStartedCount()) + { + if (cntStartedDevices != 0) { - waitCond->returnValue = retValue; - waitCond->release(); + retValue += startDevice(nullptr); + setGrabberStarted(cntStartedDevices); } - return retValue; } - //------------------------------------------------------------------------------- - //! synchronizes m_params with the params of default channel container - /*! - This method synchronizes the parameters from the current selected channel container - with m_params. Call this function after changing the defaultChannel parameter. - Parameters which are not available for the current default channel are set to readonly - - \return retOk if everything was ok, else retError - */ - ito::RetVal AddInMultiChannelGrabber::switchChannelSelector() + if (waitCond) { - Q_D(AddInMultiChannelGrabber); + waitCond->returnValue = retValue; + waitCond->release(); + } + return retValue; +} + +//------------------------------------------------------------------------------- +//! synchronizes m_params with the params of default channel container +/*! +This method synchronizes the parameters from the current selected channel container +with m_params. Call this function after changing the defaultChannel parameter. +Parameters which are not available for the current default channel are set to readonly + +\return retOk if everything was ok, else retError +*/ +ito::RetVal AddInMultiChannelGrabber::switchChannelSelector() +{ + Q_D(AddInMultiChannelGrabber); - assert(d->m_channelParamsProxyInitialized); - ito::RetVal retValue(ito::retOk); - ito::uint32 flag = 0; - QString selectedChannel = QLatin1String(m_params["channelSelector"].getVal()); + assert(d->m_channelParamsProxyInitialized); + ito::RetVal retValue(ito::retOk); + ito::uint32 flag = 0; + QString selectedChannel = QLatin1String(m_params["channelSelector"].getVal()); - if (m_channels.contains(selectedChannel)) - { - const auto& selChannel = m_channels[selectedChannel]; - auto paramsInChannelIter = d->m_paramChannelAvailabilityMap.constBegin(); + if (m_channels.contains(selectedChannel)) + { + const auto& selChannel = m_channels[selectedChannel]; + auto paramsInChannelIter = d->m_paramChannelAvailabilityMap.constBegin(); - while (paramsInChannelIter != d->m_paramChannelAvailabilityMap.constEnd()) + while (paramsInChannelIter != d->m_paramChannelAvailabilityMap.constEnd()) + { + if (paramsInChannelIter->contains(selectedChannel)) { - if (paramsInChannelIter->contains(selectedChannel)) - { - // this parameters is contained in the selected channel. Copy its value and flags - // from the channel to m_params - const ito::Param p = selChannel.m_channelParam[paramsInChannelIter.key()]; - m_params[paramsInChannelIter.key()].copyValueFrom(&p); - m_params[paramsInChannelIter.key()].setFlags(selChannel.m_channelParam[paramsInChannelIter.key()].getFlags()); - } - - paramsInChannelIter++; + // this parameters is contained in the selected channel. Copy its value and flags + // from the channel to m_params + const ito::Param p = selChannel.m_channelParams[paramsInChannelIter.key()]; + m_params[paramsInChannelIter.key()].copyValueFrom(&p); + m_params[paramsInChannelIter.key()].setFlags(selChannel.m_channelParams[paramsInChannelIter.key()].getFlags()); } + + paramsInChannelIter++; } - else - { - retValue += ito::RetVal( - ito::retError, - 0, - tr("could not switch to channel %1. The channel is not registered.").arg(selectedChannel).toLatin1().data() - ); - } + } + else + { + retValue += ito::RetVal( + ito::retError, + 0, + tr("could not switch to channel %1. The channel is not registered.").arg(selectedChannel).toLatin1().data() + ); + } - emit parametersChanged(m_params); + emit parametersChanged(m_params); - return retValue; - } + return retValue; +} - ////------------------------------------------------------------------------------- - ////! copies value m_params to the channel params of the current default channel - ///*! - //This method copies params of m_params to the params of the channel container if the param is contained in the channel container . This function is usally called after setParam to apply the changed entries of m_params to the corresponding channel container. - //If a parameter is not found in the channel container nothing happens. +//------------------------------------------------------------------------------- +//! copies value m_params to the channel params of the current default channel +/*! +This method copies params of m_params to the params of the channel container if the param is contained in the channel container . This function is usally called after setParam to apply the changed entries of m_params to the corresponding channel container. +If a parameter is not found in the channel container nothing happens. - //\param [in] keyList indicates which params are copied. If the List is empty all Parameters of the current channel are updated. - //\return retOk if everything was ok, else retError - //*/ - ito::RetVal AddInMultiChannelGrabber::applyParamsToChannelParams(const QStringList& keyList) - { - Q_D(AddInMultiChannelGrabber); +\param [in] keyList indicates which params are copied. If the List is empty all Parameters of the current channel are updated. +\return retOk if everything was ok, else retError +*/ +ito::RetVal AddInMultiChannelGrabber::applyParamsToChannelParams(const QStringList& keyList) +{ + Q_D(AddInMultiChannelGrabber); - assert(d->m_channelParamsProxyInitialized); - ito::RetVal retVal(ito::retOk); - QString channelSelector = QLatin1String(m_params["channelSelector"].getVal()); + assert(d->m_channelParamsProxyInitialized); + ito::RetVal retVal(ito::retOk); + QString channelSelector = QLatin1String(m_params["channelSelector"].getVal()); - if (!keyList.isEmpty()) + if (!keyList.isEmpty()) + { + if (m_channels.contains(channelSelector)) { - if (m_channels.contains(channelSelector)) + QString tmp; + foreach(tmp, keyList) { - QString tmp; - foreach(tmp, keyList) + if (m_channels[channelSelector].m_channelParams.contains(tmp)) { - if (m_channels[channelSelector].m_channelParam.contains(tmp)) + if (m_params.contains(tmp)) + { + m_channels[channelSelector].m_channelParams[tmp] = m_params[tmp]; + } + else { - if (m_params.contains(tmp)) - { - m_channels[channelSelector].m_channelParam[tmp] = m_params[tmp]; - } - else - { - retVal = ito::RetVal(ito::retError, 0, tr("unknown parameter %1 in m_params").arg(tmp).toLatin1().data()); - } + retVal = ito::RetVal(ito::retError, 0, tr("unknown parameter %1 in m_params").arg(tmp).toLatin1().data()); } } } - - else - { - retVal = ito::RetVal(ito::retError, 0, tr("unknown channel %1").arg(channelSelector).toLatin1().data()); - } } + else { - QMapIterator it(m_channels[m_params["channelSelector"].getVal()].m_channelParam); - - while (it.hasNext()) - { - it.next(); - const_cast(it.value()) = m_params[it.key()]; - } + retVal = ito::RetVal(ito::retError, 0, tr("unknown channel %1").arg(channelSelector).toLatin1().data()); } + } + else + { + QMapIterator it(m_channels[m_params["channelSelector"].getVal()].m_channelParams); - return retVal; + while (it.hasNext()) + { + it.next(); + const_cast(it.value()) = m_params[it.key()]; + } } - ////------------------------------------------------------------------------------- - ////! updates sizex and sizey - ///*! - //Call this function to update sizex and sizey. If the roi is changed via setParam this function will be called automatically. - //Note: Do not forget to apply the changes to the channel parameters by calling applyParamsToChannelParams after calling this function. + return retVal; +} - //\return retOk if everything was ok, else retError - //*/ - void AddInMultiChannelGrabber::updateSizeXY() - { - Q_D(AddInMultiChannelGrabber); - - assert(d->m_channelParamsProxyInitialized); - const int* roi = m_params["roi"].getVal(); - int height = roi[3]; - int width = roi[2]; - m_params["sizex"].setVal(width); - m_params["sizey"].setVal(height); - } +//------------------------------------------------------------------------------- +//! updates sizex and sizey +/*! +Call this function to update sizex and sizey. If the roi is changed via setParam this function will be called automatically. +Note: Do not forget to apply the changes to the channel parameters by calling applyParamsToChannelParams after calling this function. - //--------------------------------------------------------------------------------- - ito::RetVal AddInMultiChannelGrabber::setParamMeta(const QByteArray& paramName, ito::ParamMeta* meta, bool takeOwnerShip, const QList& channelList/* = QList()*/) - { - Q_D(AddInMultiChannelGrabber); +\return retOk if everything was ok, else retError +*/ +void AddInMultiChannelGrabber::updateSizeXY() +{ + Q_D(AddInMultiChannelGrabber); + + assert(d->m_channelParamsProxyInitialized); + const int* roi = m_params["roi"].getVal(); + int height = roi[3]; + int width = roi[2]; + m_params["sizex"].setVal(width); + m_params["sizey"].setVal(height); +} + +//--------------------------------------------------------------------------------- +ito::RetVal AddInMultiChannelGrabber::setParamMeta(const QByteArray& paramName, ito::ParamMeta* meta, bool takeOwnerShip, const QList& channelList/* = QList()*/) +{ + Q_D(AddInMultiChannelGrabber); - assert(d->m_channelParamsProxyInitialized); - ito::RetVal retValue(ito::retOk); - if (d->m_paramChannelAvailabilityMap.contains(paramName) && m_params.contains(paramName)) + assert(d->m_channelParamsProxyInitialized); + ito::RetVal retValue(ito::retOk); + if (d->m_paramChannelAvailabilityMap.contains(paramName) && m_params.contains(paramName)) + { + if (channelList.isEmpty()) //we want to update the param for all channels even if it is a global one { - if (channelList.isEmpty()) //we want to update the param for all channels even if it is a global one + m_params[paramName].setMeta(meta, takeOwnerShip); + QStringListIterator it(d->m_paramChannelAvailabilityMap[paramName]); + while (it.hasNext()) // update param for all channels { - m_params[paramName].setMeta(meta, takeOwnerShip); - QStringListIterator it(d->m_paramChannelAvailabilityMap[paramName]); - while (it.hasNext()) // update param for all channels - { - m_channels[it.next()].m_channelParam[paramName].setMeta(meta, takeOwnerShip); - } + m_channels[it.next()].m_channelParams[paramName].setMeta(meta, takeOwnerShip); } - else // we only want to update the param for a list of channels + } + else // we only want to update the param for a list of channels + { + for (int i = 0; i < channelList.length(); i++) { - for (int i = 0; i < channelList.length(); i++) + if (m_channels.contains(channelList[i])) { - if (m_channels.contains(channelList[i])) - { - if (d->m_paramChannelAvailabilityMap[paramName].contains(channelList[i])) - { - m_channels[channelList[i]].m_channelParam[paramName].setMeta(meta, takeOwnerShip); - } - } - else + if (d->m_paramChannelAvailabilityMap[paramName].contains(channelList[i])) { - retValue += ito::RetVal(ito::retError, 0, QString("unknown channel %1").arg(QString(paramName)).toLatin1().data()); + m_channels[channelList[i]].m_channelParams[paramName].setMeta(meta, takeOwnerShip); } - } - if (!retValue.containsError()) + else { - //update m_params if the current default channel is listed in channelList or if the current default channel does not support the param (the param in m_params then is set to readonly) - if (channelList.contains(m_params["defaultChannel"].getVal()) || !d->m_paramChannelAvailabilityMap[paramName].contains(m_params["defaultChannel"].getVal())) - { - m_params[paramName].setMeta(meta, takeOwnerShip); - } + retValue += ito::RetVal(ito::retError, 0, QString("unknown channel %1").arg(QString(paramName)).toLatin1().data()); } - } - } - else - { - retValue += ito::RetVal(ito::retError, 0, QString("could not find parameter %1. Maybe the parameter is not registered").arg(QString(paramName)).toLatin1().data()); + } + if (!retValue.containsError()) + { + //update m_params if the current default channel is listed in channelList or if the current default channel does not support the param (the param in m_params then is set to readonly) + if (channelList.contains(m_params["defaultChannel"].getVal()) || !d->m_paramChannelAvailabilityMap[paramName].contains(m_params["defaultChannel"].getVal())) + { + m_params[paramName].setMeta(meta, takeOwnerShip); + } + } } - return retValue; } - - //--------------------------------------------------------------------------------- - ito::RetVal AddInMultiChannelGrabber::setParamFlags(const QByteArray& paramName, const unsigned int& flags, const QList& channelList/* = QList()*/) + else { - Q_D(AddInMultiChannelGrabber); + retValue += ito::RetVal(ito::retError, 0, QString("could not find parameter %1. Maybe the parameter is not registered").arg(QString(paramName)).toLatin1().data()); + } + + return retValue; +} + +//--------------------------------------------------------------------------------- +ito::RetVal AddInMultiChannelGrabber::setParamFlags(const QByteArray& paramName, const unsigned int& flags, const QList& channelList/* = QList()*/) +{ + Q_D(AddInMultiChannelGrabber); - assert(d->m_channelParamsProxyInitialized); - ito::RetVal retValue(ito::retOk); - if (d->m_paramChannelAvailabilityMap.contains(paramName) && m_params.contains(paramName)) + assert(d->m_channelParamsProxyInitialized); + ito::RetVal retValue(ito::retOk); + if (d->m_paramChannelAvailabilityMap.contains(paramName) && m_params.contains(paramName)) + { + if (channelList.isEmpty()) //we want to update the param for all channels even if it is a global one { - if (channelList.isEmpty()) //we want to update the param for all channels even if it is a global one + m_params[paramName].setFlags(flags); + QStringListIterator it(d->m_paramChannelAvailabilityMap[paramName]); + while (it.hasNext()) // update param for all channels { - m_params[paramName].setFlags(flags); - QStringListIterator it(d->m_paramChannelAvailabilityMap[paramName]); - while (it.hasNext()) // update param for all channels - { - m_channels[it.next()].m_channelParam[paramName].setFlags(flags); - } + m_channels[it.next()].m_channelParams[paramName].setFlags(flags); } - else // we only want to update the param for a list of channels + } + else // we only want to update the param for a list of channels + { + for (int i = 0; i < channelList.length(); i++) { - for (int i = 0; i < channelList.length(); i++) + if (m_channels.contains(channelList[i])) { - if (m_channels.contains(channelList[i])) - { - if (d->m_paramChannelAvailabilityMap[paramName].contains(channelList[i])) - { - m_channels[channelList[i]].m_channelParam[paramName].setFlags(flags); - } - } - else + if (d->m_paramChannelAvailabilityMap[paramName].contains(channelList[i])) { - retValue += ito::RetVal(ito::retError, 0, QString("unknown channel %1").arg(QString(paramName)).toLatin1().data()); + m_channels[channelList[i]].m_channelParams[paramName].setFlags(flags); } - } - if (!retValue.containsError()) + else { - //update m_params if the current default channel is listed in channelList or if the current default channel does not support the param (the param in m_params then is set to readonly) - if (channelList.contains(m_params["defaultChannel"].getVal()) || !d->m_paramChannelAvailabilityMap[paramName].contains(m_params["defaultChannel"].getVal())) - { - m_params[paramName].setFlags(flags); - } + retValue += ito::RetVal(ito::retError, 0, QString("unknown channel %1").arg(QString(paramName)).toLatin1().data()); } - } - } - else - { - retValue += ito::RetVal(ito::retError, 0, QString("could not find parameter %1. Maybe the parameter is not registered").arg(QString(paramName)).toLatin1().data()); + } + if (!retValue.containsError()) + { + //update m_params if the current default channel is listed in channelList or if the current default channel does not support the param (the param in m_params then is set to readonly) + if (channelList.contains(m_params["defaultChannel"].getVal()) || !d->m_paramChannelAvailabilityMap[paramName].contains(m_params["defaultChannel"].getVal())) + { + m_params[paramName].setFlags(flags); + } + } } - return retValue; + } + else + { + retValue += ito::RetVal(ito::retError, 0, QString("could not find parameter %1. Maybe the parameter is not registered").arg(QString(paramName)).toLatin1().data()); } - //--------------------------------------------------------------------------------- - ito::RetVal AddInMultiChannelGrabber::getVal(QSharedPointer> dataObjMap, ItomSharedSemaphore* waitCond) + return retValue; +} + +//------------------------------------------------------------------------------------- +ito::RetVal AddInMultiChannelGrabber::getVal(void* vpdObj, ItomSharedSemaphore* waitCond) +{ + ItomSharedSemaphoreLocker locker(waitCond); + ito::RetVal retValue(ito::retOk); + ito::DataObject* dObj = reinterpret_cast(vpdObj); + QString defaultChannel = QLatin1String(m_params["defaultChannel"].getVal()); + + if (!dObj) { - ito::RetVal retval(ito::retOk); - ItomSharedSemaphoreLocker locker(waitCond); - QMap::const_iterator it = (*dataObjMap).constBegin(); - bool validChannelNames = true; + retValue += ito::RetVal( + ito::retError, 0, tr("Empty dataObject handle retrieved from caller").toLatin1().data()); + } - while (it != (*dataObjMap).constEnd()) - { - if (!m_channels.contains(it.key())) - { - retval += ito::RetVal(ito::retError, 0, tr("The following channel is not a valid channel of the dataIO instance: %1").arg(it.key()).toLatin1().data()); - } - ++it; - } + if (!retValue.containsError()) + { + retValue += retrieveData(QStringList(defaultChannel)); + } - if (!retval.containsError()) - { - retval = getValByMap(dataObjMap); - } + if (!retValue.containsError()) + { + // don't wait for live image, since user should get the image as fast as possible. + sendDataToListeners(0); - if (waitCond) - { - waitCond->returnValue = retval; - waitCond->release(); - } + (*dObj) = m_channels[defaultChannel].m_data; + + auto channelDatasets = QSharedPointer>::create(); + channelDatasets->insert(defaultChannel, m_channels[defaultChannel].m_data); + + emit newData(channelDatasets); + m_channels[defaultChannel].m_dataStatus = DataStatus::NewDataAndEmitted; + } + + if (waitCond) + { + waitCond->returnValue = retValue; + waitCond->release(); + } + + return retValue; +} + +//------------------------------------------------------------------------------------- +ito::RetVal AddInMultiChannelGrabber::copyVal(void* vpdObj, ItomSharedSemaphore* waitCond) +{ + ItomSharedSemaphoreLocker locker(waitCond); + ito::RetVal retValue; + ito::DataObject* dObj = reinterpret_cast(vpdObj); - return retval; + if (!dObj) + { + retValue += ito::RetVal( + ito::retError, 0, tr("Empty dataObject handle retrieved from caller").toLatin1().data()); + } + else + { + retValue += checkData(dObj); + } + + if (!retValue.containsError()) + { + retValue += getVal(vpdObj, nullptr); } - //--------------------------------------------------------------------------------- - ito::RetVal AddInMultiChannelGrabber::copyVal(QSharedPointer> dataObjMap, ItomSharedSemaphore* waitCond) + if (!retValue.containsError()) { + QString defaultChannel = QLatin1String(m_params["defaultChannel"].getVal()); + m_channels[defaultChannel].m_data.deepCopyPartial(*dObj); + } + + if (waitCond) + { + waitCond->returnValue = retValue; + waitCond->release(); + } + + return retValue; +} + +//------------------------------------------------------------------------------------- +ito::RetVal AddInMultiChannelGrabber::getVal(QSharedPointer > channelDatasets, ItomSharedSemaphore* waitCond) +{ + //todo + //ItomSharedSemaphoreLocker locker(waitCond); + //ito::RetVal retValue(ito::retOk); + //ito::DataObject* dObj = reinterpret_cast(vpdObj); + //QString defaultChannel = QLatin1String(m_params["defaultChannel"].getVal()); + + //if (!dObj) + //{ + // retValue += ito::RetVal( + // ito::retError, 0, tr("Empty dataObject handle retrieved from caller").toLatin1().data()); + //} + + //if (!retValue.containsError()) + //{ + // retValue += retrieveData(QStringList(defaultChannel)); + //} + + //if (!retValue.containsError()) + //{ + // // don't wait for live image, since user should get the image as fast as possible. + // sendDataToListeners(0); + + // (*dObj) = m_channels[defaultChannel].m_data; + + // auto channelDatasets = QSharedPointer>::create(); + // channelDatasets->insert(defaultChannel, m_channels[defaultChannel].m_data); + + // emit newData(channelDatasets); + // m_channels[defaultChannel].m_dataStatus = DataStatus::NewDataAndEmitted; + //} + + //if (waitCond) + //{ + // waitCond->returnValue = retValue; + // waitCond->release(); + //} + + //return retValue; +} + +//------------------------------------------------------------------------------------- +ito::RetVal AddInMultiChannelGrabber::copyVal(QSharedPointer > channelDatasets, ItomSharedSemaphore* waitCond) +{ + ItomSharedSemaphoreLocker locker(waitCond); + ito::RetVal retValue; + + auto it = channelDatasets->constBegin(); - ito::RetVal retval(ito::retOk); - ItomSharedSemaphoreLocker locker(waitCond); - QMap::const_iterator it = (*dataObjMap).constBegin(); - bool validChannelNames = true; - while (it != (*dataObjMap).constEnd()) + while (it != channelDatasets->constEnd()) + { + if (it.value()) { - if (!m_channels.contains(it.key())) - { - retval += ito::RetVal(ito::retError, 0, tr("The following channel is not a valid channel of the dataIO instance: %1").arg(it.key()).toLatin1().data()); - } - ++it; + retValue += ito::RetVal( + ito::retError, 0, tr("Empty dataObject handle retrieved from caller").toLatin1().data()); + } + else + { + retValue += checkData(it.value()); } - if (!retval.containsError()) + + if (!retValue.containsError()) { - retval = copyValByMap(dataObjMap); + // todo --> must be a channel-based getVal + retValue += getVal(it.value(), nullptr); } - if (waitCond) + + if (!retValue.containsError()) { - waitCond->returnValue = retval; - waitCond->release(); + retValue += m_channels[it.key()].m_data.deepCopyPartial(*(it.value())); } - return retval; + + ++it; + } + + if (waitCond) + { + waitCond->returnValue = retValue; + waitCond->release(); } -}//end namespace ito + return retValue; +} + + +//------------------------------------------------------------------------------------- +const AddInMultiChannelGrabber::ChannelContainer& AddInMultiChannelGrabber::getCurrentDefaultChannel() const +{ + QString defaultChannel = QLatin1String(m_params["defaultChannel"].getVal()); + return m_channels[defaultChannel]; +} + +//------------------------------------------------------------------------------------- +AddInMultiChannelGrabber::ChannelContainer& AddInMultiChannelGrabber::getCurrentDefaultChannel() +{ + QString defaultChannel = QLatin1String(m_params["defaultChannel"].getVal()); + return m_channels[defaultChannel]; +} + +} //end namespace ito diff --git a/plot/AbstractDObjFigure.h b/plot/AbstractDObjFigure.h index 2b8293c08..cc7927c61 100644 --- a/plot/AbstractDObjFigure.h +++ b/plot/AbstractDObjFigure.h @@ -122,7 +122,7 @@ public slots: virtual ito::RetVal setDisplayedCameraChannel(const QString& channel); signals: - void cameraChannelChanged(const QString& channel, QObject* obj); + void cameraChannelChanged(const QObject* listener, const QString& channel); }; } // namespace ito diff --git a/plot/sources/AbstractDObjFigure.cpp b/plot/sources/AbstractDObjFigure.cpp index a63b8e404..55f634fd7 100644 --- a/plot/sources/AbstractDObjFigure.cpp +++ b/plot/sources/AbstractDObjFigure.cpp @@ -441,7 +441,7 @@ ito::RetVal AbstractDObjFigure::setDisplayedCameraChannel(const QString& channel { found = true; m_currentDisplayedCameraChannel = channel; - emit cameraChannelChanged(channel, this); + emit cameraChannelChanged(this, channel); break; } } From 8c9d44167e0d957df55350817db030af30729261 Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Thu, 17 Aug 2023 23:42:39 +0200 Subject: [PATCH 54/62] more work for multi channel grabber --- common/addInMultiChannelGrabber.h | 10 +- common/sources/addInGrabber.cpp | 4 +- common/sources/addInMultiChannelGrabber.cpp | 189 ++++++++++---------- 3 files changed, 105 insertions(+), 98 deletions(-) diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index f18b20497..165c74f90 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -194,8 +194,8 @@ namespace ito void updateSizeXY(); /*!< updates sizex und sizey*/ - const ChannelContainer& getCurrentDefaultChannel() const; - ChannelContainer& getCurrentDefaultChannel(); + ChannelContainerMapConstIterator getCurrentDefaultChannel() const; + ChannelContainerMapIterator getCurrentDefaultChannel(); public: AddInMultiChannelGrabber(const QByteArray& grabberName); @@ -235,14 +235,14 @@ namespace ito virtual ito::RetVal getVal(void* vpdObj, ItomSharedSemaphore* waitCond); virtual ito::RetVal copyVal(void* vpdObj, ItomSharedSemaphore* waitCond); - virtual ito::RetVal getVal(QSharedPointer > channelDatasets, ItomSharedSemaphore* waitCond); - virtual ito::RetVal copyVal(QSharedPointer > channelDatasets, ItomSharedSemaphore* waitCond); + virtual ito::RetVal getVal(QSharedPointer > channelDatasets, ItomSharedSemaphore* waitCond); + virtual ito::RetVal copyVal(QSharedPointer > channelDatasets, ItomSharedSemaphore* waitCond); ito::RetVal changeChannelForListener(QObject* listener, const QString& newChannel); signals: /*!< Signals that a new image or set of images is available. Connect to this signal to obtain a shallow copy of the new images */ - void newData(QSharedPointer > channelDatasets); + void newData(QSharedPointer > channelDatasets); }; } diff --git a/common/sources/addInGrabber.cpp b/common/sources/addInGrabber.cpp index 35be1561d..255fd4562 100644 --- a/common/sources/addInGrabber.cpp +++ b/common/sources/addInGrabber.cpp @@ -87,9 +87,9 @@ ito::RetVal AddInGrabber::checkData(ito::DataObject *externalDataObject) if (m_params.contains("axisDescription")) { axisDescription[0] = - m_params["axisDescription"].getVal()[0]); + m_params["axisDescription"].getVal()[0]; axisDescription[1] = - m_params["axisDescription"].getVal()[1]); + m_params["axisDescription"].getVal()[1]; } // only if exists in plugin diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index 326d2fcff..8844d4ec8 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -390,7 +390,6 @@ ito::RetVal AddInMultiChannelGrabber::sendDataToListeners(int waitMS) DELETE_AND_SET_NULL_ARRAY(waitConds); } - return retValue; } @@ -414,12 +413,12 @@ ito::RetVal AddInMultiChannelGrabber::checkData(const QString& channelName, ito: return ito::RetVal(ito::retError, 0, tr("channel name does not exist").toLatin1().data()); } - ChannelContainer& channel = getCurrentDefaultChannel(); + auto channel = getCurrentDefaultChannel(); - const int futureHeight = channel.m_channelParams["sizey"].getVal(); - const int futureWidth = channel.m_channelParams["sizex"].getVal(); + const int futureHeight = channel->m_channelParams["sizey"].getVal(); + const int futureWidth = channel->m_channelParams["sizex"].getVal(); bool futureTypeOk; - int futureType = itoDataTypeFromPixelFormat(channel.m_channelParams["pixelFormat"].getVal(), &futureTypeOk); + int futureType = itoDataTypeFromPixelFormat(channel->m_channelParams["pixelFormat"].getVal(), &futureTypeOk); if (!futureTypeOk) { @@ -427,46 +426,46 @@ ito::RetVal AddInMultiChannelGrabber::checkData(const QString& channelName, ito: } ito::float64 axisOffset[] = { - channel.m_channelParams["axisOffset"].getVal()[0], - channel.m_channelParams["axisOffset"].getVal()[1] + channel->m_channelParams["axisOffset"].getVal()[0], + channel->m_channelParams["axisOffset"].getVal()[1] }; ito::float64 axisScale[] = { - channel.m_channelParams["axisScale"].getVal()[0], - channel.m_channelParams["axisScale"].getVal()[1] + channel->m_channelParams["axisScale"].getVal()[0], + channel->m_channelParams["axisScale"].getVal()[1] }; ito::ByteArray axisUnit[] = { - channel.m_channelParams["axisUnit"].getVal()[0], - channel.m_channelParams["axisUnit"].getVal()[1] + channel->m_channelParams["axisUnit"].getVal()[0], + channel->m_channelParams["axisUnit"].getVal()[1] }; ito::ByteArray axisDescription[] = { - channel.m_channelParams["axisDescription"].getVal()[0], - channel.m_channelParams["axisDescription"].getVal()[1] + channel->m_channelParams["axisDescription"].getVal()[0], + channel->m_channelParams["axisDescription"].getVal()[1] }; - ito::ByteArray valueDescription = channel.m_channelParams["valueDescription"].getVal(); - ito::ByteArray valueUnit = channel.m_channelParams["valueUnit"].getVal(); + ito::ByteArray valueDescription = channel->m_channelParams["valueDescription"].getVal(); + ito::ByteArray valueUnit = channel->m_channelParams["valueUnit"].getVal(); if (!externalDataObject) { - if (channel.m_data.getDims() < 2 || channel.m_data.getSize(0) != futureHeight || - channel.m_data.getSize(1) != futureWidth || channel.m_data.getType() != futureType) + if (channel->m_data.getDims() < 2 || channel->m_data.getSize(0) != futureHeight || + channel->m_data.getSize(1) != futureWidth || channel->m_data.getType() != futureType) { - channel.m_data = ito::DataObject(futureHeight, futureWidth, futureType); + channel->m_data = ito::DataObject(futureHeight, futureWidth, futureType); } - channel.m_data.setAxisScale(0, axisScale[0]); - channel.m_data.setAxisScale(1, axisScale[1]); - channel.m_data.setAxisOffset(0, axisOffset[0]); - channel.m_data.setAxisOffset(1, axisOffset[1]); - channel.m_data.setAxisDescription(0, axisDescription[0].data()); - channel.m_data.setAxisDescription(1, axisDescription[1].data()); - channel.m_data.setAxisUnit(0, axisUnit[0].data()); - channel.m_data.setAxisUnit(1, axisUnit[1].data()); - channel.m_data.setValueDescription(valueDescription.data()); - channel.m_data.setValueUnit(valueUnit.data()); + channel->m_data.setAxisScale(0, axisScale[0]); + channel->m_data.setAxisScale(1, axisScale[1]); + channel->m_data.setAxisOffset(0, axisOffset[0]); + channel->m_data.setAxisOffset(1, axisOffset[1]); + channel->m_data.setAxisDescription(0, axisDescription[0].data()); + channel->m_data.setAxisDescription(1, axisDescription[1].data()); + channel->m_data.setAxisUnit(0, axisUnit[0].data()); + channel->m_data.setAxisUnit(1, axisUnit[1].data()); + channel->m_data.setValueDescription(valueDescription.data()); + channel->m_data.setValueUnit(valueUnit.data()); } else { @@ -1056,80 +1055,88 @@ ito::RetVal AddInMultiChannelGrabber::copyVal(void* vpdObj, ItomSharedSemaphore* } //------------------------------------------------------------------------------------- -ito::RetVal AddInMultiChannelGrabber::getVal(QSharedPointer > channelDatasets, ItomSharedSemaphore* waitCond) -{ - //todo - //ItomSharedSemaphoreLocker locker(waitCond); - //ito::RetVal retValue(ito::retOk); - //ito::DataObject* dObj = reinterpret_cast(vpdObj); - //QString defaultChannel = QLatin1String(m_params["defaultChannel"].getVal()); - - //if (!dObj) - //{ - // retValue += ito::RetVal( - // ito::retError, 0, tr("Empty dataObject handle retrieved from caller").toLatin1().data()); - //} - - //if (!retValue.containsError()) - //{ - // retValue += retrieveData(QStringList(defaultChannel)); - //} - - //if (!retValue.containsError()) - //{ - // // don't wait for live image, since user should get the image as fast as possible. - // sendDataToListeners(0); - - // (*dObj) = m_channels[defaultChannel].m_data; - - // auto channelDatasets = QSharedPointer>::create(); - // channelDatasets->insert(defaultChannel, m_channels[defaultChannel].m_data); - - // emit newData(channelDatasets); - // m_channels[defaultChannel].m_dataStatus = DataStatus::NewDataAndEmitted; - //} - - //if (waitCond) - //{ - // waitCond->returnValue = retValue; - // waitCond->release(); - //} - - //return retValue; -} - -//------------------------------------------------------------------------------------- -ito::RetVal AddInMultiChannelGrabber::copyVal(QSharedPointer > channelDatasets, ItomSharedSemaphore* waitCond) +ito::RetVal AddInMultiChannelGrabber::getVal(QSharedPointer > channelDatasets, ItomSharedSemaphore* waitCond) { ItomSharedSemaphoreLocker locker(waitCond); ito::RetVal retValue; + QStringList channels; auto it = channelDatasets->constBegin(); while (it != channelDatasets->constEnd()) { - if (it.value()) - { - retValue += ito::RetVal( - ito::retError, 0, tr("Empty dataObject handle retrieved from caller").toLatin1().data()); - } - else - { - retValue += checkData(it.value()); - } + retValue += checkData(it.key(), nullptr); + channels << it.key(); + it++; + } - if (!retValue.containsError()) + if (!retValue.containsError()) + { + retValue += retrieveData(channels); + } + + if (!retValue.containsError()) + { + // don't wait for live image, since user should get the image as fast as possible. + sendDataToListeners(0); + + auto it2 = channelDatasets->begin(); + + while (it2 != channelDatasets->end()) { - // todo --> must be a channel-based getVal - retValue += getVal(it.value(), nullptr); + it2->operator=(m_channels[it2.key()].m_data); + m_channels[it.key()].m_dataStatus = DataStatus::NewDataAndEmitted; + it2++; } - if (!retValue.containsError()) + emit newData(channelDatasets); + } + + if (waitCond) + { + waitCond->returnValue = retValue; + waitCond->release(); + } + + return retValue; +} + +//------------------------------------------------------------------------------------- +ito::RetVal AddInMultiChannelGrabber::copyVal(QSharedPointer > channelDatasets, ItomSharedSemaphore* waitCond) +{ + ItomSharedSemaphoreLocker locker(waitCond); + ito::RetVal retValue; + QStringList channels; + + auto it = channelDatasets->begin(); + + while (it != channelDatasets->end()) + { + retValue += checkData(it.key(), &(*it)); + channels << it.key(); + it++; + } + + if (!retValue.containsError()) + { + retValue += retrieveData(channels); + } + + if (!retValue.containsError()) + { + // don't wait for live image, since user should get the image as fast as possible. + sendDataToListeners(0); + + it = channelDatasets->begin(); + + while (it != channelDatasets->end()) { - retValue += m_channels[it.key()].m_data.deepCopyPartial(*(it.value())); + m_channels[it.key()].m_dataStatus = DataStatus::NewDataAndEmitted; + retValue += m_channels[it.key()].m_data.deepCopyPartial(*it); + it++; } - ++it; + emit newData(channelDatasets); } if (waitCond) @@ -1143,17 +1150,17 @@ ito::RetVal AddInMultiChannelGrabber::copyVal(QSharedPointer()); - return m_channels[defaultChannel]; + return m_channels.constFind(defaultChannel); } //------------------------------------------------------------------------------------- -AddInMultiChannelGrabber::ChannelContainer& AddInMultiChannelGrabber::getCurrentDefaultChannel() +AddInMultiChannelGrabber::ChannelContainerMapIterator AddInMultiChannelGrabber::getCurrentDefaultChannel() { QString defaultChannel = QLatin1String(m_params["defaultChannel"].getVal()); - return m_channels[defaultChannel]; + return m_channels.find(defaultChannel); } } //end namespace ito From 1fd6e71af4c796a6aee36d7b5b937f5b0d59a643 Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Sat, 26 Aug 2023 00:11:03 +0200 Subject: [PATCH 55/62] dataObject: make some member methods const if possible --- DataObject/CMakeLists.txt | 2 +- DataObject/dataobj.cpp | 25 ++++++++++++-------- DataObject/dataobj.h | 46 +++++++++++++++++++++++-------------- DataObject/dataobjVersion.h | 8 +++---- 4 files changed, 50 insertions(+), 31 deletions(-) diff --git a/DataObject/CMakeLists.txt b/DataObject/CMakeLists.txt index 27ba612f8..001c772fb 100644 --- a/DataObject/CMakeLists.txt +++ b/DataObject/CMakeLists.txt @@ -1,6 +1,6 @@ # - itom software # URL: http://www.uni-stuttgart.de/ito -# Copyright (C) 2020, Institut fuer Technische Optik (ITO), +# Copyright (C) 2023, Institut fuer Technische Optik (ITO), # Universitaet Stuttgart, Germany # # This file is part of itom and its software development toolkit (SDK). diff --git a/DataObject/dataobj.cpp b/DataObject/dataobj.cpp index 3eefb5ba2..88f936d58 100644 --- a/DataObject/dataobj.cpp +++ b/DataObject/dataobj.cpp @@ -1,7 +1,7 @@ /* ******************************************************************** itom software URL: http://www.uni-stuttgart.de/ito - Copyright (C) 2020, Institut fuer Technische Optik (ITO), + Copyright (C) 2023, Institut fuer Technische Optik (ITO), Universitaet Stuttgart, Germany This file is part of itom and its software development toolkit (SDK). @@ -3158,7 +3158,7 @@ MAKEFUNCLIST(DeepCopyPartialFunc); \throws cv::Exception(CV_StsAssert) if sizes or type of both matrices are not equal \sa DeepCopyPartialFunc */ -RetVal DataObject::deepCopyPartial(DataObject& copyTo) +RetVal DataObject::deepCopyPartial(DataObject& copyTo) const { if (m_type != copyTo.m_type) { @@ -3167,29 +3167,35 @@ RetVal DataObject::deepCopyPartial(DataObject& copyTo) } // calc and compare squeezed dimensions - int thisDims = this->getDims(); + int thisDims = getDims(); int rhsDims = copyTo.getDims(); int* thisSizes = new int[thisDims]; int* rhsSizes = new int[rhsDims]; - int j = 0; + for (int i = 0; i < thisDims; i++) { thisSizes[j] = this->getSize(i); + if (thisSizes[j] > 1) + { j++; + } } - thisDims = j; + thisDims = j; j = 0; + for (int i = 0; i < rhsDims; i++) { rhsSizes[j] = copyTo.getSize(i); + if (rhsSizes[j] > 1) { j++; } } + rhsDims = j; if (thisDims != rhsDims) @@ -3227,6 +3233,7 @@ RetVal DataObject::deepCopyPartial(DataObject& copyTo) // this->copyTagMapTo(rhs); //Deepcopy the tagspace // this->copyAxisTagsTo(rhs); //Deepcopy the tagspace //} + return ret; } @@ -10495,7 +10502,7 @@ dimensions is allowed to have a size greter than one. \param *mats sequence of i //---------------------------------------------------------------------------------------------------------------------------------- -DataObject DataObject::pow(const ito::float64& power) +DataObject DataObject::pow(const ito::float64& power) const { DataObject result(m_dims, getSize(), m_type); pow(power, result); @@ -10503,7 +10510,7 @@ DataObject DataObject::pow(const ito::float64& power) } //---------------------------------------------------------------------------------------------------------------------------------- -void DataObject::pow(const ito::float64& power, DataObject& dst) +void DataObject::pow(const ito::float64& power, DataObject& dst) const { if (dst.getDims() == 0) { @@ -10573,7 +10580,7 @@ void DataObject::pow(const ito::float64& power, DataObject& dst) } //---------------------------------------------------------------------------------------------------------------------------------- -DataObject DataObject::sqrt() +DataObject DataObject::sqrt() const { DataObject result(m_dims, getSize(), m_type); sqrt(result); @@ -10581,7 +10588,7 @@ DataObject DataObject::sqrt() } //---------------------------------------------------------------------------------------------------------------------------------- -void DataObject::sqrt(DataObject& dst) +void DataObject::sqrt(DataObject& dst) const { if (dst.getDims() == 0) { diff --git a/DataObject/dataobj.h b/DataObject/dataobj.h index 951dd925b..cfd309d33 100644 --- a/DataObject/dataobj.h +++ b/DataObject/dataobj.h @@ -1,7 +1,7 @@ /* ******************************************************************** itom software URL: http://www.uni-stuttgart.de/ito - Copyright (C) 2020, Institut fuer Technische Optik (ITO), + Copyright (C) 2023, Institut fuer Technische Optik (ITO), Universitaet Stuttgart, Germany This file is part of itom and its software development toolkit (SDK). @@ -25,8 +25,7 @@ along with itom. If not, see . *********************************************************************** */ -#ifndef __DATAOBJH -#define __DATAOBJH +#pragma once #include "defines.h" @@ -1089,7 +1088,7 @@ namespace ito { RetVal setTo(const ito::TimeDelta &value, const DataObject &mask = DataObject()); /*!< Sets all or some (if uint8 mask is given) of the array elements to the specified value. */ //! copy all values of this data object to the copyTo data object. The copyTo-data object must be allocated and have the same type and size (of its roi) than this data object. The compared sequence of sizes only contains dimensions whose size is bigger than one (e.g. it is possible to copy a 5x1 object to a 1x1x5 object) - RetVal deepCopyPartial(DataObject ©To); + RetVal deepCopyPartial(DataObject ©To) const; //! Returns the matrix iterator and sets it to the first matrix element. DObjIterator begin(); @@ -1244,11 +1243,11 @@ namespace ito { // power (power of 0.5 is the square root) - DataObject pow(const ito::float64 &power); // returns a new data object with the same size and type than this data object and calculates src**power if power is an integer, else |src|**power (only for float32 and float64 data objects) - void pow(const ito::float64 &power, DataObject &dst); // this function raises every element of this data object to *power* and saves the result in dst. Dst must be of the same size and type than this data object or empty. In the latter case, it is reassigned to the right size and type. + DataObject pow(const ito::float64 &power) const; // returns a new data object with the same size and type than this data object and calculates src**power if power is an integer, else |src|**power (only for float32 and float64 data objects) + void pow(const ito::float64 &power, DataObject &dst) const; // this function raises every element of this data object to *power* and saves the result in dst. Dst must be of the same size and type than this data object or empty. In the latter case, it is reassigned to the right size and type. - DataObject sqrt(); // returns a new data object of the same size and type than this data object where the square root of every element is calculated. Is the same than pow(0.5) - void sqrt(DataObject &dst); // this function calculates the square root of every element and saves the result in dst. Dst must be of the same size and type than this data object or empty. In the latter case, it is reassigned to the right size and type.. Is the same than pow(0.5, dst) + DataObject sqrt() const; // returns a new data object of the same size and type than this data object where the square root of every element is calculated. Is the same than pow(0.5) + void sqrt(DataObject &dst) const; // this function calculates the square root of every element and saves the result in dst. Dst must be of the same size and type than this data object or empty. In the latter case, it is reassigned to the right size and type.. Is the same than pow(0.5, dst) DataObject squeeze() const; DataObject reshape(int newDims, const int *newSizes) const; @@ -1433,10 +1432,17 @@ namespace ito { DataObject lineCut(const double* coordinates, const int& len) const; // ROI - DataObject & adjustROI(const int dtop, const int dbottom, const int dleft, const int dright); /*!< changes the boundaries of the ROI of a two-dimensional data object by the given incremental values */ - DataObject & adjustROI(const unsigned char dims, const int *lims); /*!< changes the boundaries of the ROI of a n-dimensional data object by the given incremental values */ - RetVal locateROI(int *wholeSizes, int *offsets) const; /*!< locates the boundaries of the ROI of a n-dimensional data object and returns the original size and the distances to the physical borders */ - RetVal locateROI(int *lims) const; /*!< locates the boundaries of the ROI of a n-dimensional data object the distances to the physical borders */ + /*!< changes the boundaries of the ROI of a two-dimensional data object by the given incremental values */ + DataObject& adjustROI(const int dtop, const int dbottom, const int dleft, const int dright); + + /*!< changes the boundaries of the ROI of a n-dimensional data object by the given incremental values */ + DataObject& adjustROI(const unsigned char dims, const int *lims); + + /*!< locates the boundaries of the ROI of a n-dimensional data object and returns the original size and the distances to the physical borders */ + RetVal locateROI(int *wholeSizes, int *offsets) const; + + /*!< locates the boundaries of the ROI of a n-dimensional data object the distances to the physical borders */ + RetVal locateROI(int *lims) const; //! copies the externally given source data inside this data object /*! @@ -1454,7 +1460,11 @@ namespace ito { \param sizeY is the height of the array and must fit to the plane height of the data object \return RetVal error if sizeX or sizeY does not fit to the size of the data object or if the type of the given array does not fit to the type of the data object */ - template RetVal copyFromData2D(const _Tp* src, const int sizeX, const int sizeY) { return copyFromData2DInternal((const uchar*)src, sizeof(_Tp), sizeX, sizeY); } // copies 2D continuous data into data object, data object must have correct size and type, otherwise an error is returned + template RetVal copyFromData2D(const _Tp* src, const int sizeX, const int sizeY) const + { + // copies 2D continuous data into data object, data object must have correct size and type, otherwise an error is returned + return copyFromData2DInternal((const uchar*)src, sizeof(_Tp), sizeX, sizeY); + } //! copies the externally given source data inside this data object /*! @@ -1481,9 +1491,13 @@ namespace ito { \param height is the height of the sub-region of the source data that should be copied (must fit to the height of the data object) \return RetVal error if sizeX or sizeY does not fit to the size of the data object or if the type of the given array does not fit to the type of the data object */ - template RetVal copyFromData2D(const _Tp *src, const int sizeX, const int sizeY, const int x0, const int y0, const int width, const int height) { return copyFromData2DInternal((const uchar*)src, sizeof(_Tp), sizeX, x0, y0, width, height); } // copies 2D continuous data into data object, data object must have correct size and type, otherwise an error is returned + template RetVal copyFromData2D(const _Tp *src, const int sizeX, const int sizeY, const int x0, const int y0, const int width, const int height) const + { + // copies 2D continuous data into data object, data object must have correct size and type, otherwise an error is returned + return copyFromData2DInternal((const uchar*)src, sizeof(_Tp), sizeX, x0, y0, width, height); + } - template operator T2 (); /*!< cast operator, tries to cast this data object to another element type */ + template operator T2(); /*!< cast operator, tries to cast this data object to another element type */ template RetVal linspace(const _Tp start, const _Tp end, const _Tp inc, const int transposed); @@ -1721,5 +1735,3 @@ namespace ito { template<> inline ito::tDataType getDataType2() { return ito::tTimeDelta; } } //namespace ito - -#endif //__DATAOBJH diff --git a/DataObject/dataobjVersion.h b/DataObject/dataobjVersion.h index fe310e009..9d2a3f26f 100644 --- a/DataObject/dataobjVersion.h +++ b/DataObject/dataobjVersion.h @@ -1,7 +1,7 @@ /* ******************************************************************** itom software URL: http://www.uni-stuttgart.de/ito - Copyright (C) 2022, Institut fuer Technische Optik (ITO), + Copyright (C) 2023, Institut fuer Technische Optik (ITO), Universitaet Stuttgart, Germany This file is part of itom and its software development toolkit (SDK). @@ -25,8 +25,8 @@ along with itom. If not, see . *********************************************************************** */ -#define DATAOBJ_VERSION_MAJOR 1 -#define DATAOBJ_VERSION_MINOR 10 +#define DATAOBJ_VERSION_MAJOR 2 +#define DATAOBJ_VERSION_MINOR 0 #define DATAOBJ_VERSION_PATCH 0 #define DATAOBJ_VERSION_REVISION 0 -#define DATAOBJ_VERSION_STRING "1.10.0.0" +#define DATAOBJ_VERSION_STRING "2.0.0.0" From d2e5274a4d727ec22592ac3a0782c6ecd2b4ee0f Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Sat, 26 Aug 2023 00:11:34 +0200 Subject: [PATCH 56/62] more adaptions to support multichannel grabber --- common/addInMultiChannelGrabber.h | 19 +++++++++++++-- common/sources/abstractAddInGrabber.cpp | 2 +- common/sources/addInMultiChannelGrabber.cpp | 26 +++++++++++++++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index 165c74f90..94e997936 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -62,7 +62,7 @@ namespace ito NewDataAndEmitted = 2 }; - class ChannelContainer + class ITOMCOMMONQT_EXPORT ChannelContainer { public: ChannelContainer(); @@ -112,7 +112,7 @@ namespace ito ChannelContainerMap m_channels; /*!< Map for recently grabbed images of various channels */ virtual ito::RetVal checkData(ito::DataObject* externalDataObject = nullptr); - virtual ito::RetVal checkData(const QString &channelName, ito::DataObject* externalDataObject = nullptr); + virtual ito::RetVal checkData(const QString& channelName, ito::DataObject* externalDataObject = nullptr); virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ @@ -147,6 +147,21 @@ namespace ito */ virtual ito::RetVal retrieveData(const QStringList& channels = QStringList()) = 0; + //! This method fetches the latest acquired image of the current default channel. + /* + This method gets the name of the current default channel and calls the overloaded + method ``retrieveData(channels)`` to fetch the latest acquired image of the default + channel. + + If the ``externalDataObject`` is given, it must either be empty or have the same + size and dtype than the latest image of the default channel. If given, the latest + image is copied into the given externalDataObject. + + Usually, this method has not to be overloaded, since it is implemented in a useable + way. Nevertheless, it can be overloaded. + */ + virtual ito::RetVal retrieveData(ito::DataObject* externalDataObject = nullptr); + //! Specific function to set the parameters in the respective plugin class /*! This function is a specific implementation of setParam. Overload this function to diff --git a/common/sources/abstractAddInGrabber.cpp b/common/sources/abstractAddInGrabber.cpp index 007765372..50f55a70c 100644 --- a/common/sources/abstractAddInGrabber.cpp +++ b/common/sources/abstractAddInGrabber.cpp @@ -166,7 +166,7 @@ void AbstractAddInGrabber::timerEvent(QTimerEvent * /*event*/) if (m_autoGrabbingListeners.size() > 0) // verify that any liveImage is listening { - retValue += acquire(0, NULL); + retValue += acquire(0, nullptr); if (!retValue.containsError()) { diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index 8844d4ec8..ab768735a 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -1148,6 +1148,32 @@ ito::RetVal AddInMultiChannelGrabber::copyVal(QSharedPointer()); + ito::RetVal retval; + + if (externalDataObject) + { + retval += checkData(defaultChannel, externalDataObject); + } + + if (!retval.containsError()) + { + // fetch all channels. This is necessary for the auto + // grabbing using the timerEvent in abstractAddInGrabber. + retval += retrieveData(QStringList()); + } + + if (externalDataObject && !retval.containsError()) + { + retval += m_channels[defaultChannel].m_data.deepCopyPartial(*externalDataObject); + } + + return retval; +} + //------------------------------------------------------------------------------------- AddInMultiChannelGrabber::ChannelContainerMapConstIterator AddInMultiChannelGrabber::getCurrentDefaultChannel() const From 77a2c431a5526c011e2a25f226c0afb8ec36ba3c Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Mon, 9 Oct 2023 23:56:17 +0200 Subject: [PATCH 57/62] more steps for multichannelGrabber --- Qitom/python/pythonCommon.cpp | 8 ++--- common/sources/addInMultiChannelGrabber.cpp | 37 +++++++++++++-------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/Qitom/python/pythonCommon.cpp b/Qitom/python/pythonCommon.cpp index 0be68a71f..e7c70ad90 100644 --- a/Qitom/python/pythonCommon.cpp +++ b/Qitom/python/pythonCommon.cpp @@ -886,19 +886,19 @@ PyObject* printOutParams(const QVector *params, bool asErr, bool add values["values"].append("empty"); break; case 1: - temp = QString("[%1]").arg(ptr[0].data()); + temp = QString("[\"%1\"]").arg(ptr[0].data()); values["values"].append(temp); break; case 2: - temp = QString("[%1,%2]").arg(ptr[0].data()).arg(ptr[1].data()); + temp = QString("[\"%1\",\"%2\"]").arg(ptr[0].data()).arg(ptr[1].data()); values["values"].append(temp); break; case 3: - temp = QString("[%1,%2,%3]").arg(ptr[0].data()).arg(ptr[1].data()).arg(ptr[2].data()); + temp = QString("[\"%1\",\"%2\",\"%3\"]").arg(ptr[0].data()).arg(ptr[1].data()).arg(ptr[2].data()); values["values"].append(temp); break; case 4: - temp = QString("[%1,%2,%3,%4]").arg(ptr[0].data()).arg(ptr[1].data()).arg(ptr[2].data()).arg(ptr[3].data()); + temp = QString("[\"%1\",\"%2\",\"%3\",\"%4\"]").arg(ptr[0].data()).arg(ptr[1].data()).arg(ptr[2].data()).arg(ptr[3].data()); values["values"].append(temp); break; default: diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index ab768735a..0de2c75ed 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -150,7 +150,7 @@ void AddInMultiChannelGrabber::ChannelContainer::addDefaultMetaParams() addChannelParam(paramVal); double axisScales[] = { 1.0, 1.0 }; - paramVal = ito::Param("axisScales", ito::ParamBase::DoubleArray, 2, axisOffsets, "the scale values of the y- and x-axis of this channel image."); + paramVal = ito::Param("axisScales", ito::ParamBase::DoubleArray, 2, axisScales, "the scale values of the y- and x-axis of this channel image."); paramVal.setMeta(new ito::DoubleArrayMeta(-DBL_MAX, DBL_MAX, 0.0, 2, 2, 1, "MetaInformation"), true); addChannelParam(paramVal); @@ -239,7 +239,7 @@ ito::RetVal AddInMultiChannelGrabber::initChannelsAndGlobalParameters( "at least one channel container must be given"); // initialize default global parameters - m_params["channelName"].setVal(defaultChannelName.toLatin1().constData()); + m_params["defaultChannel"].setVal(defaultChannelName.toLatin1().constData()); m_params["channelSelector"].setVal(defaultChannelName.toLatin1().constData()); QList channelNames; @@ -426,23 +426,23 @@ ito::RetVal AddInMultiChannelGrabber::checkData(const QString& channelName, ito: } ito::float64 axisOffset[] = { - channel->m_channelParams["axisOffset"].getVal()[0], - channel->m_channelParams["axisOffset"].getVal()[1] + channel->m_channelParams["axisOffsets"].getVal()[0], + channel->m_channelParams["axisOffsets"].getVal()[1] }; ito::float64 axisScale[] = { - channel->m_channelParams["axisScale"].getVal()[0], - channel->m_channelParams["axisScale"].getVal()[1] + channel->m_channelParams["axisScales"].getVal()[0], + channel->m_channelParams["axisScales"].getVal()[1] }; ito::ByteArray axisUnit[] = { - channel->m_channelParams["axisUnit"].getVal()[0], - channel->m_channelParams["axisUnit"].getVal()[1] + channel->m_channelParams["axisUnits"].getVal()[0], + channel->m_channelParams["axisUnits"].getVal()[1] }; ito::ByteArray axisDescription[] = { - channel->m_channelParams["axisDescription"].getVal()[0], - channel->m_channelParams["axisDescription"].getVal()[1] + channel->m_channelParams["axisDescriptions"].getVal()[0], + channel->m_channelParams["axisDescriptions"].getVal()[1] }; ito::ByteArray valueDescription = channel->m_channelParams["valueDescription"].getVal(); @@ -695,7 +695,15 @@ ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer va } else { - retValue += ito::RetVal(ito::retError, 0, tr("could not switch to channel %1. The channel is unknown.").arg(val->getVal()).toLatin1().data()); + QStringList availableChannels = m_channels.keys(); + + retValue += ito::RetVal( + ito::retError, + 0, + tr("Cannot switch to channel \"%1\" since it does not exist. Available channels are %2.") + .arg(val->getVal()) + .arg(availableChannels.join(", ")).toLatin1().data() + ); } } } @@ -708,10 +716,11 @@ ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer va updateSizeXY(); paramUpdateList << "sizex" << "sizey"; } - if (key == "defaultChannel") + else if (key == "channelSelector") { retValue += switchChannelSelector(); } + retValue += applyParamsToChannelParams(paramUpdateList); retValue += checkData(); } @@ -781,7 +790,7 @@ ito::RetVal AddInMultiChannelGrabber::switchChannelSelector() retValue += ito::RetVal( ito::retError, 0, - tr("could not switch to channel %1. The channel is not registered.").arg(selectedChannel).toLatin1().data() + tr("Cannot switch to channel %1. The channel is not registered.").arg(selectedChannel).toLatin1().data() ); } @@ -830,7 +839,7 @@ ito::RetVal AddInMultiChannelGrabber::applyParamsToChannelParams(const QStringLi else { - retVal = ito::RetVal(ito::retError, 0, tr("unknown channel %1").arg(channelSelector).toLatin1().data()); + retVal = ito::RetVal(ito::retError, 0, tr("Unknown channel \"%1\". Available channels are: %2").arg(channelSelector).arg(m_channels.keys().join(", ")).toLatin1().data()); } } else From 4bee151abb4e1f1b0afe539589e3248d11884f0a Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Wed, 18 Oct 2023 00:07:10 +0200 Subject: [PATCH 58/62] next steps for multichannel grabber --- common/addInMultiChannelGrabber.h | 3 +++ common/sources/addInMultiChannelGrabber.cpp | 21 ++++++++++++++++++--- plot/AbstractDObjFigure.h | 9 +++------ plot/CMakeLists.txt | 2 +- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/common/addInMultiChannelGrabber.h b/common/addInMultiChannelGrabber.h index 94e997936..2b857047a 100644 --- a/common/addInMultiChannelGrabber.h +++ b/common/addInMultiChannelGrabber.h @@ -114,6 +114,9 @@ namespace ito virtual ito::RetVal checkData(ito::DataObject* externalDataObject = nullptr); virtual ito::RetVal checkData(const QString& channelName, ito::DataObject* externalDataObject = nullptr); + //!< calls checkData for the internal data caches for all channels + virtual ito::RetVal checkDataFromAllChannels(); + virtual ito::RetVal sendDataToListeners(int waitMS); /*!< sends m_data to all registered listeners. */ ito::RetVal adaptDefaultChannelParams(); /*!< adaptes the params after changing the defaultChannel param*/ diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index 0de2c75ed..4f1bc86e2 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -400,6 +400,21 @@ ito::RetVal AddInMultiChannelGrabber::checkData(ito::DataObject* externalDataObj return checkData(defaultChannel, externalDataObject); } +//------------------------------------------------------------------------------------- +ito::RetVal AddInMultiChannelGrabber::checkDataFromAllChannels() +{ + auto it = m_channels.constBegin(); + ito::RetVal retval; + + while (it != m_channels.constEnd()) + { + retval += checkData(it.key()); + ++it; + } + + return retval; +} + //------------------------------------------------------------------------------------- ito::RetVal AddInMultiChannelGrabber::checkData(const QString& channelName, ito::DataObject* externalDataObject /*= nullptr*/) { @@ -408,13 +423,13 @@ ito::RetVal AddInMultiChannelGrabber::checkData(const QString& channelName, ito: assert(d->m_channelParamsProxyInitialized); ito::RetVal retVal(ito::retOk); - if (!m_channels.contains(channelName)) + auto channel = m_channels.find(channelName); + + if (channel == m_channels.end()) { return ito::RetVal(ito::retError, 0, tr("channel name does not exist").toLatin1().data()); } - auto channel = getCurrentDefaultChannel(); - const int futureHeight = channel->m_channelParams["sizey"].getVal(); const int futureWidth = channel->m_channelParams["sizex"].getVal(); bool futureTypeOk; diff --git a/plot/AbstractDObjFigure.h b/plot/AbstractDObjFigure.h index cc7927c61..f4fc97e27 100644 --- a/plot/AbstractDObjFigure.h +++ b/plot/AbstractDObjFigure.h @@ -1,7 +1,7 @@ /* ******************************************************************** itom software URL: http://www.uni-stuttgart.de/ito - Copyright (C) 2020, Institut fuer Technische Optik (ITO), + Copyright (C) 2023, Institut fuer Technische Optik (ITO), Universitaet Stuttgart, Germany This file is part of itom and its software development toolkit (SDK). @@ -25,8 +25,7 @@ along with itom. If not, see . *********************************************************************** */ -#ifndef ABSTRACTDOBJFIGURE_H -#define ABSTRACTDOBJFIGURE_H +#pragma once #include "AbstractFigure.h" #include "../DataObject/dataobj.h" @@ -122,11 +121,9 @@ public slots: virtual ito::RetVal setDisplayedCameraChannel(const QString& channel); signals: - void cameraChannelChanged(const QObject* listener, const QString& channel); + void cameraChannelChanged(QObject* listener, const QString& channel); }; } // namespace ito #endif //#if !defined(Q_MOC_RUN) || defined(ITOMCOMMONQT_MOC) - -#endif //ABSTRACTDOBJFIGURE_H diff --git a/plot/CMakeLists.txt b/plot/CMakeLists.txt index 4c7642c48..5b803f6a3 100644 --- a/plot/CMakeLists.txt +++ b/plot/CMakeLists.txt @@ -1,6 +1,6 @@ # - itom software # URL: http://www.uni-stuttgart.de/ito -# Copyright (C) 2020, Institut fuer Technische Optik (ITO), +# Copyright (C) 2023, Institut fuer Technische Optik (ITO), # Universitaet Stuttgart, Germany # # This file is part of itom and its software development toolkit (SDK). From bc5c3fe1017359c180ae23d067599b9843f48ee1 Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Fri, 20 Oct 2023 22:00:30 +0200 Subject: [PATCH 59/62] bugfix in DataObject library: DataObject::copyFromData2D cannot be const. Const removed. --- DataObject/dataobj.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DataObject/dataobj.h b/DataObject/dataobj.h index cfd309d33..894f5c930 100644 --- a/DataObject/dataobj.h +++ b/DataObject/dataobj.h @@ -1460,7 +1460,7 @@ namespace ito { \param sizeY is the height of the array and must fit to the plane height of the data object \return RetVal error if sizeX or sizeY does not fit to the size of the data object or if the type of the given array does not fit to the type of the data object */ - template RetVal copyFromData2D(const _Tp* src, const int sizeX, const int sizeY) const + template RetVal copyFromData2D(const _Tp* src, const int sizeX, const int sizeY) { // copies 2D continuous data into data object, data object must have correct size and type, otherwise an error is returned return copyFromData2DInternal((const uchar*)src, sizeof(_Tp), sizeX, sizeY); @@ -1491,7 +1491,7 @@ namespace ito { \param height is the height of the sub-region of the source data that should be copied (must fit to the height of the data object) \return RetVal error if sizeX or sizeY does not fit to the size of the data object or if the type of the given array does not fit to the type of the data object */ - template RetVal copyFromData2D(const _Tp *src, const int sizeX, const int sizeY, const int x0, const int y0, const int width, const int height) const + template RetVal copyFromData2D(const _Tp *src, const int sizeX, const int sizeY, const int x0, const int y0, const int width, const int height) { // copies 2D continuous data into data object, data object must have correct size and type, otherwise an error is returned return copyFromData2DInternal((const uchar*)src, sizeof(_Tp), sizeX, x0, y0, width, height); From c30d931e1edfdd9714aa6b5639c92e51fa705a37 Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Sat, 21 Oct 2023 00:12:44 +0200 Subject: [PATCH 60/62] next steps for MultiChannelGrabber --- Qitom/widgets/figureWidget.cpp | 93 ++++++++++--------- common/sources/addInMultiChannelGrabber.cpp | 99 ++++++++++++++++++++- itomWidgets/plotInfoDObject.cpp | 23 +++-- plot/AbstractDObjFigure.h | 8 +- plot/sources/AbstractDObjFigure.cpp | 12 ++- 5 files changed, 180 insertions(+), 55 deletions(-) diff --git a/Qitom/widgets/figureWidget.cpp b/Qitom/widgets/figureWidget.cpp index d31623c61..ff8aa4ead 100644 --- a/Qitom/widgets/figureWidget.cpp +++ b/Qitom/widgets/figureWidget.cpp @@ -473,10 +473,9 @@ RetVal FigureWidget::liveImage( DesignerWidgetOrganizer *dwo = qobject_cast(AppManagement::getDesignerWidgetOrganizer()); RetVal retval; QString plotClassName; -// bool exists = false; int idx = areaCol + areaRow * m_cols; - *canvasWidget = NULL; + *canvasWidget = nullptr; if (!dwo) { @@ -489,47 +488,62 @@ RetVal FigureWidget::liveImage( else { //get grabDepth - bool setDepth = false; bool isLine = false; - ito::AutoInterval bitRange (0.0, 1.0); + ito::AutoInterval bitRange(0.0, 1.0); if (qobject_cast(cam)) { - QSharedPointer paramFormat = getParamByInvoke(cam.data(), "pixelFormat", retval); - const char * pixelFormat = paramFormat->getVal(); - int min, max = 0; - bool ok = false; - AbstractAddInGrabber::minMaxBoundariesFromIntegerPixelFormat(pixelFormat, min, max, ok); - if (ok) + auto paramDefaultChannel = getParamByInvoke(cam.data(), "defaultChannel", retval); + QString channel = ""; + + if (!retval.containsError()) { - bitRange.setMaximum(max); - bitRange.setMinimum(min); - setDepth = true; + channel = QString(":") + paramDefaultChannel->getVal(); } + auto paramFormat = getParamByInvoke(cam.data(), QString("pixelFormat%1").arg(channel), retval); + + if (!retval.containsError() && !paramFormat.isNull()) + { + const char* pixelFormat = paramFormat->getVal(); + int min, max = 0; + bool ok = false; + AbstractAddInGrabber::minMaxBoundariesFromIntegerPixelFormat(pixelFormat, min, max, ok); + + if (ok) + { + bitRange.setMaximum(max); + bitRange.setMinimum(min); + } + else + { + bitRange.setAuto(true); + } + } } else // fall back for AddInGrabber { - int bpp = getParamByInvoke(cam.data(), "bpp", retval)->getVal(); - if (!retval.containsError()) + auto paramBpp = getParamByInvoke(cam.data(), "bpp", retval); + + if (!retval.containsError() && !paramBpp.isNull()) { + int bpp = paramBpp->getVal(); + if (bpp == 8) { - setDepth = true; bitRange.setMaximum(255.0); } else if (bpp < 17) { - setDepth = true; bitRange.setMaximum((float)((1 << bpp) - 1)); } else if (bpp == 32) { - // ToDo define float32 and int32 behavior! + bitRange.setAuto(true); } else if (bpp == 64) { - // ToDo define float64 behavior! + bitRange.setAuto(true); } } @@ -609,10 +623,13 @@ RetVal FigureWidget::liveImage( dObjFigure->setProperty("yAxisFlipped", true); } - if (setDepth) + if (isLine) + { + dObjFigure->setYAxisInterval(bitRange); + } + else { - if (isLine) dObjFigure->setYAxisInterval(bitRange); - else dObjFigure->setZAxisInterval(bitRange); + dObjFigure->setZAxisInterval(bitRange); } dObjFigure->setCamera(cam); @@ -624,18 +641,21 @@ RetVal FigureWidget::liveImage( //check if dObjFigure has property "yAxisFlipped" and flip it, if so. QVariant yAxisFlipped = dObjPclFigure->property("yAxisFlipped"); + if (yAxisFlipped.isValid()) { dObjPclFigure->setProperty("yAxisFlipped", true); } - if (setDepth) + if (isLine) + { + dObjPclFigure->setYAxisInterval(bitRange); + } + else { - if (isLine) dObjPclFigure->setYAxisInterval(bitRange); - else dObjPclFigure->setZAxisInterval(bitRange); + dObjPclFigure->setZAxisInterval(bitRange); } -// dObjPclFigure->setCamera(cam); *canvasWidget = destWidget; } else @@ -834,30 +854,23 @@ QSharedPointer FigureWidget::getParamByInvoke(ito::AddInBase* addIn, { QSharedPointer result; - if (addIn == NULL) + if (addIn == nullptr) { retval += RetVal(retError, 0, tr("addInBase pointer is NULL").toLatin1().data()); } else { ItomSharedSemaphoreLocker locker(new ItomSharedSemaphore()); - ito::Param param = addIn->getParamRec(paramName); - if (param.getName() != NULL) // Parameter is defined + result = QSharedPointer(new ito::Param(ito::ByteArray(paramName.toLatin1().data()))); + QMetaObject::invokeMethod(addIn, "getParam", Q_ARG(QSharedPointer, result), Q_ARG(ItomSharedSemaphore*, locker.getSemaphore())); + + if (!locker.getSemaphore()->wait(PLUGINWAIT)) { - result = QSharedPointer(new ito::Param(param)); - QMetaObject::invokeMethod(addIn, "getParam", Q_ARG(QSharedPointer, result), Q_ARG(ItomSharedSemaphore*, locker.getSemaphore())); - if (!locker.getSemaphore()->wait(PLUGINWAIT)) - { - retval += RetVal::format(retError, 0, tr("timeout while getting parameter '%s' from plugin").toLatin1().data(), paramName.toLatin1().data()); - } - else - { - retval += locker.getSemaphore()->returnValue; - } + retval += RetVal::format(retError, 0, tr("timeout while getting parameter '%s' from plugin").toLatin1().data(), paramName.toLatin1().data()); } else { - retval += RetVal::format(retError, 0, tr("parameter '%s' is not defined in plugin").toLatin1().data(), paramName.toLatin1().data()); + retval += locker.getSemaphore()->returnValue; } } diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index 4f1bc86e2..524e71ff6 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -33,6 +33,7 @@ #include #include #include "common/helperCommon.h" +#include "common/interval.h" namespace ito @@ -588,7 +589,47 @@ ito::RetVal AddInMultiChannelGrabber::getParam(QSharedPointer val, I if (!retValue.containsError() && !ok) { //the parameter was not processed by the plugin, so it is done here - *val = it.value(); + + // if a suffix is available, check if it is a channel name and if yes, + // check if the key is contained in this channel. If this is also true, + // return this parameter instead of the global one. + if (suffix != "") + { + auto channel = m_channels.find(suffix); + + if (channel != m_channels.end()) + { + // ok, there is a channel with the suffix name + auto channelParam = channel->m_channelParams.find(key); + + // check if this channel also has the desired param, and if yes, return this one. + if (channelParam != channel->m_channelParams.end()) + { + it = channelParam; + } + } + else + { + retValue += ito::RetVal::format( + ito::retWarning, + 0, + "Suffix '%s' is no valid channel and unsupported. It is ignored.", + suffix.toLatin1().data() + ); + } + } + + // check if an index is available and if yes, try to return this index. + // In this case, the parameter must be an array-type parameter. If this is not + // the case an error is returned. + if (hasIndex) + { + retValue += apiGetItemFromParamArray(it.value(), index, *val); + } + else + { + *val = it.value(); + } } if (waitCond) @@ -621,9 +662,60 @@ ito::RetVal AddInMultiChannelGrabber::changeChannelForListener(QObject* listener if (it.key() != newChannel) { + //// temporarily remove the source from the plot + //QMetaObject::invokeMethod(listener, "setSource", Qt::DirectConnection, + // Q_ARG(QSharedPointer, + // QSharedPointer(new ito::DataObject())), + // Q_ARG(ItomSharedSemaphore*, nullptr)); + // the channel has changed m_autoGrabbingListeners.erase(it); m_autoGrabbingListeners.insert(newChannel, listener); + + // Problem: here, the itomCLommonPlotLib library cannot be used, due to a ring + // include. Therefore, all properties etc. have to be read and written using the + // generic Qt methods of the MOC system. + if (listener->inherits("ito::AbstractDObjFigure")) + { + // here the property must be requested by its name, since the itomPlot library + // cannot be linked here, due to a ring include issue. + Qt::Axis plotValueAxis = listener->property("valueAxis").value(); + + // request the pixel format for the desired channel (independent if this channel is the default channel + // or the selected channel). + ito::ByteArray paramName = ito::ByteArray("pixelFormat:").append(newChannel.toLatin1().data()); + QSharedPointer pixelFormatParam(new ito::Param(paramName, ito::ParamBase::String)); + ito::RetVal retval2 = getParam(pixelFormatParam, nullptr); + + if (retval2 == ito::retOk) + { + ito::AutoInterval bitRange(0.0, 1.0); + const char* pixelFormat = pixelFormatParam->getVal(); + int min, max = 0; + bool ok = false; + AbstractAddInGrabber::minMaxBoundariesFromIntegerPixelFormat(pixelFormat, min, max, ok); + + if (ok) + { + bitRange.setMaximum(max); + bitRange.setMinimum(min); + } + else + { + bitRange.setAuto(true); + } + + switch (plotValueAxis) + { + case Qt::YAxis: + //listener->setProperty("yAxisInterval", QVariant::fromValue(bitRange)); + break; + default: + //listener->setProperty("zAxisInterval", QVariant::fromValue(bitRange)); + break; + } + } + } } break; @@ -664,6 +756,7 @@ ito::RetVal AddInMultiChannelGrabber::changeChannelForListener(QObject* listener */ ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer val, ItomSharedSemaphore* waitCond/* = nullptr*/) { + // todo: consider the cases if suffixes or index is given Q_D(AddInMultiChannelGrabber); assert(d->m_channelParamsProxyInitialized); @@ -715,9 +808,9 @@ ito::RetVal AddInMultiChannelGrabber::setParam(QSharedPointer va retValue += ito::RetVal( ito::retError, 0, - tr("Cannot switch to channel \"%1\" since it does not exist. Available channels are %2.") + tr("Cannot switch to channel \"%1\" since it does not exist. Available channels are \"%2\".") .arg(val->getVal()) - .arg(availableChannels.join(", ")).toLatin1().data() + .arg(availableChannels.join("\", \"")).toLatin1().data() ); } } diff --git a/itomWidgets/plotInfoDObject.cpp b/itomWidgets/plotInfoDObject.cpp index dcb8bf487..6a826a1d1 100644 --- a/itomWidgets/plotInfoDObject.cpp +++ b/itomWidgets/plotInfoDObject.cpp @@ -37,10 +37,11 @@ PlotInfoDObject::PlotInfoDObject(QWidget* parent /*= NULL*/) : QPlainTextEdit(pa //--------------------------------------------------------------------------------------------------------- void PlotInfoDObject::updateInfoHeader(const QString newString) { - m_infoHeader = newString; - QString baseText = m_infoHeader; - baseText.append(m_infoDetail); - setPlainText(baseText); + if (newString != m_infoHeader) + { + m_infoHeader = newString; + setPlainText(m_infoHeader + m_infoDetail); + } } //--------------------------------------------------------------------------------------------------------- void PlotInfoDObject::updateInfoHeader(const QString typeString, const int dType, const int dims, const int sizes[]) @@ -107,15 +108,17 @@ void PlotInfoDObject::updateInfoHeader(const QString typeString, const int dType //--------------------------------------------------------------------------------------------------------- void PlotInfoDObject::updateInfoDetail(const QString newString) { - m_infoDetail = newString; - QString baseText = m_infoHeader; - baseText.append(m_infoDetail); - setPlainText(baseText); + if (newString != m_infoDetail) + { + m_infoDetail = newString; + setPlainText(m_infoHeader + m_infoDetail); + } } //--------------------------------------------------------------------------------------------------------- void PlotInfoDObject::updateInfoDetail(const double minVal, const double maxVal, const double meanVal, const double devVal) { QString baseText = ""; + if (m_valid) { baseText.append(QString("Maximum: %1\n").arg(QString::number(maxVal))); @@ -123,6 +126,7 @@ void PlotInfoDObject::updateInfoDetail(const double minVal, const double maxVal, baseText.append(QString("Mean Value: %1\n").arg(QString::number(meanVal))); baseText.append(QString("Dev Value: %1\n").arg(QString::number(devVal))); } + updateInfoDetail(baseText); } //--------------------------------------------------------------------------------------------------------- @@ -138,10 +142,12 @@ void PlotInfoDObject::clearObjectInfo() void PlotInfoDObject::setUseDetailInfo(const bool state) { m_addDetailInfo = state; + if (!state) { updateInfoDetail(""); } + return; } //--------------------------------------------------------------------------------------------------------- @@ -153,4 +159,3 @@ QPainterPath PlotInfoDObject::renderToPainterPath(const int xsize, const int ysi return destinationPath; } -//--------------------------------------------------------------------------------------------------------- diff --git a/plot/AbstractDObjFigure.h b/plot/AbstractDObjFigure.h index f4fc97e27..37d868d60 100644 --- a/plot/AbstractDObjFigure.h +++ b/plot/AbstractDObjFigure.h @@ -55,6 +55,9 @@ class ITOMCOMMONPLOT_EXPORT AbstractDObjFigure : public AbstractFigure Q_PROPERTY(QString colorMap READ getColorMap WRITE setColorMap DESIGNABLE true USER true) Q_PROPERTY(QString cameraChannel READ getDisplayedCameraChannel WRITE setDisplayedCameraChannel DESIGNABLE false USER true); + // the property valueAxis is requested as dynamic property by AddInMultiChannelGrabber::changeChannelForListener. Do not change the name! + Q_PROPERTY(Qt::Axis valueAxis READ getValueAxis DESIGNABLE false USER false); + Q_CLASSINFO("prop://source", "Sets the input data object for this plot.") Q_CLASSINFO("prop://displayed", "This returns the currently displayed data object [read only].") Q_CLASSINFO("prop://camera", "Use this property to set a camera/grabber to this plot (live image).") @@ -63,6 +66,7 @@ class ITOMCOMMONPLOT_EXPORT AbstractDObjFigure : public AbstractFigure Q_CLASSINFO("prop://zAxisInterval", "Sets the visible range of the displayed z-axis (in coordinates of the data object). Set it to 'auto' if range should be automatically set [default].") Q_CLASSINFO("prop://colorMap", "Color map (string) that should be used to colorize a non-color data object.") Q_CLASSINFO("prop://cameraChannel", "If a multi channel device (MultiChannelGrabber) is connected to this plot, the currently displayed channel of the device can be set. To obtain a list of the available channels see the parameter channelList of the device") + Q_CLASSINFO("prop://valueaxis", "Returns the axis that is used in this plot for displaying the values. Usually this is the z-axis for a 2D plot and the y-axis for a 1D plot.") Q_CLASSINFO("slot://setSource", "This slot can be implemented by any plot plugin to send a dataObject to the plot. Here it is not required and therefore not implemented.") Q_CLASSINFO("slot://setLinePlot", "This slot can be implemented by any plot plugin to force the plot to open a line plot. Here it is not required and therefore not implemented.") @@ -99,6 +103,8 @@ class ITOMCOMMONPLOT_EXPORT AbstractDObjFigure : public AbstractFigure virtual QString getColorMap(void) const; virtual void setColorMap(QString); + virtual Qt::Axis getValueAxis() const; + //! plot-specific render function to enable more complex printing in subfigures ... virtual QPixmap renderToPixMap(const int xsize, const int ysize, const int resolution); @@ -109,7 +115,7 @@ class ITOMCOMMONPLOT_EXPORT AbstractDObjFigure : public AbstractFigure QHash > m_dataPointer; bool m_cameraConnected; - RetVal removeLiveSource(); + virtual RetVal removeLiveSource(); public slots: //this source is invoked by any connected camera diff --git a/plot/sources/AbstractDObjFigure.cpp b/plot/sources/AbstractDObjFigure.cpp index 55f634fd7..d5ad38682 100644 --- a/plot/sources/AbstractDObjFigure.cpp +++ b/plot/sources/AbstractDObjFigure.cpp @@ -1,7 +1,7 @@ /* ******************************************************************** itom software URL: http://www.uni-stuttgart.de/ito - Copyright (C) 2020, Institut fuer Technische Optik (ITO), + Copyright (C) 2023, Institut fuer Technische Optik (ITO), Universitaet Stuttgart, Germany This file is part of itom and its software development toolkit (SDK). @@ -108,6 +108,14 @@ QSharedPointer AbstractDObjFigure::getSource(void) const } return QSharedPointer(); } + +//------------------------------------------------------------------------------------- +Qt::Axis AbstractDObjFigure::getValueAxis() const +{ + // default, only the 1D plot will overwrite this to correct it + return Qt::ZAxis; +} + //---------------------------------------------------------------------------------------------------------------------------------- ito::RetVal AbstractDObjFigure::setAxisData(QSharedPointer data, Qt::Axis axis) { @@ -321,7 +329,7 @@ void AbstractDObjFigure::setSource(QSharedPointer source, ItomS } //---------------------------------------------------------------------------------------------------------------------------------- -RetVal AbstractDObjFigure::removeLiveSource() +/*virtual*/ RetVal AbstractDObjFigure::removeLiveSource() { RetVal retval; ito::Param *liveSource = getInputParam("liveSource"); From 330888ae52a1a8162d411614bf3e0bfc276e0560 Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Sat, 18 Nov 2023 23:39:45 +0100 Subject: [PATCH 61/62] Qt5 fixes --- common/sources/addInMultiChannelGrabber.cpp | 4 ++-- plot/sources/AbstractDObjFigure.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index 524e71ff6..261aabc5a 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -243,14 +243,14 @@ ito::RetVal AddInMultiChannelGrabber::initChannelsAndGlobalParameters( m_params["defaultChannel"].setVal(defaultChannelName.toLatin1().constData()); m_params["channelSelector"].setVal(defaultChannelName.toLatin1().constData()); - QList channelNames; + QVector channelNames; foreach(const QString & channelName, channelContainerMap.keys()) { channelNames << ito::ByteArray(channelName.toLatin1().constData()); } - m_params["availableChannels"].setVal(channelNames.data(), channelNames.size()); + m_params["availableChannels"].setVal(channelNames.constData(), channelNames.size()); m_channels = channelContainerMap; diff --git a/plot/sources/AbstractDObjFigure.cpp b/plot/sources/AbstractDObjFigure.cpp index d5ad38682..1f4c3795a 100644 --- a/plot/sources/AbstractDObjFigure.cpp +++ b/plot/sources/AbstractDObjFigure.cpp @@ -445,7 +445,7 @@ ito::RetVal AbstractDObjFigure::setDisplayedCameraChannel(const QString& channel for (int i = 0; i < len; i++) { - if (QLatin1String(channelList[i].data()).compare(channel) == 0) + if (QString::fromLatin1(channelList[i].data()).compare(channel) == 0) { found = true; m_currentDisplayedCameraChannel = channel; From 755d1ac4b8f9790c2d2a13bf785f6beab26c4d7e Mon Sep 17 00:00:00 2001 From: "M. Gronle" <2607303+magro11@users.noreply.github.com> Date: Sat, 11 May 2024 22:55:15 +0200 Subject: [PATCH 62/62] some fixes for multigrabber --- common/sources/addInMultiChannelGrabber.cpp | 14 +++++++------- plot/sources/AbstractDObjFigure.cpp | 7 +++++-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/common/sources/addInMultiChannelGrabber.cpp b/common/sources/addInMultiChannelGrabber.cpp index 261aabc5a..9f3ba61c4 100644 --- a/common/sources/addInMultiChannelGrabber.cpp +++ b/common/sources/addInMultiChannelGrabber.cpp @@ -662,11 +662,11 @@ ito::RetVal AddInMultiChannelGrabber::changeChannelForListener(QObject* listener if (it.key() != newChannel) { - //// temporarily remove the source from the plot - //QMetaObject::invokeMethod(listener, "setSource", Qt::DirectConnection, - // Q_ARG(QSharedPointer, - // QSharedPointer(new ito::DataObject())), - // Q_ARG(ItomSharedSemaphore*, nullptr)); + // temporarily remove the source from the plot + /*QMetaObject::invokeMethod(listener, "setSource", Qt::DirectConnection, + Q_ARG(QSharedPointer, + QSharedPointer(nullptr)), + Q_ARG(ItomSharedSemaphore*, nullptr));*/ // the channel has changed m_autoGrabbingListeners.erase(it); @@ -708,10 +708,10 @@ ito::RetVal AddInMultiChannelGrabber::changeChannelForListener(QObject* listener switch (plotValueAxis) { case Qt::YAxis: - //listener->setProperty("yAxisInterval", QVariant::fromValue(bitRange)); + listener->setProperty("yAxisInterval", QVariant::fromValue(bitRange)); break; default: - //listener->setProperty("zAxisInterval", QVariant::fromValue(bitRange)); + listener->setProperty("zAxisInterval", QVariant::fromValue(bitRange)); break; } } diff --git a/plot/sources/AbstractDObjFigure.cpp b/plot/sources/AbstractDObjFigure.cpp index 1f4c3795a..13e147bbf 100644 --- a/plot/sources/AbstractDObjFigure.cpp +++ b/plot/sources/AbstractDObjFigure.cpp @@ -308,15 +308,18 @@ void AbstractDObjFigure::setSource(QSharedPointer source, ItomS { QSharedPointer oldSource = m_dataPointer["source"]; m_dataPointer["source"] = source; + ito::ParamBase thisParam("source", ito::ParamBase::DObjPtr, (const char*)source.data()); + retval += inputParamChanged(&thisParam); } } else { m_dataPointer["source"] = source; + ito::ParamBase thisParam("source", ito::ParamBase::DObjPtr, (const char*)source.data()); + retval += inputParamChanged(&thisParam); } - ito::ParamBase thisParam("source", ito::ParamBase::DObjPtr, (const char*)source.data()); - retval += inputParamChanged(&thisParam); + } if (waitCond)