74 if (this->GetState() != Setup)
76 this->SetErrorMessage(
"Can only try to open the connection if in setup mode");
83 errorCode = InitializeBIRDSystem();
84 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
86 HandleError(errorCode);
94 errorCode = GetBIRDSystemConfiguration(&m_SystemConfig);
95 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
97 HandleError(errorCode);
102 errorCode = SetSystemParameter(METRIC, &m_metric,
sizeof(m_metric));
103 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
105 HandleError(errorCode);
110 if ((m_measurementRate > 30) && (m_measurementRate < 80))
112 errorCode = SetSystemParameter(MEASUREMENT_RATE, &m_measurementRate,
sizeof(m_measurementRate));
113 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
115 HandleError(errorCode);
121 if ((m_pl >= 50) && (m_pl <= 60))
123 errorCode = SetSystemParameter(POWER_LINE_FREQUENCY, &m_pl,
sizeof(m_pl));
124 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
126 HandleError(errorCode);
132 m_agc = m_agcModeBoth ? TRANSMITTER_AND_SENSOR_AGC : SENSOR_AGC_ONLY;
133 errorCode = SetSystemParameter(AGC_MODE, &m_agc,
sizeof(m_agc));
134 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
136 HandleError(errorCode);
141 errorCode = GetBIRDSystemConfiguration(&m_SystemConfig);
142 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
144 HandleError(errorCode);
149 m_SensorConfig =
new SENSOR_CONFIGURATION[m_SystemConfig.numberSensors];
150 for (
int i = 0; i < m_SystemConfig.numberSensors; i++)
152 errorCode = GetSensorConfiguration(i, &(m_SensorConfig[i]));
153 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
155 HandleError(errorCode);
159 QUALITY_PARAMETERS qualityParameters;
160 GetSensorParameter(i, QUALITY, &qualityParameters,
sizeof(qualityParameters));
165 DATA_FORMAT_TYPE tempBuffer = DOUBLE_POSITION_QUATERNION_TIME_Q;
168 DATA_FORMAT_TYPE *pTempBuffer = &tempBuffer;
169 errorCode = SetSensorParameter(i, DATA_FORMAT, pTempBuffer,
sizeof(tempBuffer));
170 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
172 HandleError(errorCode);
179 for (
int i = 0; i < m_SystemConfig.numberSensors; i++)
181 if (m_SensorConfig[i].attached)
182 m_Tools.push_back(ToolType::New());
188 m_TransmitterConfig =
new TRANSMITTER_CONFIGURATION[m_SystemConfig.numberTransmitters];
189 for (
int i = 0; i < m_SystemConfig.numberTransmitters; i++)
191 errorCode = GetTransmitterConfiguration(i, &(m_TransmitterConfig[i]));
192 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
194 HandleError(errorCode);
199 SwitchTransmitter(
true);
200 SwitchTransmitter(
false);
205 this->SetState(Ready);
206 this->SetErrorMessage(
"");
216 for (
short id = 0;
id < m_SystemConfig.numberTransmitters;
id++)
218 if (m_TransmitterConfig[
id].attached)
223 int errorCode = SetSystemParameter(SELECT_TRANSMITTER, &
id,
sizeof(
id));
224 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
226 HandleError(errorCode);
237 short TRANSMITTER_OFF = -1;
238 int errorCode = SetSystemParameter(SELECT_TRANSMITTER, &TRANSMITTER_OFF,
sizeof(TRANSMITTER_OFF));
239 if (!CompareError(errorCode, BIRD_ERROR_SUCCESS))
241 HandleError(errorCode);
310 if (this->GetState() != Ready)
313 this->SetState(Tracking);
316 SwitchTransmitter(
true);
319 this->m_StopTrackingMutex->Lock();
320 this->m_StopTracking =
false;
321 this->m_StopTrackingMutex->Unlock();
323 m_TrackingFinishedMutex->Unlock();
324 m_ThreadID = m_MultiThreader->SpawnThread(this->ThreadStartTracking,
this);
325 mitk::TimeStamp::GetInstance()->Start(
this);
332 if (this->GetState() != Tracking)
336 double updateRate = 1000.0 / m_SystemConfig.measurementRate;
337 double measurementDuration = 0.0;
346 bool localStopTracking;
349 this->m_StopTrackingMutex->Lock();
350 localStopTracking = this->m_StopTracking;
351 this->m_StopTrackingMutex->Unlock();
354 while ((this->GetState() == Tracking) && (localStopTracking ==
false))
357 unsigned int nOfAttachedSensors = 0;
358 double timeStamp = 0.0;
361 for (
int sensorID = 0; sensorID < m_SystemConfig.numberSensors; sensorID++)
363 if (!m_SensorConfig[sensorID].attached)
367 errorCode = GetAsynchronousRecord(sensorID, pRecord,
sizeof(record));
368 if (CompareError(errorCode, BIRD_ERROR_SUCCESS))
370 nOfAttachedSensors++;
371 timeStamp += record.time;
372 ToolType* tool = GetMicroBirdTool(toolNumber);
376 mitk::Point3D position;
377 position[0] = record.x;
378 position[1] = record.y;
379 position[2] = record.z;
381 mitk::Quaternion orientation(record.q[1], record.q[2], record.q[3],record.q[0]);
389 HandleError(errorCode);
397 double sleepTime = updateRate - measurementDuration;
399 if (sleepTime > 0.0 && sleepTime < 500.0)
403 itksys::SystemTools::Delay(sleepTime)
408 this->m_StopTrackingMutex->Lock();
409 localStopTracking = m_StopTracking;
410 this->m_StopTrackingMutex->Unlock();