00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkMicrobirdTrackingDevice.h"
00019
00020 #include <itksys/SystemTools.hxx>
00021 #include <itkMutexLockHolder.h>
00022
00023 typedef itk::MutexLockHolder<itk::FastMutexLock> MutexLockHolder;
00024
00025 mitk::MicroBirdTrackingDevice::MicroBirdTrackingDevice() : TrackingDevice(),
00026 m_ErrorMessage(""),
00027 m_ThreadID(0),
00028 m_pl(50),
00029 m_metric(true),
00030 m_agcModeBoth(true),
00031 m_measurementRate(68.3),
00032 m_TransmitterConfig(NULL),
00033 m_SensorConfig(NULL)
00034 {
00035
00036
00037
00038
00039 this->m_Type = AscensionMicroBird;
00040
00041
00042 m_Tools.clear();
00043
00044
00045 m_ToolsMutex = itk::FastMutexLock::New();
00046
00047
00048 m_MultiThreader = itk::MultiThreader::New();
00049
00050
00051 pRecord = &record;
00052 }
00053
00054
00055 mitk::MicroBirdTrackingDevice::~MicroBirdTrackingDevice()
00056 {
00057 if (m_MultiThreader)
00058 m_MultiThreader->TerminateThread(m_ThreadID);
00059 m_MultiThreader = NULL;
00060 if (m_ToolsMutex)
00061 m_ToolsMutex->Unlock();
00062 m_ToolsMutex = NULL;
00063
00064 this->StopTracking();
00065 this->CloseConnection();
00066
00067 if (m_TransmitterConfig != NULL)
00068 delete [] m_TransmitterConfig;
00069 if (m_SensorConfig != NULL)
00070 delete [] m_SensorConfig;
00071
00072
00073 }
00074
00075
00076 bool mitk::MicroBirdTrackingDevice::OpenConnection()
00077 {
00078
00079 if (this->GetState() != Setup)
00080 {
00081 this->SetErrorMessage("Can only try to open the connection if in setup mode");
00082 return false;
00083 }
00084
00085 int errorCode;
00086
00087
00088 errorCode = InitializeBIRDSystem();
00089 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
00090 {
00091 HandleError(errorCode);
00092 return false;
00093 }
00095
00096
00097
00098
00099 errorCode = GetBIRDSystemConfiguration(&m_SystemConfig);
00100 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
00101 {
00102 HandleError(errorCode);
00103 return false;
00104 }
00105
00106
00107 errorCode = SetSystemParameter(METRIC, &m_metric, sizeof(m_metric));
00108 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
00109 {
00110 HandleError(errorCode);
00111 return false;
00112 }
00113
00114
00115 if ((m_measurementRate > 30) && (m_measurementRate < 80))
00116 {
00117 errorCode = SetSystemParameter(MEASUREMENT_RATE, &m_measurementRate, sizeof(m_measurementRate));
00118 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
00119 {
00120 HandleError(errorCode);
00121 return false;
00122 }
00123 }
00124
00125
00126 if ((m_pl >= 50) && (m_pl <= 60))
00127 {
00128 errorCode = SetSystemParameter(POWER_LINE_FREQUENCY, &m_pl, sizeof(m_pl));
00129 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
00130 {
00131 HandleError(errorCode);
00132 return false;
00133 }
00134 }
00135
00136
00137 m_agc = m_agcModeBoth ? TRANSMITTER_AND_SENSOR_AGC : SENSOR_AGC_ONLY;
00138 errorCode = SetSystemParameter(AGC_MODE, &m_agc, sizeof(m_agc));
00139 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
00140 {
00141 HandleError(errorCode);
00142 return false;
00143 }
00144
00145
00146 errorCode = GetBIRDSystemConfiguration(&m_SystemConfig);
00147 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
00148 {
00149 HandleError(errorCode);
00150 return false;
00151 }
00152
00153
00154 m_SensorConfig = new SENSOR_CONFIGURATION[m_SystemConfig.numberSensors];
00155 for (int i = 0; i < m_SystemConfig.numberSensors; i++)
00156 {
00157 errorCode = GetSensorConfiguration(i, &(m_SensorConfig[i]));
00158 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
00159 {
00160 HandleError(errorCode);
00161 }
00162
00163
00164 QUALITY_PARAMETERS qualityParameters;
00165 GetSensorParameter(i, QUALITY, &qualityParameters, sizeof(qualityParameters));
00166
00167
00168
00169
00170 DATA_FORMAT_TYPE tempBuffer = DOUBLE_POSITION_QUATERNION_TIME_Q;
00171
00172
00173 DATA_FORMAT_TYPE *pTempBuffer = &tempBuffer;
00174 errorCode = SetSensorParameter(i, DATA_FORMAT, pTempBuffer, sizeof(tempBuffer));
00175 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
00176 {
00177 HandleError(errorCode);
00178 }
00179 }
00180
00181
00182 {
00183 MutexLockHolder(*m_ToolsMutex);
00184 for (int i = 0; i < m_SystemConfig.numberSensors; i++)
00185 {
00186 if (m_SensorConfig[i].attached)
00187 m_Tools.push_back(ToolType::New());
00188
00189 }
00190 }
00191
00192
00193 m_TransmitterConfig = new TRANSMITTER_CONFIGURATION[m_SystemConfig.numberTransmitters];
00194 for (int i = 0; i < m_SystemConfig.numberTransmitters; i++)
00195 {
00196 errorCode = GetTransmitterConfiguration(i, &(m_TransmitterConfig[i]));
00197 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
00198 {
00199 HandleError(errorCode);
00200 }
00201 }
00202
00203
00204 SwitchTransmitter(true);
00205 SwitchTransmitter(false);
00206
00207
00208
00209
00210 this->SetState(Ready);
00211 this->SetErrorMessage("");
00212 return true;
00213 }
00214
00215
00216 bool mitk::MicroBirdTrackingDevice::SwitchTransmitter(bool switchOn)
00217 {
00218 if (switchOn)
00219 {
00220
00221 for (short id = 0; id < m_SystemConfig.numberTransmitters; id++)
00222 {
00223 if (m_TransmitterConfig[id].attached)
00224 {
00225
00226
00227
00228 int errorCode = SetSystemParameter(SELECT_TRANSMITTER, &id, sizeof(id));
00229 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
00230 {
00231 HandleError(errorCode);
00232 return false;
00233 }
00234 else
00235 return true;
00236 }
00237 }
00238 }
00239 else
00240 {
00241
00242 short TRANSMITTER_OFF = -1;
00243 int errorCode = SetSystemParameter(SELECT_TRANSMITTER, &TRANSMITTER_OFF, sizeof(TRANSMITTER_OFF));
00244 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
00245 {
00246 HandleError(errorCode);
00247 return false;
00248 }
00249 else
00250 return true;
00251 }
00252
00253 return true;
00254 }
00255
00256
00257 bool mitk::MicroBirdTrackingDevice::CloseConnection()
00258 {
00259 SwitchTransmitter(false);
00260
00261 int errorCode = CloseBIRDSystem();
00262
00263
00264 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
00265 HandleError(errorCode);
00266
00267
00268 if (m_TransmitterConfig != NULL)
00269 {
00270 delete [] m_TransmitterConfig;
00271 m_TransmitterConfig = NULL;
00272 }
00273 if (m_SensorConfig != NULL)
00274 {
00275 delete [] m_SensorConfig;
00276 m_SensorConfig = NULL;
00277 }
00278
00279 this->SetState(Setup);
00280
00281
00282 this->SetErrorMessage("");
00283
00284 return true;
00285 }
00286
00287
00288 ITK_THREAD_RETURN_TYPE mitk::MicroBirdTrackingDevice::ThreadStartTracking(void* pInfoStruct)
00289 {
00290
00291 struct itk::MultiThreader::ThreadInfoStruct * pInfo = (struct itk::MultiThreader::ThreadInfoStruct*)pInfoStruct;
00292 if ((pInfo == NULL) || (pInfo->UserData == NULL))
00293 return ITK_THREAD_RETURN_VALUE;
00294
00295 MicroBirdTrackingDevice *trackingDevice = (MicroBirdTrackingDevice*)pInfo->UserData;
00296 if (trackingDevice != NULL)
00297 trackingDevice->TrackTools();
00298
00299 return ITK_THREAD_RETURN_VALUE;
00300 }
00301
00302
00303 bool mitk::MicroBirdTrackingDevice::StopTracking()
00304 {
00305 TrackingDevice::StopTracking();
00306
00307 SwitchTransmitter(false);
00308 InvalidateAll();
00309 return true;
00310 }
00311
00312
00313 bool mitk::MicroBirdTrackingDevice::StartTracking()
00314 {
00315 if (this->GetState() != Ready)
00316 return false;
00317
00318 this->SetState(Tracking);
00319
00320
00321 SwitchTransmitter(true);
00322
00323
00324 this->m_StopTrackingMutex->Lock();
00325 this->m_StopTracking = false;
00326 this->m_StopTrackingMutex->Unlock();
00327
00328 m_TrackingFinishedMutex->Unlock();
00329 m_ThreadID = m_MultiThreader->SpawnThread(this->ThreadStartTracking, this);
00330 mitk::TimeStamp::GetInstance()->Start(this);
00331 return true;
00332 }
00333
00334
00335 void mitk::MicroBirdTrackingDevice::TrackTools()
00336 {
00337 if (this->GetState() != Tracking)
00338 return;
00339
00340
00341 double updateRate = 1000.0 / m_SystemConfig.measurementRate;
00342 double measurementDuration = 0.0;
00343
00344
00345
00346
00347 MutexLockHolder trackingFinishedLockHolder(*m_TrackingFinishedMutex);
00348
00349
00350
00351 bool localStopTracking;
00352
00353
00354 this->m_StopTrackingMutex->Lock();
00355 localStopTracking = this->m_StopTracking;
00356 this->m_StopTrackingMutex->Unlock();
00357
00358
00359 while ((this->GetState() == Tracking) && (localStopTracking == false))
00360 {
00361 int errorCode;
00362 unsigned int nOfAttachedSensors = 0;
00363 double timeStamp = 0.0;
00364 int toolNumber = 0;
00365
00366 for (int sensorID = 0; sensorID < m_SystemConfig.numberSensors; sensorID++)
00367 {
00368 if (!m_SensorConfig[sensorID].attached)
00369 continue;
00370
00371
00372 errorCode = GetAsynchronousRecord(sensorID, pRecord, sizeof(record));
00373 if (CompareError(errorCode, BIRD_ERROR_SUCCESS))
00374 {
00375 nOfAttachedSensors++;
00376 timeStamp += record.time;
00377 ToolType* tool = GetMicroBirdTool(toolNumber);
00378 if (tool != NULL)
00379 {
00380 tool->SetTrackingError(record.quality);
00381 mitk::Point3D position;
00382 position[0] = record.x;
00383 position[1] = record.y;
00384 position[2] = record.z;
00385 tool->SetPosition(position);
00386 mitk::Quaternion orientation(record.q[1], record.q[2], record.q[3],record.q[0]);
00387 tool->SetOrientation(orientation);
00388 tool->SetDataValid(true);
00389 }
00390 toolNumber++;
00391 }
00392 else
00393 {
00394 HandleError(errorCode);
00395 }
00396 }
00397
00399
00400
00401
00402 double sleepTime = updateRate - measurementDuration;
00403
00404 if (sleepTime > 0.0 && sleepTime < 500.0)
00405 {
00406
00407
00408 itksys::SystemTools::Delay(sleepTime)
00409
00410 }
00411
00412
00413 this->m_StopTrackingMutex->Lock();
00414 localStopTracking = m_StopTracking;
00415 this->m_StopTrackingMutex->Unlock();
00416 }
00417
00418
00419
00420
00421
00422 return;
00423 }
00424
00425
00426 mitk::TrackingTool* mitk::MicroBirdTrackingDevice::GetTool(unsigned int toolNumber)
00427 {
00428 return static_cast<TrackingTool*>(GetMicroBirdTool(toolNumber));
00429 }
00430
00431
00432 mitk::MicroBirdTrackingDevice::ToolType* mitk::MicroBirdTrackingDevice::GetMicroBirdTool(unsigned int toolNumber)
00433 {
00434 ToolType* t = NULL;
00435
00436 MutexLockHolder toolsMutexLockHolder(*m_ToolsMutex);
00437 if (toolNumber < m_Tools.size())
00438 {
00439 t = m_Tools.at(toolNumber);
00440 }
00441 return t;
00442 }
00443
00444
00445 unsigned int mitk::MicroBirdTrackingDevice::GetToolCount() const
00446 {
00447 MutexLockHolder toolsMutexLockHolder(*m_ToolsMutex);
00448 return m_Tools.size();
00449 }
00450
00451
00452 bool mitk::MicroBirdTrackingDevice::CompareError(int errorCode, int errorConstant)
00453 {
00454 return ((errorCode & 0xffff) == errorConstant);
00455 }
00456
00457
00458 void mitk::MicroBirdTrackingDevice::HandleError(int errorCode)
00459 {
00460 char buffer[1024];
00461 char* pBuffer = &buffer[0];
00462
00463 while(!CompareError(errorCode, BIRD_ERROR_SUCCESS))
00464 {
00465
00466
00467
00468 errorCode = GetErrorText(errorCode, pBuffer, sizeof(buffer), SIMPLE_MESSAGE);
00470 this->SetErrorMessage(buffer);
00471 }
00472 }
00473
00474
00475 void mitk::MicroBirdTrackingDevice::InvalidateAll()
00476 {
00477 MutexLockHolder toolsMutexLockHolder(*m_ToolsMutex);
00478 for (ToolContainerType::iterator iterator = m_Tools.begin(); iterator != m_Tools.end(); ++iterator)
00479 (*iterator)->SetDataValid(false);
00480 }