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