12 #define _USE_MATH_DEFINES
20 #include <vtkDoubleArray.h>
21 #include <QCoreApplication>
49 connect(
settings(), SIGNAL(valueChangedFor(QString)),
this, SLOT(globalConfigurationFileChangedSlot(QString)));
51 this->setConfigurationFile(
profile()->getToolConfigFilePath());
56 this->destroyTrackerThread();
69 void TrackingSystemIGSTKService::configure()
82 CX_LOG_DEBUG() <<
"TrackingSystemIGSTKService::configure(): Not using IGSTK tracking.";
87 std::vector<ToolFileParser::TrackerInternalStructure> trackers = configParser.getTrackers();
95 ToolFileParser::TrackerInternalStructure trackerStructure = trackers[0];
98 std::vector<ToolFileParser::ToolInternalStructurePtr> toolStructures;
99 QString referenceToolFile = configParser.getAbsoluteReferenceFilePath();
100 std::vector<QString> toolfiles = configParser.getAbsoluteToolFilePaths();
101 for (std::vector<QString>::iterator it = toolfiles.begin(); it != toolfiles.end(); ++it)
105 if ((*it) == referenceToolFile)
106 referenceToolStructure = internalTool;
108 toolStructures.push_back(internalTool);
112 mTrackerThread.reset(
new IgstkTrackerThread(trackerStructure, toolStructures, referenceToolStructure));
114 connect(mTrackerThread.get(), SIGNAL(
configured(
bool)),
this, SLOT(trackerConfiguredSlot(
bool)));
115 connect(mTrackerThread.get(), SIGNAL(
initialized(
bool)),
this, SLOT(initializedSlot(
bool)));
116 connect(mTrackerThread.get(), SIGNAL(tracking(
bool)),
this, SLOT(trackerTrackingSlot(
bool)));
117 connect(mTrackerThread.get(), SIGNAL(error()),
this, SLOT(uninitialize()));
121 mTrackerThread->start();
124 void TrackingSystemIGSTKService::trackerConfiguredSlot(
bool on)
134 reportDebug(
"Received a configured signal in ToolManager, but we don't have a mTrackerThread, this should never happen, contact programmer.");
140 std::map<QString, IgstkToolPtr> igstkTools = mTrackerThread->getTools();
141 IgstkToolPtr reference = mTrackerThread->getRefereceTool();
142 std::map<QString, IgstkToolPtr>::iterator it = igstkTools.begin();
143 for (; it != igstkTools.end(); ++it)
149 mTools.push_back(tool);
152 reportWarning(
"Creation of the cxTool " + it->second->getUid() +
" failed.");
167 void TrackingSystemIGSTKService::deconfigure()
174 connect(
this, SIGNAL(
uninitialized()),
this, SLOT(deconfigureAfterUninitializedSlot()));
175 this->uninitialize();
180 this->destroyTrackerThread();
187 report(
"IGSTK Tracking Service is deconfigured.");
190 void TrackingSystemIGSTKService::initialize()
194 connect(
this, SIGNAL(
configured()),
this, SLOT(initializeAfterConfigSlot()));
201 reportWarning(
"Please configure before trying to initialize.");
206 if (!this->createSymlink())
214 mTrackerThread->initialize(
true);
216 reportError(
"Cannot initialize the tracking system because the tracking thread does not exist.");
219 void TrackingSystemIGSTKService::uninitialize()
223 connect(
this, SIGNAL(
trackingStopped()),
this, SLOT(uninitializeAfterTrackingStoppedSlot()));
224 this->stopTracking();
233 mTrackerThread->initialize(
false);
242 bool TrackingSystemIGSTKService::createSymlink()
245 QFileInfo symlink = this->getSymlink();
246 QDir linkDir(symlink.absolutePath());
247 QString linkfile = symlink.absoluteFilePath();
250 if (!linkDir.exists())
253 QString(
"Folder %1 does not exist. It is required to exist and be writable in order to connect to IGSTK. Create it and set the correct permission.").arg(linkDir.path()));
257 QDir devDir(
"/dev/");
261 filters <<
"cu.usbserial*" <<
"cu.KeySerial*" <<
"serial" <<
"ttyUSB*";
263 QStringList files = devDir.entryList(filters, QDir::System);
268 QString(
"No usb connections found in /dev using filters %1").arg(filters.join(
";")));
273 report(QString(
"Device files: %1").arg(files.join(
",")));
274 if (files.size() > 1)
276 QString(
"More than one tracker connected? Will only try to connect to: %1").arg(files[0]));
279 QString device = devDir.filePath(files[0]);
282 QFile(linkfile).remove();
283 QFile devFile(device);
284 QFileInfo devFileInfo(device);
285 if (!devFileInfo.isWritable())
287 reportError(QString(
"Device %1 is not writable. Connection will fail.").arg(device));
291 bool val = devFile.link(linkfile);
295 QString(
"Symlink %1 creation to device %2 failed with code %3").arg(linkfile).arg(device).arg(
301 report(QString(
"Created symlink %1 to device %2").arg(linkfile).arg(device));
304 devFile.setPermissions(
305 QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner | QFile::ReadGroup | QFile::WriteGroup
306 | QFile::ExeGroup | QFile::ReadOther | QFile::WriteOther | QFile::ExeOther);
310 QFileInfo TrackingSystemIGSTKService::getSymlink()
const
312 QString name(
"/Library/CustusX/igstk.links");
314 QDir::root().mkdir(name);
315 QString linkFile = linkDir.path() +
"/cu.CustusX.dev0";
316 return QFileInfo(linkDir, linkFile);
321 void TrackingSystemIGSTKService::cleanupSymlink()
323 report(
"Cleaning up symlinks.");
324 QFile(this->getSymlink().absoluteFilePath()).remove();
328 void TrackingSystemIGSTKService::startTracking()
332 connect(
this, SIGNAL(
initialized()),
this, SLOT(startTrackingAfterInitSlot()));
338 mTrackerThread->track(
true);
341 void TrackingSystemIGSTKService::stopTracking()
348 mTrackerThread->track(
false);
351 void TrackingSystemIGSTKService::setConfigurationFile(QString configurationFile)
358 connect(
this, SIGNAL(
deconfigured()),
this, SLOT(configureAfterDeconfigureSlot()));
372 connect(
this, SIGNAL(
deconfigured()),
this, SLOT(configureAfterDeconfigureSlot()));
379 void TrackingSystemIGSTKService::initializedSlot(
bool value)
391 report(
"IGSTK Tracking Service is uninitialized.");
397 void TrackingSystemIGSTKService::trackerTrackingSlot(
bool value)
415 void TrackingSystemIGSTKService::startTrackingAfterInitSlot()
417 disconnect(
this, SIGNAL(
initialized()),
this, SLOT(startTrackingAfterInitSlot()));
418 this->startTracking();
421 void TrackingSystemIGSTKService::initializeAfterConfigSlot()
423 disconnect(
this, SIGNAL(
configured()),
this, SLOT(initializeAfterConfigSlot()));
427 void TrackingSystemIGSTKService::uninitializeAfterTrackingStoppedSlot()
429 disconnect(
this, SIGNAL(
trackingStopped()),
this, SLOT(uninitializeAfterTrackingStoppedSlot()));
430 this->uninitialize();
433 void TrackingSystemIGSTKService::deconfigureAfterUninitializedSlot()
435 disconnect(
this, SIGNAL(
uninitialized()),
this, SLOT(deconfigureAfterUninitializedSlot()));
439 void TrackingSystemIGSTKService::configureAfterDeconfigureSlot()
441 disconnect(
this, SIGNAL(
deconfigured()),
this, SLOT(configureAfterDeconfigureSlot()));
445 void TrackingSystemIGSTKService::globalConfigurationFileChangedSlot(QString key)
447 if (key ==
"toolConfigFile")
449 this->setConfigurationFile(
profile()->getToolConfigFilePath());
461 void TrackingSystemIGSTKService::destroyTrackerThread()
465 mTrackerThread->quit();
466 mTrackerThread->wait(2000);
467 if (mTrackerThread->isRunning())
469 mTrackerThread->terminate();
470 mTrackerThread->wait();
472 QObject::disconnect(mTrackerThread.get());
473 mTrackerThread.reset();