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();
98 std::vector<ToolFileParser::ToolInternalStructurePtr> toolStructures;
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();
cxResource_EXPORT ProfilePtr profile()
void reportError(QString msg)
TrackingSystemIGSTKService()
void uninitialized()
system is uninitialized
virtual TrackerConfigurationPtr getConfiguration()
QString getTrackingSystemImplementation()
boost::shared_ptr< class IgstkTool > IgstkToolPtr
QString mConfigurationFilePath
path to the configuration file
virtual void setLoggingFolder(QString loggingFolder)
void stateChanged()
Reset time synchronization. Used for resetting time synchronization of incoming timestamps in OpenIGT...
QString getAbsoluteReferenceFilePath()
const char * TRACKING_SYSTEM_IMPLEMENTATION_IGSTK
boost::shared_ptr< class TrackerConfiguration > TrackerConfigurationPtr
void updateTrackingSystemImplementation(QString trackingSystemImplementation)
QString mLoggingFolder
path to where logging should be saved
void reportWarning(QString msg)
void trackingStarted()
system starts tracking
Class for reading the files defining a CustusX tool.
Settings * settings()
Shortcut for accessing the settings instance.
virtual bool isInitialized() const
void reportSuccess(QString msg)
void trackingStopped()
system stops tracking
std::vector< QString > getAbsoluteToolFilePaths()
virtual bool isConfigured() const
virtual bool isTracking() const
std::vector< ToolFileParser::TrackerInternalStructure > getTrackers()
void initialized()
system is initialized
Thread containing all of IGSTK.
void configured()
system is configured
boost::shared_ptr< ToolUsingIGSTK > ToolUsingIGSTKPtr
void internalSetState(Tool::State val)
virtual ~TrackingSystemIGSTKService()
virtual std::vector< ToolPtr > getTools()
virtual void setState(const Tool::State val)
asynchronously request a state. Wait for signal stateChanged()
void reportDebug(QString msg)
Namespace for all CustusX production code.