IGSTK
|
00001 /*========================================================================= 00002 00003 Program: Image Guided Surgery Software Toolkit 00004 Module: $RCSfile: igstkAscension3DGTracker.h,v $ 00005 Language: C++ 00006 Date: $Date: 2011-02-08 15:00:55 $ 00007 Version: $Revision: 1.3 $ 00008 00009 Copyright (c) ISC Insight Software Consortium. All rights reserved. 00010 See IGSTKCopyright.txt or http://www.igstk.org/copyright.htm 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 #ifndef __igstkAscension3DGTracker_h 00019 #define __igstkAscension3DGTracker_h 00020 00021 #include "igstkAscension3DGTrackerTool.h" 00022 #include "igstkTracker.h" 00023 00024 namespace igstk 00025 { 00027 struct Ascension3DGEventErrorType { 00029 EventHelperType::StringType ErrorString; 00030 00032 int AscensionErrorCode; 00033 }; 00034 00038 struct Ascension3DGToolEventStruct { 00039 enum ToolEvents{ 00040 TOOL_DISCONNECTED, 00041 TOOL_CONNECTED, 00042 TOOL_SATURATED, 00043 TOOL_OUT_OF_SATURATION, 00044 TOOL_OUT_OF_MOTION_BOX, 00045 TOOL_IN_MOTION_BOX, 00046 TRANSMITTER_DETACHED, 00047 TRANSMITTER_ATTACHED, 00048 }; 00049 00050 Ascension3DGToolEventStruct(){}; 00051 00053 EventHelperType::StringType ToolIdentifier; 00054 00056 int toolID; 00057 00059 ToolEvents EventType; 00060 }; 00061 00062 igstkLoadedEventMacro( Ascension3DGErrorEvent, IGSTKErrorEvent, 00063 Ascension3DGEventErrorType); 00064 igstkLoadedEventMacro( Ascension3DGToolEvent, IGSTKEvent, 00065 Ascension3DGToolEventStruct); 00066 00086 class Ascension3DGTracker : public Tracker 00087 { 00088 public: 00089 00091 igstkStandardClassTraitsMacro( Ascension3DGTracker, Tracker ) 00092 00093 00094 igstkGetMacro( NumberOfTools, unsigned int ) 00095 00096 00102 void RequestSensorAttached(int sensorID); 00103 00110 void RequestTransmitterAttached(); 00111 00119 void RequestSensorSaturated(int sensorID); 00120 00127 void RequestSensorInMotionBox(int sensorID); 00128 00129 protected: 00131 Ascension3DGTracker(void); 00132 virtual ~Ascension3DGTracker(void); 00133 00135 typedef Tracker::ResultType ResultType; 00136 00138 virtual ResultType InternalOpen( void ); 00139 00141 virtual ResultType InternalClose( void ); 00142 00144 virtual ResultType InternalStartTracking( void ); 00145 00147 virtual ResultType InternalStopTracking( void ); 00148 00150 virtual ResultType InternalUpdateStatus( void ); 00151 00154 virtual ResultType InternalThreadedUpdateStatus( void ); 00155 00157 virtual ResultType VerifyTrackerToolInformation( 00158 const TrackerToolType * trackerTool ); 00159 00161 virtual ResultType ValidateSpecifiedFrequency( double frequencyInHz ); 00162 00164 virtual ResultType AddTrackerToolToInternalDataContainers( const 00165 TrackerToolType * trackerTool ); 00166 00168 virtual ResultType RemoveTrackerToolFromInternalDataContainers( 00169 const TrackerToolType * trackerTool ); 00170 00172 virtual ResultType InternalReset( void ); 00173 00175 virtual void PrintSelf( std::ostream& os, ::itk::Indent indent ) const; 00176 00177 private: 00178 00179 Ascension3DGTracker(const Self&); //purposely not implemented 00180 void operator=(const Self&); //purposely not implemented 00181 00183 typedef igstk::Ascension3DGTrackerTool Ascension3DGTrackerToolType; 00184 typedef Ascension3DGTrackerToolType::Pointer Ascension3DGTrackerToolPointer; 00185 typedef Ascension3DGTrackerToolType::ConstPointer 00186 Ascension3DGTrackerToolConstPointer; 00187 00190 void EnableToolPorts( void ); 00191 00193 void DisableToolPorts( void ); 00194 00197 int CheckAPIReturnStatus(int status); 00198 00200 unsigned int m_NumberOfTools; 00201 00202 enum {TRANSMITTER_OFF = -1}; 00203 00205 itk::MutexLock::Pointer m_BufferLock; 00206 00207 typedef std::map< std::string, std::vector < double > > 00208 TrackerToolTransformContainerType; 00210 TrackerToolTransformContainerType m_ToolTransformBuffer; 00211 00212 typedef std::map< unsigned int, std::string> ErrorCodeContainerType; 00214 static ErrorCodeContainerType m_ErrorCodeContainer; 00215 00216 enum ToolAvailabilityStatus {TOOL_UNAVAILABLE, TOOL_AVAILABLE}; 00218 std::map< std::string, ToolAvailabilityStatus > m_ToolStatusContainer; 00219 00221 static unsigned short ConvertToolNameToSensorID(const std::string &name); 00223 static std::string ConvertSensorIDToToolName(unsigned short id); 00224 00225 //The tool status from the last update. It would be better if this were in the 00226 //Ascension3DGTrackerTool class, but that does not seem workable. The Tracker 00227 //baseclass keeps its container of tracker tools private. It only has a const 00228 //getter. From within Ascension3DGTracker, we cannot directly modify 00229 //TrackerTools or call non-const TrackerTools member methods. Our only access 00230 //to the tools is through the public and protected methods the Tracker base 00231 //provides. 00232 std::vector<bool> m_SensorSaturated; 00233 std::vector<bool> m_SensorAttached; 00234 std::vector<bool> m_SensorInMotionBox; 00235 bool m_TransmitterAttached; 00236 00238 void InvokeSensorToolEvent(std::string sensorName, int sensorID, 00239 Ascension3DGToolEventStruct::ToolEvents eventType); 00240 00242 void NoProcessing(){}; 00243 00244 void ReportSensorSaturationProcessing(); 00245 void ReportSensorAttachedProcessing(); 00246 void ReportTransmitterAttachedProcessing(); 00247 void ReportSensorInMotionBoxProcessing(); 00248 00249 //used to keep the sensor id as we go through the state machine 00250 int m_sensorID; 00251 00252 //states 00253 igstkDeclareStateMacro(Idle); 00254 igstkDeclareStateMacro(Initialized); 00255 igstkDeclareStateMacro(AttemptingToGetSaturation); 00256 igstkDeclareStateMacro(AttemptingToGetSensorAttached); 00257 igstkDeclareStateMacro(AttemptingToGetTransmitterAttached); 00258 igstkDeclareStateMacro(AttemptingToGetSensorInMotionBox); 00259 00260 //inputs 00261 igstkDeclareInputMacro(Initialize); 00262 igstkDeclareInputMacro(GetSensorSaturation); 00263 igstkDeclareInputMacro(GetSensorAttached); 00264 igstkDeclareInputMacro(GetTransmitterAttached); 00265 igstkDeclareInputMacro(GetSensorInMotionBox); 00266 }; 00267 00268 } 00269 00270 #endif //__igstk_Ascension3DGTracker_h_