00001 /*========================================================================= 00002 00003 Program: Medical Imaging & Interaction Toolkit 00004 Language: C++ 00005 Date: $Date$ 00006 Version: $Revision$ 00007 00008 Copyright (c) German Cancer Research Center, Division of Medical and 00009 Biological Informatics. All rights reserved. 00010 See MITKCopyright.txt or https://www.mitk.org/copyright.html for details. 00011 00012 This software is distributed WITHOUT ANY WARRANTY; without even 00013 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00014 PURPOSE. See the above copyright notices for more information. 00015 00016 =========================================================================*/ 00017 00018 #include "mitkTrackingDeviceSource.h" 00019 00020 #include "mitkTrackingDevice.h" 00021 #include "mitkTrackingTool.h" 00022 00023 #include "mitkTimeStamp.h" 00024 00025 00026 mitk::TrackingDeviceSource::TrackingDeviceSource() 00027 : mitk::NavigationDataSource(), m_TrackingDevice(NULL) 00028 { 00029 } 00030 00031 00032 mitk::TrackingDeviceSource::~TrackingDeviceSource() 00033 { 00034 if (m_TrackingDevice->GetState() == mitk::TrackingDevice::Tracking) 00035 { 00036 this->StopTracking(); 00037 } 00038 if (m_TrackingDevice->GetState() == mitk::TrackingDevice::Ready) 00039 { 00040 this->Disconnect(); 00041 } 00042 m_TrackingDevice = NULL; 00043 } 00044 00045 00046 void mitk::TrackingDeviceSource::GenerateData() 00047 { 00048 if (m_TrackingDevice.IsNull()) 00049 return; 00050 00051 if (m_TrackingDevice->GetToolCount() < 1) 00052 return; 00053 00054 if (this->GetNumberOfOutputs() != m_TrackingDevice->GetToolCount()) // mismatch between tools and outputs. What should we do? Were tools added to the tracking device after SetTrackingDevice() was called? 00055 { 00056 //check this: TODO: 00058 //this->CreateOutputs(); 00059 00060 std::stringstream ss; 00061 ss << "mitk::TrackingDeviceSource: not enough outputs available for all tools. " 00062 << this->GetNumberOfOutputs() << " outputs available, but " 00063 << m_TrackingDevice->GetToolCount() << " tools available in the tracking device."; 00064 throw std::out_of_range(ss.str()); 00065 } 00066 /* update outputs with tracking data from tools */ 00067 unsigned int toolCount = m_TrackingDevice->GetToolCount(); 00068 for (unsigned int i = 0; i < toolCount; ++i) 00069 { 00070 mitk::NavigationData* nd = this->GetOutput(i); 00071 assert(nd); 00072 mitk::TrackingTool* t = m_TrackingDevice->GetTool(i); 00073 assert(t); 00074 00075 if ((t->IsEnabled() == false) || (t->IsDataValid() == false)) 00076 { 00077 nd->SetDataValid(false); 00078 continue; 00079 } 00080 nd->SetDataValid(true); 00081 mitk::NavigationData::PositionType p; 00082 t->GetPosition(p); 00083 nd->SetPosition(p); 00084 00085 mitk::NavigationData::OrientationType o; 00086 t->GetOrientation(o); 00087 nd->SetOrientation(o); 00088 nd->SetOrientationAccuracy(t->GetTrackingError()); 00089 nd->SetPositionAccuracy(t->GetTrackingError()); 00090 nd->SetTimeStamp( mitk::TimeStamp::GetInstance()->GetElapsed() ); 00091 } 00092 } 00093 00094 00095 void mitk::TrackingDeviceSource::SetTrackingDevice( mitk::TrackingDevice* td ) 00096 { 00097 itkDebugMacro("setting TrackingDevice to " << td ); 00098 if (this->m_TrackingDevice.GetPointer() != td) 00099 { 00100 this->m_TrackingDevice = td; 00101 this->CreateOutputs(); 00102 } 00103 } 00104 00105 void mitk::TrackingDeviceSource::CreateOutputs(){ 00106 //if outputs are set then delete them 00107 if (this->GetNumberOfOutputs() > 0) 00108 { 00109 for (unsigned int numOP = this->GetNumberOfOutputs(); numOP>0; numOP--) 00110 this->RemoveOutput(this->GetOutput(numOP)); 00111 this->Modified(); 00112 } 00113 00114 //fill the outputs if a valid tracking device is set 00115 if (m_TrackingDevice.IsNull()) 00116 return; 00117 00118 this->SetNumberOfOutputs(m_TrackingDevice->GetToolCount()); // create outputs for all tools 00119 unsigned int numberOfOutputs = this->GetNumberOfOutputs(); 00120 for (unsigned int idx = 0; idx < numberOfOutputs; ++idx) 00121 { 00122 if (this->GetOutput(idx) == NULL) 00123 { 00124 DataObjectPointer newOutput = this->MakeOutput(idx); 00125 static_cast<mitk::NavigationData*>(newOutput.GetPointer())->SetName(m_TrackingDevice->GetTool(idx)->GetToolName()); // set NavigationData name to ToolName 00126 this->SetNthOutput(idx, newOutput); 00127 this->Modified(); 00128 } 00129 } 00130 } 00131 00132 void mitk::TrackingDeviceSource::Connect() 00133 { 00134 if (m_TrackingDevice.IsNull()) 00135 throw std::invalid_argument("mitk::TrackingDeviceSource: No tracking device set"); 00136 if (this->IsConnected()) 00137 return; 00138 if (m_TrackingDevice->OpenConnection() == false) 00139 throw std::runtime_error(std::string("mitk::TrackingDeviceSource: Could not open connection to tracking device. Error: ") + m_TrackingDevice->GetErrorMessage()); 00140 00141 /* NDI Aurora needs a connection to discover tools that are connected to it. 00142 Therefore we need to create outputs for these tools now */ 00143 //if (m_TrackingDevice->GetType() == mitk::NDIAurora) 00144 //this->CreateOutputs(); 00145 } 00146 00147 00148 void mitk::TrackingDeviceSource::StartTracking() 00149 { 00150 if (m_TrackingDevice.IsNull()) 00151 throw std::invalid_argument("mitk::TrackingDeviceSource: No tracking device set"); 00152 if (m_TrackingDevice->StartTracking() == false) 00153 throw std::runtime_error("mitk::TrackingDeviceSource: Could not start tracking"); 00154 } 00155 00156 00157 void mitk::TrackingDeviceSource::Disconnect() 00158 { 00159 if (m_TrackingDevice.IsNull()) 00160 throw std::invalid_argument("mitk::TrackingDeviceSource: No tracking device set"); 00161 if (m_TrackingDevice->CloseConnection() == false) 00162 throw std::runtime_error("mitk::TrackingDeviceSource: Could not close connection to tracking device"); 00163 } 00164 00165 00166 void mitk::TrackingDeviceSource::StopTracking() 00167 { 00168 if (m_TrackingDevice.IsNull()) 00169 throw std::invalid_argument("mitk::TrackingDeviceSource: No tracking device set"); 00170 if (m_TrackingDevice->StopTracking() == false) 00171 throw std::runtime_error("mitk::TrackingDeviceSource: Could not stop tracking"); 00172 } 00173 00174 00175 void mitk::TrackingDeviceSource::UpdateOutputInformation() 00176 { 00177 this->Modified(); // make sure that we need to be updated 00178 Superclass::UpdateOutputInformation(); 00179 } 00180 00181 00182 //unsigned int mitk::TrackingDeviceSource::GetToolCount() 00183 //{ 00184 // if (m_TrackingDevice) 00185 // return m_TrackingDevice->GetToolCount(); 00186 // return 0; 00187 //} 00188 00189 00190 bool mitk::TrackingDeviceSource::IsConnected() 00191 { 00192 if (m_TrackingDevice.IsNull()) 00193 return false; 00194 00195 return (m_TrackingDevice->GetState() == mitk::TrackingDevice::Ready) || (m_TrackingDevice->GetState() == mitk::TrackingDevice::Tracking); 00196 } 00197 00198 00199 bool mitk::TrackingDeviceSource::IsTracking() 00200 { 00201 if (m_TrackingDevice.IsNull()) 00202 return false; 00203 00204 return m_TrackingDevice->GetState() == mitk::TrackingDevice::Tracking; 00205 }