IGSTK
/tmp/buildd/igstk-4.4.0/Source/igstkAscension3DGTracker.h
Go to the documentation of this file.
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_