00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __igstkTracker_h
00019 #define __igstkTracker_h
00020
00021 #include <vector>
00022 #include <map>
00023
00024 #include "itkMutexLock.h"
00025 #include "itkConditionVariable.h"
00026 #include "itkMultiThreader.h"
00027
00028 #include "igstkObject.h"
00029 #include "igstkStateMachine.h"
00030 #include "igstkTransform.h"
00031 #include "igstkPulseGenerator.h"
00032 #include "igstkTrackerTool.h"
00033
00034 #include "igstkCoordinateSystemInterfaceMacros.h"
00035
00036
00037 namespace igstk
00038 {
00039
00040 igstkEventMacro( TrackerEvent, StringEvent);
00041 igstkEventMacro( TrackerErrorEvent, IGSTKErrorWithStringEvent);
00042
00043 igstkEventMacro( TrackerOpenEvent, TrackerEvent);
00044 igstkEventMacro( TrackerOpenErrorEvent, TrackerErrorEvent);
00045
00046 igstkEventMacro( TrackerCloseEvent, TrackerEvent);
00047 igstkEventMacro( TrackerCloseErrorEvent, TrackerErrorEvent);
00048
00049 igstkEventMacro( TrackerInitializeEvent, TrackerEvent);
00050 igstkEventMacro( TrackerInitializeErrorEvent, TrackerErrorEvent);
00051
00052 igstkEventMacro( TrackerStartTrackingEvent, TrackerEvent);
00053 igstkEventMacro( TrackerStartTrackingErrorEvent, TrackerErrorEvent);
00054
00055 igstkEventMacro( TrackerStopTrackingEvent, TrackerEvent);
00056 igstkEventMacro( TrackerStopTrackingErrorEvent, TrackerErrorEvent);
00057
00058 igstkEventMacro( TrackerUpdateStatusEvent, TrackerEvent);
00059 igstkEventMacro( TrackerUpdateStatusErrorEvent, TrackerErrorEvent);
00060
00061 igstkEventMacro( TrackerToolTransformUpdateEvent, TrackerEvent);
00062
00063
00096 class Tracker : public Object
00097 {
00098
00099 public:
00101 igstkStandardAbstractClassTraitsMacro( Tracker, Object )
00102
00103 public:
00104
00105 igstkFriendClassMacro( TrackerTool );
00106
00108 typedef TrackerTool TrackerToolType;
00109
00113 void RequestOpen( void );
00114
00118 void RequestClose( void );
00119
00122 void RequestReset( void );
00123
00126 void RequestStartTracking( void );
00127
00129 void RequestStopTracking( void );
00130
00136 void RequestSetFrequency( double frequencyInHz );
00137
00139 void RequestSetReferenceTool( TrackerToolType * trackerTool );
00140
00142 igstkSetMacro( ThreadingEnabled, bool );
00143
00145 igstkGetMacro( ThreadingEnabled, bool );
00146
00147 protected:
00148
00149 Tracker(void);
00150
00151 virtual ~Tracker(void);
00152
00154 typedef Transform::TimePeriodType TimePeriodType;
00155
00157 igstkGetMacro( ValidityTime, TimePeriodType );
00158
00159 typedef enum
00160 {
00161 FAILURE=0,
00162 SUCCESS
00163 } ResultType;
00164
00166 typedef Transform TransformType;
00167
00171 virtual ResultType InternalOpen( void ) = 0;
00172
00176 virtual ResultType InternalClose( void ) = 0;
00177
00181 virtual ResultType InternalReset( void ) = 0;
00182
00186 virtual ResultType InternalStartTracking( void ) = 0;
00187
00191 virtual ResultType InternalStopTracking( void ) = 0;
00192
00193
00197 virtual ResultType InternalUpdateStatus( void ) = 0;
00198
00203 virtual ResultType InternalThreadedUpdateStatus( void ) = 0;
00204
00206 virtual void PrintSelf( std::ostream& os, itk::Indent indent ) const;
00207
00220 virtual ResultType
00221 VerifyTrackerToolInformation( const TrackerToolType * ) = 0;
00222
00229 virtual ResultType ValidateSpecifiedFrequency( double frequencyInHz );
00230
00233 virtual ResultType RemoveTrackerToolFromInternalDataContainers(
00234 const TrackerToolType * trackerTool ) = 0;
00235
00237 virtual ResultType AddTrackerToolToInternalDataContainers(
00238 const TrackerToolType * trackerTool ) = 0;
00239
00241 typedef std::map< std::string, TrackerToolType *> TrackerToolsContainerType;
00242
00246 const TrackerToolsContainerType & GetTrackerToolContainer() const;
00247
00249 void ReportTrackingToolNotAvailable( TrackerToolType * trackerTool ) const;
00250
00252 void ReportTrackingToolVisible( TrackerToolType * trackerTool ) const;
00253
00255 void SetTrackerToolRawTransform( TrackerToolType * trackerTool,
00256 const TransformType transform );
00257
00259 void SetTrackerToolTransformUpdate( TrackerToolType * trackerTool,
00260 bool flag ) const;
00261
00271 void ExitTrackingStateProcessing( void );
00272
00274 void ExitTrackingWithoutTerminatingTrackingThread();
00275
00277 void ExitTrackingTerminatingTrackingThread();
00278
00279
00280 private:
00281 Tracker(const Self&);
00282 void operator=(const Self&);
00283
00285 PulseGenerator::Pointer m_PulseGenerator;
00286
00288 typedef itk::SimpleMemberCommand< Self > ObserverType;
00289 ObserverType::Pointer m_PulseObserver;
00290
00291
00292
00293 TrackerToolsContainerType m_TrackerTools;
00294
00296 typedef TrackerToolType::Pointer TrackerToolPointer;
00297
00299 bool m_ApplyingReferenceTool;
00300 TrackerToolPointer m_ReferenceTool;
00301
00303 TimePeriodType m_ValidityTime;
00304
00307 bool m_ThreadingEnabled;
00308
00311 bool m_TrackingThreadStarted;
00312
00314 itk::MultiThreader::Pointer m_Threader;
00315
00317 int m_ThreadID;
00318
00321 itk::ConditionVariable::Pointer m_ConditionNextTransformReceived;
00322
00325 itk::SimpleMutexLock m_LockForConditionNextTransformReceived;
00326
00328 igstkDeclareStateMacro( Idle );
00329 igstkDeclareStateMacro( AttemptingToEstablishCommunication );
00330 igstkDeclareStateMacro( AttemptingToCloseCommunication );
00331 igstkDeclareStateMacro( CommunicationEstablished );
00332 igstkDeclareStateMacro( AttemptingToAttachTrackerTool );
00333 igstkDeclareStateMacro( TrackerToolAttached );
00334 igstkDeclareStateMacro( AttemptingToTrack );
00335 igstkDeclareStateMacro( Tracking );
00336 igstkDeclareStateMacro( AttemptingToUpdate );
00337 igstkDeclareStateMacro( AttemptingToStopTracking );
00338
00340 igstkDeclareInputMacro( EstablishCommunication );
00341 igstkDeclareInputMacro( StartTracking );
00342 igstkDeclareInputMacro( AttachTrackerTool );
00343 igstkDeclareInputMacro( UpdateStatus );
00344 igstkDeclareInputMacro( StopTracking );
00345 igstkDeclareInputMacro( Reset );
00346 igstkDeclareInputMacro( CloseCommunication );
00347 igstkDeclareInputMacro( ValidFrequency );
00348
00349 igstkDeclareInputMacro( Success );
00350 igstkDeclareInputMacro( Failure );
00351
00354 void RequestAttachTool( TrackerToolType * trackerTool );
00355
00357 ResultType RequestRemoveTool( TrackerToolType * trackerTool );
00358
00360 static ITK_THREAD_RETURN_TYPE TrackingThreadFunction(void* pInfoStruct);
00361
00365 void UpdateStatus( void );
00366
00369 void AttemptToOpenProcessing( void );
00370
00373 void AttemptToStartTrackingProcessing( void );
00374
00376 void AttemptToStopTrackingProcessing( void );
00377
00380 void AttemptToAttachTrackerToolProcessing( void );
00381
00384 void AttemptToUpdateStatusProcessing( void );
00385
00388 void UpdateStatusSuccessProcessing( void );
00389
00392 void UpdateStatusFailureProcessing( void );
00393
00396 void CloseFromTrackingStateProcessing( void );
00397
00400 void CloseFromCommunicatingStateProcessing( void );
00401
00404 void ResetFromTrackingStateProcessing( void );
00405
00408 void ResetFromToolsActiveStateProcessing( void);
00409
00412 void ResetFromCommunicatingStateProcessing( void );
00413
00415 void CommunicationEstablishmentSuccessProcessing( void );
00416
00418 void CommunicationEstablishmentFailureProcessing( void );
00419
00421 void ToolsActivationSuccessProcessing( void );
00422
00424 void ToolsActivationFailureProcessing( void );
00425
00427 void StartTrackingSuccessProcessing( void );
00428
00430 void StartTrackingFailureProcessing( void );
00431
00434 void AttachingTrackerToolSuccessProcessing( void );
00435
00438 void AttachingTrackerToolFailureProcessing( void );
00439
00441 void StopTrackingSuccessProcessing( void );
00442
00444 void StopTrackingFailureProcessing( void );
00445
00447 void CloseCommunicationSuccessProcessing( void );
00448
00450 void CloseCommunicationFailureProcessing( void );
00451
00453 void EnterTrackingStateProcessing( void );
00454
00456 void DetachAllTrackerToolsFromTracker();
00457
00459 void ReportInvalidRequestProcessing( void );
00460
00462 void SetFrequencyProcessing( void );
00463
00466 igstkCoordinateSystemClassInterfaceMacro();
00467
00468 TrackerToolType * m_TrackerToolToBeAttached;
00469
00470 double m_FrequencyToBeSet;
00471 };
00472
00473 }
00474
00475 #endif //__igstk_Tracker_h_