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 <QVCamera>
00034 #include <QVWorker>
00035
00036 #include <qvgui/qvplot.h>
00037
00038 QVApplication::QVApplication (int &argc,char **argv, QString infoString,bool GUIenabled) : QApplication(argc,argv,GUIenabled), info(infoString), unusedArguments(), qvps(), visionInterface(NULL), isRunningFlag(FALSE), workerCount(0), terminateOnLastWorker(TRUE), forHelpFlag(FALSE)
00039 {
00040
00041 if (GUIenabled and not QGLFormat::hasOpenGL() )
00042 qFatal("This system has no OpenGL support, and QVision GUI needs it. Exiting.");
00043
00044 qRegisterMetaType< QVariant >("QVariant");
00045 qRegisterMetaType< QVCamera::TCameraStatus >("QVCamera::TCameraStatus");
00046 qRegisterMetaType< QVWorker::TWorkerStatus >("QVWorker::TWorkerStatus");
00047 qRegisterMetaType< QVImage<uChar,1> >("QVImage<uChar,1>");
00048 qRegisterMetaType< QVImage<sShort,1> >("QVImage<sShort,1>");
00049 qRegisterMetaType< QVImage<sFloat,1> >("QVImage<sFloat,1>");
00050 qRegisterMetaType< QVImage<uChar,3> >("QVImage<uChar,3>");
00051 qRegisterMetaType< QVImage<sShort,3> >("QVImage<sShort,3>");
00052 qRegisterMetaType< QVImage<sFloat,3> >("QVImage<sFloat,3>");
00053 qRegisterMetaType< QVPropertyContainerChange >("QVPropertyContainerChange");
00054
00055 unusedArguments = arguments();
00056 unusedArguments.removeAt(0);
00057
00058 if(unusedArguments.contains("--help")) forHelpFlag = TRUE;
00059 }
00060
00061 int QVApplication::exec()
00062 {
00063 qDebug() << "QVApplication::exec()";
00064
00065
00066 if(unusedArguments.contains("--help"))
00067 {
00068 printHelp();
00069 return 0;
00070 }
00071
00072
00073 foreach(QVPropertyContainer* qvp, qvps)
00074 {
00075 QString lastError;
00076 if((lastError = qvp->getLastError()) != QString())
00077 {
00078 std::cerr << "Error initializing QVApplication: "
00079 << qPrintable(lastError) << std::endl;
00080 return -1;
00081 }
00082 }
00083
00084
00085 if(not unusedArguments.isEmpty())
00086 {
00087 foreach(QString argument, unusedArguments)
00088 std::cerr << "Error initializing QVApplication: "
00089 << "unknown command line parameter: "
00090 << qPrintable(argument) << std::endl;
00091 return -1;
00092 }
00093
00094
00095 if (visionInterface)
00096 {
00097 visionInterface->init();
00098 visionInterface->show();
00099 }
00100 qDebug() << "QVApplication::exec(): GUI initied";
00101
00102
00103 if (!startItems()) return -1;
00104
00105 qDebug() << "Entering in QApplication::exec()";
00106 isRunningFlag = TRUE;
00107 int returnvalue = QApplication::exec();
00108 qDebug() << "Back from QApplication::exec()";
00109
00110 qDebug() << "QVApplication::exec() <- return";
00111 return returnvalue;
00112 }
00113
00114 bool QVApplication::startItems()
00115 {
00116
00117
00118
00119 foreach(QVPropertyContainer* qvp, qvps)
00120 {
00121 QVCamera* camera;
00122 if((camera = dynamic_cast<QVCamera*>(qvp)) != NULL)
00123 if(camera->isClosed())
00124 if(not camera->openCam())
00125 {
00126 std::cerr << "Error initializing QVApplication: "
00127 << "could not open camera: "
00128 << qPrintable(camera->getName()) << std::endl;
00129 return false;
00130 }
00131 }
00132 qDebug() << "QVApplication::initItems(): cameras opened";
00133
00134
00135 foreach(QVPropertyContainer* qvp, qvps)
00136 {
00137 QVPlot* plot;
00138 if((plot = dynamic_cast<QVPlot*>(qvp)) != NULL)
00139 {
00140 if (!plot->isInitied()) plot->init();
00141 if (plot->isAutoShow()) plot->show();
00142 }
00143 }
00144 qDebug() << "QVApplication::initItems(): plots initied";
00145
00146
00147 foreach(QVPropertyContainer* qvp, qvps)
00148 {
00149 QVImageCanvas* canvas;
00150 if((canvas = dynamic_cast<QVImageCanvas*>(qvp)) != NULL)
00151 canvas->show();
00152 }
00153 qDebug() << "QVApplication::initItems(): canvas shown";
00154
00155
00156 foreach(QVPropertyContainer* qvp, qvps)
00157 {
00158 QVWorker* worker;
00159 if((worker = dynamic_cast<QVWorker*>(qvp)) != NULL)
00160 {
00161 workerCount++;
00162 worker->moveToThread(worker);
00163 connect(worker,SIGNAL(finished()),this,SLOT(workerFinished()));
00164 worker->start();
00165 }
00166 }
00167 isRunningFlag = TRUE;
00168 qDebug() << "QVApplication::initItems(): workers started";
00169 return true;
00170 }
00171
00172 void QVApplication::quit()
00173 {
00174 quitItems();
00175 deregisterGUI();
00176 this->exit(0);
00177 }
00178
00179 void QVApplication::quitItems()
00180 {
00181 qDebug() << "QVApplication::quitItems()";
00182
00183
00184 foreach(QVPropertyContainer* qvp, qvps)
00185 {
00186 QVWorker* worker;
00187 if((worker = dynamic_cast<QVWorker*>(qvp)) != NULL)
00188 worker->finish();
00189 }
00190
00191
00192 foreach(QVPropertyContainer* qvp, qvps)
00193 {
00194 QVWorker* worker;
00195 if((worker = dynamic_cast<QVWorker*>(qvp)) != NULL)
00196 {
00197
00198
00199 while(not worker->wait(10)) processEvents();
00200 deregisterQVPropertyContainer(worker);
00201 }
00202 }
00203 qDebug() << "QVApplication::quitItems(): workers finished";
00204
00205
00206 foreach(QVPropertyContainer* qvp, qvps)
00207 {
00208 QVImageCanvas* canvas;
00209 if((canvas = dynamic_cast<QVImageCanvas*>(qvp)) != NULL)
00210 {
00211 canvas->hide();
00212 deregisterQVPropertyContainer(canvas);
00213 }
00214 }
00215 qDebug() << "QVApplication::quitItems(): canvas hiden";
00216
00217
00218 foreach(QVPropertyContainer* qvp, qvps)
00219 {
00220 QVPlot* plot;
00221 if((plot = dynamic_cast<QVPlot*>(qvp)) != NULL)
00222 {
00223 plot->stop();
00224 plot->hide();
00225 deregisterQVPropertyContainer(plot);
00226 }
00227 }
00228 qDebug() << "QVApplication::quitItems(): plots initied";
00229
00230
00231 foreach(QVPropertyContainer* qvp, qvps)
00232 {
00233 QVCamera* camera;
00234 if((camera = dynamic_cast<QVCamera*>(qvp)) != NULL)
00235 {
00236 if(!camera->isClosed()) camera->closeCam();
00237 deregisterQVPropertyContainer(camera);
00238 }
00239 }
00240 isRunningFlag = FALSE;
00241 qDebug() << "QVApplication::quitItems(): cameras closed";
00242 }
00243
00244 void QVApplication::quitWorker(QVWorker *worker)
00245 {
00246 if (qvps.contains(worker)) {
00247 worker->finish();
00248
00249 while(not worker->wait(10)) processEvents();
00250 deregisterQVPropertyContainer(worker);
00251
00252
00253 }
00254 }
00255
00256 QStringList QVApplication::getUnusedArguments()
00257 { return unusedArguments; }
00258
00259 void QVApplication::setArgumentAsUsed(QString argument)
00260 {
00261 qDebug() << "QVApplication::setArgumentAsUsed(QString,bool)";
00262 int index = unusedArguments.indexOf(argument);
00263 if(index != -1)
00264 unusedArguments.removeAt(index);
00265 qDebug() << "QVApplication::setArgumentAsUsed(QString,bool) <- return";
00266 }
00267
00268 void QVApplication::registerQVPropertyContainer(QVPropertyContainer *qvp)
00269 {
00270 qDebug() << "QVApplication::registerQVPropertyContainer(" << qvp->getName() << ")";
00271 qvps.insert(qvp);
00272 qDebug() << "QVApplication::registerQVPropertyContainer(" << qvp->getName() << ") -> return";
00273 }
00274
00275 void QVApplication::deregisterQVPropertyContainer(QVPropertyContainer *qvp)
00276 {
00277 qDebug() << "QVApplication::registerQVPropertyContainer(" << qvp->getName() << ")";
00278 qvps.remove(qvp);
00279 qDebug() << "QVApplication::registerQVPropertyContainer(" << qvp->getName() << ") -> return";
00280 }
00281
00282 void QVApplication::registerGUI(QVGUI *visionInterface)
00283 {
00284 this->visionInterface = visionInterface;
00285 }
00286
00287 void QVApplication::deregisterGUI()
00288 {
00289 this->visionInterface = 0;
00290 }
00291
00292 void QVApplication::printHelp() const
00293 {
00294 qDebug() << "QVApplication::printHelp()";
00295
00296 std::cout << "Usage: " << qPrintable(arguments().first())
00297 << " [OPTIONS]" << std::endl;
00298 if (info != QString())
00299 std::cout << qPrintable(info) << std::endl;
00300 std::cout << std::endl;
00301 QSetIterator<QVPropertyContainer *> iq(qvps);
00302 while (iq.hasNext())
00303 {
00304 QString infoHolder = iq.next()->infoInputProperties();
00305 if(infoHolder != QString() )
00306 std::cout << qPrintable(infoHolder) << std::endl;
00307 }
00308 qDebug() << "QVApplication::printHelp() <~ return";
00309 }
00310
00311 void QVApplication::workerFinished()
00312 {
00313 workerCount--;
00314 if(workerCount == 0)
00315 if(terminateOnLastWorker)
00316 quit();
00317 }
00318