00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "QmitkNDIConfigurationWidget.h"
00019 #include <QTableWidget>
00020 #include <QMessageBox>
00021 #include <QFileDialog>
00022 #include <QInputDialog>
00023 #include <QDir>
00024 #include <QFileInfo>
00025
00026 #include "QmitkCustomVariants.h"
00027
00028
00029 #include "QmitkNDIToolDelegate.h"
00030
00031
00032 QmitkNDIConfigurationWidget::QmitkNDIConfigurationWidget(QWidget* parent)
00033 : QWidget(parent), m_Controls(NULL), m_Tracker(NULL), m_Source(NULL),
00034 m_Delegate(NULL)
00035 {
00036 this->CreateQtPartControl(this);
00037 }
00038
00039
00040 QmitkNDIConfigurationWidget::~QmitkNDIConfigurationWidget()
00041 {
00042 m_Controls = NULL;
00043 m_Tracker = NULL;
00044 m_Source = NULL;
00045 }
00046
00047
00048 void QmitkNDIConfigurationWidget::CreateQtPartControl(QWidget *parent)
00049 {
00050 if (!m_Controls)
00051 {
00052
00053 m_Controls = new Ui::QmitkNDIConfigurationWidget;
00054 m_Controls->setupUi(parent);
00055 QStringList comPorts;
00056 #ifdef WIN32
00057 comPorts << "COM1" << "COM2" << "COM3" << "COM4" << "COM5" << "COM6" << "COM7" << "COM8" << "COM9";
00058 #else
00059 comPorts << "/dev/ttyS1" << "/dev/ttyS2" << "/dev/ttyS3" << "/dev/ttyS4" << "/dev/ttyS5" << "/dev/ttyUSB0" << "/dev/ttyUSB1" << "/dev/ttyUSB2" << "/dev/ttyUSB3";
00060 #endif
00061 m_Controls->m_ComPortSelector->addItems(comPorts);
00062 m_Delegate = new QmitkNDIToolDelegate(m_Controls->m_ToolTable);
00063 m_Delegate->SetDataStorage(NULL);
00064 m_Delegate->SetPredicate(NULL);
00065 m_Delegate->SetTypes(QStringList());
00066 m_Controls->m_ToolTable->setItemDelegate(m_Delegate);
00067 this->CreateConnections();
00068 this->HidePolarisOptionsGroupbox(true);
00069 this->HideAuroraOptionsGroupbox(true);
00070 }
00071 }
00072
00073
00074 void QmitkNDIConfigurationWidget::CreateConnections()
00075 {
00076 connect(m_Controls->m_Connect, SIGNAL(clicked()), this, SLOT(OnConnect()));
00077 connect(m_Controls->m_DiscoverToolsBtn, SIGNAL(clicked()), this, SLOT(OnDiscoverTools()));
00078 connect(m_Controls->m_AddToolBtn, SIGNAL(clicked()), this, SLOT(OnAddPassiveTool()));
00079 connect(m_Controls->m_DisoverDevicesBtn, SIGNAL(clicked()), this, SLOT(OnDiscoverDevices()));
00080 connect(m_Controls->m_ToolTable->model(), SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(UpdateTrackerFromToolTable(const QModelIndex &, const QModelIndex &)));
00081 }
00082
00083
00084 void QmitkNDIConfigurationWidget::OnConnect()
00085 {
00086 if (m_Tracker.IsNotNull())
00087 {
00088 m_Tracker->CloseConnection();
00089 m_Tracker = NULL;
00090 }
00091 this->CreateTracker();
00092
00093 this->SetupTracker();
00094 bool okay = m_Tracker->OpenConnection();
00095 if (okay)
00096 {
00097
00098 if(m_Tracker->GetType() == mitk::NDIPolaris)
00099 {
00100 this->HideAuroraOptionsGroupbox(true);
00101 this->HidePolarisOptionsGroupbox(false);
00102 }
00103 else if(m_Tracker->GetType() == mitk::NDIAurora)
00104 {
00105 this->HidePolarisOptionsGroupbox(true);
00106 this->HideAuroraOptionsGroupbox(false);
00107 }
00108
00109 this->UpdateWidgets();
00110 this->UpdateToolTable();
00111 emit ToolsAdded(this->GetToolNamesList());
00112 emit Connected();
00113 }
00114 else
00115 {
00116 QMessageBox::warning(NULL, "Error", QString("Connection failed. Tracking device error message is '%1'").arg(m_Tracker->GetErrorMessage()));
00117 m_Tracker->CloseConnection();
00118 this->m_Tracker = NULL;
00119 }
00120 }
00121
00122
00123 void QmitkNDIConfigurationWidget::OnDisconnect()
00124 {
00125 if (m_Tracker.IsNull())
00126 return;
00127 m_Tracker->CloseConnection();
00128 m_Tracker = NULL;
00129
00130 this->UpdateToolTable();
00131 this->UpdateWidgets();
00132 emit ToolsAdded(this->GetToolNamesList());
00133 emit Disconnected();
00134
00135 this->HidePolarisOptionsGroupbox(true);
00136 this->HideAuroraOptionsGroupbox(true);
00137 }
00138
00139
00140 void QmitkNDIConfigurationWidget::UpdateWidgets()
00141 {
00142 m_Controls->m_DeviceStatus->setText(this->GetStatusText());
00143 if (m_Tracker.IsNull())
00144 {
00145 m_Controls->m_Connect->setText("Connect");
00146 m_Controls->m_lConnection->setText("III. Enable connection to device ");
00147
00148 disconnect(m_Controls->m_Connect, SIGNAL(clicked()), this, SLOT(OnDisconnect()));
00149 connect(m_Controls->m_Connect, SIGNAL(clicked()), this, SLOT(OnConnect()));
00150 m_Controls->m_DiscoverToolsBtn->setDisabled(true);
00151 m_Controls->m_AddToolBtn->setDisabled(true);
00152 return;
00153 }
00154
00155 if (m_Tracker->GetState() == mitk::TrackingDevice::Setup)
00156 {
00157 m_Controls->m_Connect->setText("Connect");
00158 m_Controls->m_lConnection->setText("III. Enable connection to device ");
00159 disconnect(m_Controls->m_Connect, SIGNAL(clicked()), this, SLOT(OnDisconnect()));
00160 connect(m_Controls->m_Connect, SIGNAL(clicked()), this, SLOT(OnConnect()));
00161 m_Controls->m_DiscoverToolsBtn->setDisabled(true);
00162 m_Controls->m_AddToolBtn->setDisabled(true);
00163 return;
00164 }
00165 if ((m_Tracker->GetState() == mitk::TrackingDevice::Ready) || (m_Tracker->GetState() == mitk::TrackingDevice::Tracking))
00166 {
00167 m_Controls->m_Connect->setText("Disconnect");
00168 m_Controls->m_lConnection->setText("III. Disable connection to device ");
00169 disconnect(m_Controls->m_Connect, SIGNAL(clicked()), this, SLOT(OnConnect()));
00170 connect(m_Controls->m_Connect, SIGNAL(clicked()), this, SLOT(OnDisconnect()));
00171 m_Controls->m_DiscoverToolsBtn->setEnabled(true);
00172 m_Controls->m_AddToolBtn->setEnabled(true);
00173 }
00174 }
00175
00176
00177 QString QmitkNDIConfigurationWidget::GetStatusText()
00178 {
00179 if (m_Tracker.IsNull())
00180 return QString("Not connected");
00181
00182 QString devName;
00183 switch (m_Tracker->GetType())
00184 {
00185 case mitk::NDIAurora:
00186 devName = "NDI Aurora";
00187 break;
00188 case mitk::NDIPolaris:
00189 devName = "NDI Polaris";
00190 break;
00191 case mitk::TrackingSystemNotSpecified:
00192 default:
00193 devName = "unknown tracking device";
00194 break;
00195 }
00196 if (m_Tracker->GetState() == mitk::TrackingDevice::Ready)
00197 return QString("Connected to %1 on %2. Device is ready.").arg(devName).arg(m_Tracker->GetDeviceName());
00198 if (m_Tracker->GetState() == mitk::TrackingDevice::Tracking)
00199 return QString("%1 is tracking.").arg(devName);
00200 return QString("");
00201 }
00202
00203
00204 void QmitkNDIConfigurationWidget::OnDiscoverTools()
00205 {
00206 if (m_Tracker.IsNull())
00207 {
00208 QMessageBox::warning(NULL, "Error", QString("Connection failed. No tracking device found."));
00209 return;
00210 }
00211 m_Tracker->DiscoverWiredTools();
00212 this->UpdateToolTable();
00213 emit ToolsAdded(this->GetToolNamesList());
00214 }
00215
00216
00217 void QmitkNDIConfigurationWidget::OnAddPassiveTool()
00218 {
00219 if (m_Tracker.IsNull())
00220 this->CreateTracker();
00221
00222 QStringList filenames = QFileDialog::getOpenFileNames(this, "Select NDI SROM file", QDir::currentPath(),"NDI SROM files (*.rom)");
00223 if (filenames.isEmpty())
00224 {
00225 this->m_Tracker = NULL;
00226 return;
00227 }
00228 foreach(QString fileName, filenames)
00229 {
00230
00231
00232
00233 m_Tracker->AddTool(QFileInfo(fileName).baseName().toLatin1(), fileName.toLatin1());
00234 }
00235 emit ToolsAdded(this->GetToolNamesList());
00236 this->UpdateToolTable();
00237 }
00238
00239
00240 void QmitkNDIConfigurationWidget::CreateTracker()
00241 {
00242 m_Tracker = mitk::NDITrackingDevice::New();
00243 }
00244
00245
00246 void QmitkNDIConfigurationWidget::SetupTracker()
00247 {
00248 if (m_Tracker.IsNull())
00249 return;
00250 m_Tracker->SetDeviceName(this->GetDeviceName());
00251 m_Tracker->SetBaudRate(mitk::SerialCommunication::BaudRate115200);
00252 }
00253
00254
00255 std::string QmitkNDIConfigurationWidget::GetDeviceName() const
00256 {
00257 if (m_Controls == NULL)
00258 return NULL;
00259 return m_Controls->m_ComPortSelector->currentText().toStdString();
00260 }
00261
00262
00263 void QmitkNDIConfigurationWidget::SetDeviceName( const char* dev )
00264 {
00265 if (m_Controls == NULL)
00266 return;
00267 m_Controls->m_ComPortSelector->setCurrentIndex(m_Controls->m_ComPortSelector->findText(dev));
00268 }
00269
00270
00271 void QmitkNDIConfigurationWidget::UpdateToolTable()
00272 {
00273 disconnect(m_Controls->m_ToolTable, SIGNAL(itemChanged(QTableWidgetItem*)), this, SLOT(OnTableItemChanged(QTableWidgetItem*)));
00274 disconnect(m_Controls->m_ToolTable->model(), SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(UpdateTrackerFromToolTable(const QModelIndex &, const QModelIndex &)));
00275 m_Controls->m_ToolTable->clearContents();
00276 m_Controls->m_ToolTable->setRowCount(0);
00277 if (m_Tracker.IsNull() || (m_Controls == NULL))
00278 return;
00279
00280 m_Controls->m_ToolTable->setRowCount(m_Tracker->GetToolCount());
00281 for (unsigned int i = 0; i < m_Tracker->GetToolCount(); ++i)
00282 {
00283 mitk::TrackingTool* t = m_Tracker->GetTool(i);
00284 if (t == NULL)
00285 {
00286 m_Controls->m_ToolTable->setItem(i, QmitkNDIToolDelegate::IndexCol, new QTableWidgetItem("INVALID"));
00287 continue;
00288 }
00289 m_Controls->m_ToolTable->setItem(i, QmitkNDIToolDelegate::IndexCol, new QTableWidgetItem(QString::number(i)));
00290 m_Controls->m_ToolTable->setItem(i, QmitkNDIToolDelegate::NameCol, new QTableWidgetItem(t->GetToolName()));
00291 if (dynamic_cast<mitk::NDIPassiveTool*>(t)->GetSROMDataLength() > 0)
00292 m_Controls->m_ToolTable->setItem(i, QmitkNDIToolDelegate::SROMCol, new QTableWidgetItem("SROM file loaded"));
00293 else
00294 m_Controls->m_ToolTable->setItem(i, QmitkNDIToolDelegate::SROMCol, new QTableWidgetItem("<click to load SROM file>"));
00295 m_Controls->m_ToolTable->setItem(i, QmitkNDIToolDelegate::TypeCol, new QTableWidgetItem("<click to set type>"));
00296 if (t->IsEnabled())
00297 m_Controls->m_ToolTable->setItem(i, QmitkNDIToolDelegate::StatusCol, new QTableWidgetItem("Enabled"));
00298 else
00299 m_Controls->m_ToolTable->setItem(i, QmitkNDIToolDelegate::StatusCol, new QTableWidgetItem("Disabled"));
00300 m_Controls->m_ToolTable->setItem(i, QmitkNDIToolDelegate::NodeCol, new QTableWidgetItem("<click to select node>"));
00301
00302 m_Controls->m_ToolTable->item(i, QmitkNDIToolDelegate::IndexCol)->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);
00303 m_Controls->m_ToolTable->item(i, QmitkNDIToolDelegate::NodeCol)->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);
00304 m_Controls->m_ToolTable->item(i, QmitkNDIToolDelegate::SROMCol)->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);
00305 m_Controls->m_ToolTable->item(i, QmitkNDIToolDelegate::TypeCol)->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);
00306 m_Controls->m_ToolTable->item(i, QmitkNDIToolDelegate::StatusCol)->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);
00307 m_Controls->m_ToolTable->item(i, QmitkNDIToolDelegate::NodeCol)->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);
00308 }
00309 m_Controls->m_ToolTable->resizeColumnsToContents();
00310 connect(m_Controls->m_ToolTable, SIGNAL(itemChanged(QTableWidgetItem*)), this, SLOT(OnTableItemChanged(QTableWidgetItem*)));
00311 connect(m_Controls->m_ToolTable->model(), SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(UpdateTrackerFromToolTable(const QModelIndex &, const QModelIndex &)));
00312 }
00313
00314
00315 void QmitkNDIConfigurationWidget::OnDiscoverDevices()
00316 {
00317 PortDeviceMap portsAndDevices;
00318 QString status = "Scanning ";
00319 for (unsigned int i = 1; i < 10; ++i)
00320 {
00321 QString devName = QString("COM%1").arg(i);
00322 portsAndDevices[devName];
00323 status += devName + ", ";
00324 }
00325 status.chop(2);
00326 status += " for NDI tracking devices...";
00327 m_Controls->m_DeviceStatus->setText(status);
00328 ScanPortsForNDITrackingDevices(portsAndDevices);
00329 QString result = "The following tracking devices were found:<BR/>\n";
00330 for (PortDeviceMap::const_iterator it = portsAndDevices.begin(); it != portsAndDevices.end(); ++it)
00331 {
00332 result += it.key() + ": ";
00333 switch (it.value())
00334 {
00335 case mitk::NDIPolaris:
00336 result += "NDI Polaris<BR/>\n";
00337 break;
00338 case mitk::NDIAurora:
00339 result += "NDI Aurora<BR/>\n";
00340 break;
00341 default:
00342 result += "No NDI tracking device found<BR/>\n";
00343 }
00344 }
00345
00346 m_Controls->m_DeviceStatus->setText(result);
00347 }
00348
00349
00350 mitk::TrackingDeviceType QmitkNDIConfigurationWidget::ScanPort(QString port)
00351 {
00352 mitk::NDITrackingDevice::Pointer tracker = mitk::NDITrackingDevice::New();
00353 tracker->SetDeviceName(port.toStdString());
00354 return tracker->TestConnection();
00355 }
00356
00357
00358 void QmitkNDIConfigurationWidget::ScanPortsForNDITrackingDevices( PortDeviceMap& portsAndDevices )
00359 {
00360
00361 for (PortDeviceMap::iterator it = portsAndDevices.begin(); it != portsAndDevices.end(); ++it)
00362 it.value() = this->ScanPort(it.key());
00363
00364
00365
00366
00367 }
00368
00369
00370 QStringList QmitkNDIConfigurationWidget::GetToolNamesList()
00371 {
00372 QStringList toolNames;
00373 if (m_Tracker.IsNull())
00374 return toolNames;
00375 for (unsigned int i = 0; i < m_Tracker->GetToolCount(); ++i)
00376 {
00377 mitk::TrackingTool* t = m_Tracker->GetTool(i);
00378 if (t == NULL)
00379 continue;
00380 toolNames << t->GetToolName();
00381 }
00382 return toolNames;
00383 }
00384
00385
00386 mitk::NDITrackingDevice* QmitkNDIConfigurationWidget::GetTracker() const
00387 {
00388 return m_Tracker.GetPointer();
00389 }
00390
00391
00392 void QmitkNDIConfigurationWidget::SetToolTypes(const QStringList& types)
00393 {
00394 m_Delegate->SetTypes(types);
00395 }
00396
00397
00398 void QmitkNDIConfigurationWidget::SetDataStorage(mitk::DataStorage* ds)
00399 {
00400 m_Delegate->SetDataStorage(ds);
00401 }
00402
00403
00404 void QmitkNDIConfigurationWidget::SetPredicate(mitk::NodePredicateBase::Pointer p)
00405 {
00406 m_Delegate->SetPredicate(p);
00407 }
00408
00409
00410 void QmitkNDIConfigurationWidget::SetTagPropertyName( const std::string& name )
00411 {
00412 m_Delegate->SetTagPropertyName(name);
00413 }
00414
00415
00416 void QmitkNDIConfigurationWidget::SetTagProperty( mitk::BaseProperty::Pointer prop )
00417 {
00418 m_Delegate->SetTagProperty(prop);
00419 }
00420
00421
00422 void QmitkNDIConfigurationWidget::UpdateTrackerFromToolTable(const QModelIndex & topLeft, const QModelIndex & )
00423 {
00424
00425 if (topLeft.column()<1)
00426 return;
00427
00428 if (m_Tracker.IsNull())
00429 return;
00430
00431 if (topLeft.row() >= (int) m_Tracker->GetToolCount())
00432 return;
00433
00434 QAbstractItemModel* model = m_Controls->m_ToolTable->model();
00435
00436
00437
00438 mitk::NDIPassiveTool* tool = dynamic_cast<mitk::NDIPassiveTool*> (m_Tracker->GetTool(topLeft.row()));
00439 if (tool == NULL)
00440 return;
00441
00442 switch (topLeft.column())
00443 {
00444 case 0:
00445 break;
00446 case 1:
00447 tool->SetToolName(model->data(model->index(topLeft.row(), 1)).toString().toLatin1());
00448 emit ToolsChanged();
00449 break;
00450 case QmitkNDIToolDelegate::SROMCol:
00451 {
00452 QString romfile = model->data(model->index(topLeft.row(), QmitkNDIToolDelegate::SROMCol)).toString();
00453 if (QFileInfo(romfile).exists())
00454 tool->LoadSROMFile(romfile.toLatin1());
00455 m_Tracker->InitializeWiredTools();
00456 break;
00457 }
00458
00459
00460 default:
00461 break;
00462 }
00463
00464 }
00465
00466
00467 const QString QmitkNDIConfigurationWidget::GetToolType( unsigned int index ) const
00468 {
00469 if (m_Controls == NULL)
00470 return QString("");
00471
00472 QAbstractItemModel* model = m_Controls->m_ToolTable->model();
00473 QModelIndex modelIndex = model->index(index, QmitkNDIToolDelegate::TypeCol);
00474 if (modelIndex.isValid() == false)
00475 return QString("");
00476
00477 return model->data(modelIndex).toString();
00478 }
00479
00480
00481 const QString QmitkNDIConfigurationWidget::GetToolName( unsigned int index ) const
00482 {
00483 if (m_Controls == NULL)
00484 return QString("");
00485
00486 QAbstractItemModel* model = m_Controls->m_ToolTable->model();
00487 QModelIndex modelIndex = model->index(index, QmitkNDIToolDelegate::NameCol);
00488 if (modelIndex.isValid() == false)
00489 return QString("");
00490
00491 return model->data(modelIndex).toString();
00492 }
00493
00494
00495 QMap<QString, unsigned int> QmitkNDIConfigurationWidget::GetToolAndTypes() const
00496 {
00497 QMap<QString, unsigned int> map;
00498 if (m_Controls == NULL)
00499 return map;
00500 QAbstractItemModel* model = m_Controls->m_ToolTable->model();
00501 for (int i = 0; i < model->rowCount(); ++i)
00502 {
00503 QModelIndex indexIndex = model->index(i, QmitkNDIToolDelegate::IndexCol);
00504 QModelIndex typeIndex = model->index(i, QmitkNDIToolDelegate::TypeCol);
00505 if ((indexIndex.isValid() == false) || (typeIndex.isValid() == false))
00506 continue;
00507 map.insert(model->data(typeIndex).toString(), model->data(indexIndex).toUInt());
00508 }
00509 return map;
00510 }
00511
00512
00513 QList<unsigned int> QmitkNDIConfigurationWidget::GetToolsByToolType( QString toolType ) const
00514 {
00515 QList<unsigned int> list;
00516 if (m_Controls == NULL)
00517 return list;
00518 QAbstractItemModel* model = m_Controls->m_ToolTable->model();
00519 for (int i = 0; i < model->rowCount(); ++i)
00520 {
00521 QModelIndex indexIndex = model->index(i, QmitkNDIToolDelegate::IndexCol);
00522 QModelIndex typeIndex = model->index(i, QmitkNDIToolDelegate::TypeCol);
00523 if ((indexIndex.isValid() == false) || (typeIndex.isValid() == false))
00524 continue;
00525 if (model->data(typeIndex).toString() == toolType)
00526 list.append(model->data(indexIndex).toUInt());
00527 }
00528 return list;
00529 }
00530
00531
00532 mitk::DataNode* QmitkNDIConfigurationWidget::GetNode( unsigned int index ) const
00533 {
00534
00535 if (m_Controls == NULL)
00536 return NULL;
00537 QAbstractItemModel* model = m_Controls->m_ToolTable->model();
00538 QVariant data = model->data(model->index(index, QmitkNDIToolDelegate::NodeCol), QmitkNDIToolDelegate::OrganNodeRole);
00539 return data.value<mitk::DataNode*>();
00540 }
00541
00542 void QmitkNDIConfigurationWidget::HidePolarisOptionsGroupbox( bool on )
00543 {
00544 m_Controls->m_gbPolarisOptions->setHidden(on);
00545 }
00546
00547 void QmitkNDIConfigurationWidget::HideAuroraOptionsGroupbox( bool on )
00548 {
00549 m_Controls->m_gbAuroraOptions->setHidden(on);
00550 }