00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00024
00025 #include <QDebug>
00026 #include <QMetaType>
00027 #include <QSet>
00028 #include <QGLWidget>
00029
00030 #include <QVApplication>
00031 #include <QVGUI>
00032 #include <QVImageCanvas>
00033 #include <QVProcessingBlock>
00034 #include <QMutexLocker>
00035
00036 #ifdef QVQWT
00037 #include "qvguiblocks/qvplot.h"
00038 #endif
00039
00040 QVApplication::QVApplication (int &argc,char **argv, QString infoString,bool GUIenabled) : QApplication(argc,argv,GUIenabled), info(infoString), unusedArguments(), qvps(), visionInterface(NULL), isRunningFlag(FALSE), blockCount(0), terminateOnLastBlock(TRUE), forHelpFlag(FALSE)
00041 {
00042
00043 if (GUIenabled and not QGLFormat::hasOpenGL() )
00044 qFatal("This system has no OpenGL support, and QVision GUI needs it. Exiting.");
00045
00046 qRegisterMetaType< QVariant >("QVariant");
00047
00048 qRegisterMetaType< QVProcessingBlock::TBlockStatus >("QVProcessingBlock::TBlockStatus");
00049 qRegisterMetaType< QVImage<uChar,1> >("QVImage<uChar,1>");
00050 qRegisterMetaType< QVImage<sShort,1> >("QVImage<sShort,1>");
00051 qRegisterMetaType< QVImage<sFloat,1> >("QVImage<sFloat,1>");
00052 qRegisterMetaType< QVImage<uChar,3> >("QVImage<uChar,3>");
00053 qRegisterMetaType< QVImage<sShort,3> >("QVImage<sShort,3>");
00054 qRegisterMetaType< QVImage<sFloat,3> >("QVImage<sFloat,3>");
00055 qRegisterMetaType< QVPropertyContainerChange >("QVPropertyContainerChange");
00056
00057 unusedArguments = arguments();
00058 setApplicationName(unusedArguments[0].split("/").last());
00059 unusedArguments.removeAt(0);
00060
00061 if(unusedArguments.contains("--help")) forHelpFlag = TRUE;
00062
00063 }
00064
00065 int QVApplication::exec()
00066 {
00067 qDebug() << "QVApplication::exec()";
00068
00069
00070 if(unusedArguments.contains("--help"))
00071 {
00072 printHelp();
00073 return 0;
00074 }
00075
00076
00077 foreach(QVPropertyContainer* qvp, qvps)
00078 {
00079 QString lastError;
00080 if((lastError = qvp->getLastError()) != QString())
00081 {
00082 std::cerr << "Error initializing QVApplication: "
00083 << qPrintable(lastError) << std::endl;
00084 return -1;
00085 }
00086 }
00087
00088
00089 if(not unusedArguments.isEmpty())
00090 {
00091 foreach(QString argument, unusedArguments)
00092 std::cerr << "Error initializing QVApplication: "
00093 << "unknown command line parameter: "
00094 << qPrintable(argument) << std::endl;
00095 return -1;
00096 }
00097
00098
00099 if (visionInterface)
00100 {
00101 visionInterface->init();
00102 visionInterface->show();
00103 }
00104 qDebug() << "QVApplication::exec(): GUI initied";
00105
00106
00107 if (!startItems()) return -1;
00108
00109 qDebug() << "Entering in QApplication::exec()";
00110 isRunningFlag = TRUE;
00111 int returnvalue = QApplication::exec();
00112 qDebug() << "Back from QApplication::exec()";
00113
00114 qDebug() << "QVApplication::exec() <- return";
00115 return returnvalue;
00116 }
00117
00118 bool QVApplication::startItems()
00119 {
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146 #ifdef QVQWT
00147 foreach(QVPropertyContainer* qvp, qvps)
00148 {
00149 QVPlot* plot;
00150 if((plot = dynamic_cast<QVPlot*>(qvp)) != NULL)
00151 {
00152 if (!plot->isInitied()) plot->init();
00153 if (plot->isAutoShow()) plot->show();
00154 }
00155 }
00156 qDebug() << "QVApplication::initItems(): plots initied";
00157 #endif
00158
00159
00160 foreach(QVPropertyContainer* qvp, qvps)
00161 {
00162 QVImageCanvas* canvas;
00163 if((canvas = dynamic_cast<QVImageCanvas*>(qvp)) != NULL)
00164 canvas->show();
00165 }
00166 qDebug() << "QVApplication::initItems(): canvas shown";
00167
00168
00169 foreach(QVPropertyContainer* qvp, qvps)
00170 {
00171 QVProcessingBlock* block;
00172 if((block = dynamic_cast<QVProcessingBlock*>(qvp)) != NULL)
00173 {
00174 QVProcessingBlock* masterBlock;
00175
00176 if((masterBlock = dynamic_cast<QVProcessingBlock*>(qvp->getMaster())) != NULL)
00177 block->moveToThread(masterBlock);
00178 connect(block,SIGNAL(finished()),this,SLOT(blockFinished()));
00179
00180 if (block->isSequentialGroupMaster()) {
00181 blockCount++;
00182 block->start();
00183 }
00184 }
00185 }
00186 isRunningFlag = TRUE;
00187 qDebug() << "QVApplication::initItems(): blocks started";
00188 return true;
00189 }
00190
00191 void QVApplication::quit()
00192 {
00193 quitItems();
00194 deregisterGUI();
00195 this->exit(0);
00196 }
00197
00198 void QVApplication::quitItems()
00199 {
00200 qDebug() << "QVApplication::quitItems()";
00201
00202
00203 foreach(QVPropertyContainer* qvp, qvps)
00204 {
00205 QVProcessingBlock* block;
00206 if((block = dynamic_cast<QVProcessingBlock*>(qvp)) != NULL)
00207 block->finish();
00208 }
00209
00210
00211 foreach(QVPropertyContainer* qvp, qvps)
00212 {
00213 QVProcessingBlock* block;
00214 if((block = dynamic_cast<QVProcessingBlock*>(qvp)) != NULL)
00215 {
00216
00217
00218
00219 while(not block->wait(10)) processEvents();
00220 deregisterQVPropertyContainer(block);
00221 }
00222 }
00223 qDebug() << "QVApplication::quitItems(): blocks finished";
00224
00225
00226 foreach(QVPropertyContainer* qvp, qvps)
00227 {
00228 QVImageCanvas* canvas;
00229 if((canvas = dynamic_cast<QVImageCanvas*>(qvp)) != NULL)
00230 {
00231 canvas->hide();
00232 deregisterQVPropertyContainer(canvas);
00233 }
00234 }
00235 qDebug() << "QVApplication::quitItems(): canvas hiden";
00236
00237 #ifdef QVQWT
00238
00239 foreach(QVPropertyContainer* qvp, qvps)
00240 {
00241 QVPlot* plot;
00242 if((plot = dynamic_cast<QVPlot*>(qvp)) != NULL)
00243 {
00244 plot->stop();
00245 plot->hide();
00246 deregisterQVPropertyContainer(plot);
00247 }
00248 }
00249 qDebug() << "QVApplication::quitItems(): plots initied";
00250 #endif
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264 isRunningFlag = FALSE;
00265 }
00266
00267 void QVApplication::quitBlock(QVProcessingBlock *block)
00268 {
00269 if (qvps.contains(block)) {
00270 block->finish();
00271
00272 while(not block->wait(10)) processEvents();
00273 deregisterQVPropertyContainer(block);
00274
00275
00276 }
00277 }
00278
00279 QStringList QVApplication::getUnusedArguments()
00280 { return unusedArguments; }
00281
00282 void QVApplication::setArgumentAsUsed(QString argument)
00283 {
00284 qDebug() << "QVApplication::setArgumentAsUsed(QString,bool)";
00285 int index = unusedArguments.indexOf(argument);
00286 if(index != -1)
00287 unusedArguments.removeAt(index);
00288 qDebug() << "QVApplication::setArgumentAsUsed(QString,bool) <- return";
00289 }
00290
00291 #ifndef DOXYGEN_IGNORE_THIS
00292 void QVApplication::registerQVPropertyContainer(QVPropertyContainer *qvp)
00293 {
00294 qDebug() << "QVApplication::registerQVPropertyContainer(" << qvp->getName() << ")";
00295 qvps.insert(qvp);
00296 qDebug() << "QVApplication::registerQVPropertyContainer(" << qvp->getName() << ") -> return";
00297 }
00298
00299 void QVApplication::deregisterQVPropertyContainer(QVPropertyContainer *qvp)
00300 {
00301 qDebug() << "QVApplication::registerQVPropertyContainer(" << qvp->getName() << ")";
00302 qvps.remove(qvp);
00303 qDebug() << "QVApplication::registerQVPropertyContainer(" << qvp->getName() << ") -> return";
00304 }
00305
00306 void QVApplication::registerGUI(QVGUI *visionInterface)
00307 {
00308 this->visionInterface = visionInterface;
00309 }
00310
00311 void QVApplication::deregisterGUI()
00312 {
00313 this->visionInterface = 0;
00314 }
00315 #endif
00316
00317 void QVApplication::printHelp()
00318 {
00319 std::cout << qPrintable(getHelp());
00320 }
00321
00322 void QVApplication::blockFinished()
00323 {
00324 blockCount--;
00325 if(blockCount == 0)
00326 if(terminateOnLastBlock)
00327 quit();
00328 }
00329
00330 QString QVApplication::getHelp()
00331 {
00332 QString help_string;
00333
00334 help_string = "Usage: " + applicationName() + " [OPTIONS]\n\n";
00335
00336 if (info != QString())
00337 help_string = help_string + qPrintable(info) + "\n\n";
00338
00339 QSetIterator<QVPropertyContainer *> iq(qvps);
00340 while (iq.hasNext())
00341 {
00342 QString infoHolder = iq.next()->infoInputProperties();
00343 if(infoHolder != QString() )
00344 help_string += infoHolder + "\n";
00345 }
00346
00347 return help_string;
00348
00349 }