IGSTK
/tmp/buildd/igstk-4.4.0/Source/igstkNDICommandInterpreter.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Image Guided Surgery Software Toolkit
00004   Module:    $RCSfile: igstkNDICommandInterpreter.h,v $
00005   Language:  C++
00006   Date:      $Date: 2008-02-11 01:41:51 $
00007   Version:   $Revision: 1.16 $
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 __igstkNDICommandInterpreter_h
00019 #define __igstkNDICommandInterpreter_h
00020 
00021 #include "igstkObject.h"
00022 #include "igstkSerialCommunication.h"
00023 #include "igstkNDIErrorEvent.h"
00024 
00025 namespace igstk
00026 {
00027 
00043 class NDICommandInterpreter : public Object
00044 {
00045 public:
00046 
00048   igstkStandardClassTraitsMacro( NDICommandInterpreter, Object )
00049 
00050 public:
00051 
00064   typedef enum
00065     {
00066     NDI_OKAY            = 0x00,  
00067     NDI_INVALID         = 0x01,  
00068     NDI_TOO_LONG        = 0x02,  
00069     NDI_TOO_SHORT       = 0x03,  
00070     NDI_BAD_COMMAND_CRC = 0x04,  
00071     NDI_INTERN_TIMEOUT  = 0x05,  
00072     NDI_COMM_FAIL       = 0x06,  
00073     NDI_PARAMETERS      = 0x07,  
00074     NDI_INVALID_PORT    = 0x08,  
00075     NDI_INVALID_MODE    = 0x09,  
00076     NDI_INVALID_LED     = 0x0a,  
00077     NDI_LED_STATE       = 0x0b,  
00078     NDI_BAD_MODE        = 0x0c,  
00079     NDI_NO_TOOL         = 0x0d,  
00080     NDI_PORT_NOT_INIT   = 0x0e,  
00081     NDI_PORT_DISABLED   = 0x0f,  
00082     NDI_INITIALIZATION  = 0x10,  
00083     NDI_TSTOP_FAIL      = 0x11,  
00084     NDI_TSTART_FAIL     = 0x12,  
00085     NDI_PINIT_FAIL      = 0x13,  
00086     NDI_CAMERA          = 0x14,  
00087     NDI_INIT_FAIL       = 0x15,  
00088     NDI_DSTART_FAIL     = 0x16,  
00089     NDI_DSTOP_FAIL      = 0x17,  
00090     NDI_IRCHK_FAIL      = 0x18,  
00091     NDI_FIRMWARE        = 0x19,  
00092     NDI_INTERNAL        = 0x1a,  
00093     NDI_IRINIT_FAIL     = 0x1b,  
00094     NDI_IRED_FAIL       = 0x1c,  
00095     NDI_SROM_FAIL       = 0x1d,  
00096     NDI_SROM_READ       = 0x1e,  
00097     NDI_SROM_WRITE      = 0x1f,  
00098     NDI_SROM_SELECT     = 0x20,  
00099     NDI_PORT_CURRENT    = 0x21,  
00100     NDI_WAVELENGTH      = 0x22,  
00101     NDI_PARAMETER_RANGE = 0x23,  
00102     NDI_VOLUME          = 0x24,  
00103     NDI_FEATURES        = 0x25,  
00104     NDI_ERROR_0X26      = 0x26,  
00105     NDI_ERROR_0X27      = 0x27,  
00106     NDI_SCU_STATE       = 0x28,  
00107     NDI_CORRUPT         = 0x29,  
00108     NDI_MEMORY          = 0x2A,  
00109     NDI_NOT_ALLOCATED   = 0x2B,  
00110     NDI_NOT_OCCUPIED    = 0x2C,  
00111     NDI_NO_HANDLES      = 0x2D,  
00112     NDI_INCOMPATIBLE    = 0x2E,  
00113     NDI_DESCRIPTION     = 0x2F,  
00114     NDI_ASSIGNED        = 0x30,  
00115     NDI_INVALID_STATE   = 0x31,  
00116     NDI_OPERATION       = 0x32,  
00117     NDI_FEATURE         = 0x33,  
00119     NDI_ENVIRONMENT     = 0xf1,  
00121     NDI_EPROM_ERASE     = 0xf4,  
00122     NDI_EPROM_WRITE     = 0xf5,  
00123     NDI_EPROM_READ      = 0xf6,  
00125     /* error codes generated by the host, rather than by the device */
00126 
00127     NDI_BAD_CRC         = 0x0100,  
00128     NDI_OPEN_ERROR      = 0x0200,  
00129     NDI_BAD_COMM        = 0x0300,  
00130     NDI_TIMEOUT         = 0x0400,  
00131     NDI_WRITE_ERROR     = 0x0500,  
00132     NDI_READ_ERROR      = 0x0600,  
00133     NDI_RESET_FAIL      = 0x0700,  
00134     NDI_PROBE_FAIL      = 0x0800,  
00135     } ErrorCodeType;
00136 
00138   typedef enum
00139     {
00140     NDI_9600     = 0,
00141     NDI_14400    = 1, 
00142     NDI_19200    = 2,
00143     NDI_38400    = 3,
00144     NDI_57600    = 4,
00145     NDI_115200   = 5,
00146     } COMMBaudType;
00147 
00149   typedef enum
00150     {
00151     NDI_8N1  =   0,              /* 8 data bits, no parity, 1 stop bit */
00152     NDI_8N2  =   1,              /* etc. */
00153     NDI_8O1  =  10,
00154     NDI_8O2  =  11,
00155     NDI_8E1  =  20,
00156     NDI_8E2  =  21,
00157     NDI_7N1  = 100,
00158     NDI_7N2  = 101,
00159     NDI_7O1  = 110,
00160     NDI_7O2  = 111,
00161     NDI_7E1  = 120,
00162     NDI_7E2  = 121 ,
00163     } COMMDataType;
00164 
00166   typedef enum
00167     {
00168     NDI_NOHANDSHAKE  = 0,
00169     NDI_HANDSHAKE    = 1,
00170     } COMMHandshakeType;
00171 
00173   typedef enum
00174     {
00175     NDI_CONTROL_FIRMWARE          = 0, 
00176     NDI_LEFT_SENSOR_FIRMWARE      = 1, 
00177     NDI_RIGHT_SENSOR_FIRMWARE     = 2, 
00178     NDI_TIU_FIRMWARE              = 3, 
00179     NDI_CONTROL_FIRMWARE_ENHANCED = 4, 
00181     } VERModeType;
00182 
00184   typedef enum
00185     {
00186     NDI_ALL_HANDLES            = 0x00,
00187     NDI_STALE_HANDLES          = 0x01,
00188     NDI_UNINITIALIZED_HANDLES  = 0x02,
00189     NDI_UNENABLED_HANDLES      = 0x03,
00190     NDI_ENABLED_HANDLES        = 0x04,
00191     } PHSRModeType;
00192 
00194   typedef enum
00195     {
00196     NDI_STATIC      = 'S',    
00197     NDI_DYNAMIC     = 'D',    
00198     NDI_BUTTON_BOX  = 'B',    
00199     } PENATrackingModeType;
00200 
00202   typedef enum
00203     {
00204     NDI_XFORMS_AND_STATUS     = 0x0001,  
00205     NDI_ADDITIONAL_INFO       = 0x0002,  
00206     NDI_SINGLE_STRAY          = 0x0004,  
00207     NDI_INCLUDE_OUT_OF_VOLUME = 0x0800,  
00208     NDI_PASSIVE_STRAY         = 0x1000,  
00209     } TXModeType;
00210 
00212   typedef enum
00213     {
00214     NDI_UNOCCUPIED   = 0x00, 
00215     NDI_VALID        = 0x01, 
00216     NDI_MISSING      = 0x02, 
00217     NDI_DISABLED     = 0x04, 
00218     } TXTransformType;
00219 
00221   typedef enum
00222     {
00223     NDI_TOOL_IN_PORT          = 0x0001,
00224     NDI_SWITCH_1_ON           = 0x0002,
00225     NDI_SWITCH_2_ON           = 0x0004,
00226     NDI_SWITCH_3_ON           = 0x0008,
00227     NDI_INITIALIZED           = 0x0010,
00228     NDI_ENABLED               = 0x0020,
00229     NDI_OUT_OF_VOLUME         = 0x0040,
00230     NDI_PARTIALLY_IN_VOLUME   = 0x0080,
00231     NDI_DISTURBANCE_DETECTED  = 0x0200,
00232     NDI_SIGNAL_TOO_SMALL      = 0x0400,
00233     NDI_SIGNAL_TOO_BIG        = 0x0800,
00234     NDI_PROCESSING_EXCEPTION  = 0x1000,
00235     NDI_PORT_HARDWARE_FAILURE = 0x2000,
00236     } TXPortStatusType;
00237 
00239   typedef enum
00240     {
00241     NDI_COMM_SYNC_ERROR            = 0x0001,
00242     NDI_TOO_MUCH_EXTERNAL_INFRARED = 0x0002,
00243     NDI_COMM_CRC_ERROR             = 0x0004,
00244     NDI_COMM_RECOVERABLE           = 0x0008,
00245     NDI_HARDWARE_FAILURE           = 0x0010,
00246     NDI_HARDWARE_CHANGE            = 0x0020,
00247     NDI_PORT_OCCUPIED              = 0x0040,
00248     NDI_PORT_UNOCCUPIED            = 0x0080,
00249     } TXSystemStatusType;
00250 
00252   typedef enum
00253     {
00254     NDI_BAD_TRANSFORM_FIT   = 0x01,
00255     NDI_NOT_ENOUGH_MARKERS  = 0x02,
00256     NDI_TOOL_FACE_USED      = 0x70,
00257     } TXToolInfoType;
00258 
00260   typedef enum
00261     {
00262     NDI_MARKER_MISSING             = 0,
00263     NDI_MARKER_EXCEEDED_MAX_ANGLE  = 1,
00264     NDI_MARKER_EXCEEDED_MAX_ERROR  = 2,
00265     NDI_MARKER_USED                = 3,
00266     } TXMarkerInfoType;
00267 
00269   typedef enum
00270     {
00271     NDI_BLANK = 'B',    
00272     NDI_FLASH = 'F',    
00273     NDI_SOLID = 'S',    
00274     } LEDStateType;
00275 
00277   typedef enum
00278     {
00279     NDI_GPIO_OFF       = 'O',    
00280     NDI_GPIO_SOLID     = 'S',    
00281     NDI_GPIO_PULSE     = 'P',    
00282     NDI_GPIO_NO_CHANGE = 'N',    
00283     } PSOUTStateType;
00284 
00286   typedef enum
00287     {
00288     NDI_BASIC           = 0x0001,
00289     NDI_TESTING         = 0x0002,
00290     NDI_PART_NUMBER     = 0x0004,
00291     NDI_ACCESSORIES     = 0x0008,
00292     NDI_MARKER_TYPE     = 0x0010,
00293     NDI_PORT_LOCATION   = 0x0020,
00294     NDI_GPIO_STATUS     = 0x0040,
00295     } PHINFModeType;
00296 
00298   typedef enum
00299     {
00300     NDI_TOOL_IN_PORT_SWITCH   = 0x01,  
00301     NDI_SWITCH_1              = 0x02,  
00302     NDI_SWITCH_2              = 0x04,  
00303     NDI_SWITCH_3              = 0x08,  
00304     NDI_TOOL_TRACKING_LED     = 0x10,  
00305     NDI_LED_1                 = 0x20,  
00306     NDI_LED_2                 = 0x40,  
00307     NDI_LED_3                 = 0x80,  
00308     } PHINFAccessoriesType;
00309   
00311   typedef enum
00312     {
00313     NDI_950NM            = 0x00,
00314     NDI_850NM            = 0x01,
00315     NDI_NDI_ACTIVE       = 0x08,
00316     NDI_NDI_CERAMIC      = 0x10,
00317     NDI_PASSIVE_ANY      = 0x20,
00318     NDI_PASSIVE_SPHERE   = 0x28,
00319     NDI_PASSIVE_DISC     = 0x30,
00320     } PHINFMarkerType;
00321 
00323   typedef enum
00324     {
00325     NDI_TYPE_REFERENCE   = 0x01,
00326     NDI_TYPE_POINTER     = 0x02,
00327     NDI_TYPE_BUTTON      = 0x03,
00328     NDI_TYPE_SOFTWARE    = 0x04,
00329     NDI_TYPE_MICROSCOPE  = 0x05,
00330     NDI_TYPE_CALIBRATION = 0x07,
00331     NDI_TYPE_DOCK        = 0x08,
00332     NDI_TYPE_ISOLATION   = 0x09,
00333     NDI_TYPE_CARM        = 0x0A,
00334     NDI_TYPE_CATHETER    = 0x0B,
00335     } PHINFToolInfoType;
00336 
00338   typedef enum
00339     {
00340     NDI_CONTROL         = 0x0001,  
00341     NDI_SENSORS         = 0x0002,  
00342     NDI_TIU             = 0x0004,  
00343     } SSTATModeType;
00344 
00346   typedef enum
00347     {
00348     NDI_EPROM_CODE_CHECKSUM     = 0x01,
00349     NDI_EPROM_SYSTEM_CHECKSUM   = 0x02,
00350     } SSTATControlType;
00351 
00353   typedef enum
00354     {
00355     NDI_LEFT_ROM_CHECKSUM   = 0x01,
00356     NDI_LEFT_SYNC_TYPE_1    = 0x02,
00357     NDI_LEFT_SYNC_TYPE_2    = 0x04,
00358     NDI_RIGHT_ROM_CHECKSUM  = 0x10,
00359     NDI_RIGHT_SYNC_TYPE_1   = 0x20,
00360     NDI_RIGHT_SYNC_TYPE_2   = 0x40,
00361     } STATSensorType;
00362 
00364   typedef enum
00365     {
00366     NDI_ROM_CHECKSUM        = 0x01,
00367     NDI_OPERATING_VOLTAGES  = 0x02,
00368     NDI_MARKER_SEQUENCING   = 0x04,
00369     NDI_SYNC                = 0x08,
00370     NDI_COOLING_FAN         = 0x10,
00371     NDI_INTERNAL_ERROR      = 0x20,
00372     } STATTIUType;
00373 
00375   typedef enum
00376     {
00377     NDI_DETECTED   = 0x0001,   
00378     NDI_SOURCES    = 0x0002,   
00379     } IRCHKModeType;
00380 
00382   typedef enum
00383     {
00384     NDI_LEFT   = 0,            
00385     NDI_RIGHT  = 1,            
00386     } IRCHKSensorType;
00387 
00389   typedef enum
00390     {
00391     NDI_FEATURE_SUMMARY = 0x00, 
00392     NDI_ACTIVE_PORTS    = 0x01, 
00393     NDI_PASSIVE_PORTS   = 0x02, 
00394     NDI_VOLUMES         = 0x03, 
00395     NDI_TIP_PORTS       = 0x04, 
00396     } SFLISTModeType;
00397 
00399   typedef enum
00400     {
00401     NDI_SUPPORTS_ACTIVE  = 0x0001, 
00402     NDI_SUPPORTS_PASSIVE = 0x0002, 
00403     NDI_SUPPORTS_VOLUMES = 0x0004, 
00404     NDI_SUPPORTS_SENSING = 0x0008, 
00405     } SFLISTSummaryType;
00406 
00408   typedef SerialCommunication            CommunicationType;
00409 
00411   void SetCommunication(CommunicationType* communication);
00412 
00414   CommunicationType* GetCommunication();
00415 
00444   const char *Command(const char *command);
00445 
00450   void BEEP(int n) {this->Command("BEEP:%i", n % 10); }
00451 
00463   void COMM(COMMBaudType baud, COMMDataType dps, COMMHandshakeType handshake) {
00464     this->Command("COMM:%d%03d%d", baud, dps, handshake); }
00465 
00469   void DSTART() {
00470     this->Command("DSTART:"); }
00471 
00473   void DSTOP() {
00474     this->Command("DSTOP:"); }
00475 
00478   void INIT() {
00479     this->Command("INIT:"); }
00480 
00490   void IRCHK(int mode) {
00491     this->Command("IRCHK:%04X", mode); }
00492 
00495   void IRINIT() {
00496     this->Command("IRINIT:"); }
00497 
00505   void LED(int ph, int led, LEDStateType state) {
00506     this->Command("LED:%02X%d%c", ph, led, state); }
00507 
00510   void PDIS(int ph) {
00511     this->Command("PDIS:%02X", ph); }
00512 
00517   void PENA(int ph, int mode) {
00518     this->Command("PENA:%02X%c", ph, mode); }
00519 
00522   void PHF(int ph) {
00523     this->Command("PHF:%02X", ph); }
00524 
00547   void PHINF(int ph, int mode) {
00548     this->Command("PHINF:%02X%04X", ph, mode); }
00549 
00561   void PHRQ(const char* num, const char* sys, const char* tool,
00562             const char* port, const char* chan) 
00563     {
00564     this->Command("PHRQ:%-8.8s%1.1s%1.1s%2.2s%2.2s", num, sys, tool, 
00565                                                         port, chan); 
00566     }
00567 
00583   void PHSR(PHSRModeType mode) {
00584     this->Command("PHSR:%02X", mode); }
00585 
00589   void PINIT(int ph) {
00590     this->Command("PINIT:%02X", ph); }
00591 
00600   void PSOUT(int ph, int a, int b, int c) {
00601     this->Command("PSOUT:%02X%c%c%c", ph, a, b, c); };
00602 
00607   void PVCLR(int port) {
00608     this->Command("PVCLR:%c", port); }
00609 
00616   void PVWR(int ph, int a, const char* x) {
00617     this->Command("PVWR:%02X%04X%.128s", ph, a, x); }
00618 
00621   void RESET() {
00622     this->Command(0); }
00623 
00640   void SFLIST(SFLISTModeType mode) {
00641     this->Command("SFLIST:%02X", mode); }
00642 
00657   void SSTAT(int mode) {
00658     this->Command("SSTAT:%04X", mode); }
00659 
00661   void TSTART() {
00662     this->Command("TSTART:"); }
00663 
00665   void TSTOP() {
00666     this->Command("TSTOP:"); }
00667 
00689   void TX(int mode) {
00690     this->Command("TX:%04X", mode); }
00691 
00715   void BX(int mode) {
00716     this->Command("BX:%04X", mode); }
00717 
00727   void VER(VERModeType n) {
00728     this->Command("VER:%d", n); }
00729 
00733   int GetError() const;
00734 
00738   int GetPHRQHandle() const;
00739 
00742   int GetPHSRNumberOfHandles() const;
00743 
00752   int GetPHSRHandle(int i) const;
00753 
00770   int GetPHSRInformation(int i) const;
00771 
00785   int GetPHINFPortStatus() const;
00786 
00805   int GetPHINFToolInfo(char information[32]) const;
00806 
00824   int GetPHINFToolType() const;
00825 
00833   unsigned int GetPHINFCurrentTest() const;
00834 
00849   int GetPHINFPartNumber(char part[21]) const;
00850 
00868   int GetPHINFAccessories() const;
00869 
00887   int GetPHINFMarkerType() const;
00888 
00902   int GetPHINFPortLocation(char location[15]) const;
00903 
00910   int GetPHINFGPIOStatus() const;
00911 
00931   int GetTXTransform(int ph, double transform[8]) const;
00932 
00949   int GetTXPortStatus(int ph) const;
00950 
00959   unsigned int GetTXFrame(int ph) const;
00960 
00972   int GetTXToolInfo(int ph) const;
00973 
00987   int GetTXMarkerInfo(int ph, int marker) const;
00988 
01004   int GetTXSingleStray(int ph, double coord[3]) const;
01005 
01012   int GetTXNumberOfPassiveStrays() const;
01013 
01029   int GetTXPassiveStray(int i, double coord[3]) const;
01030 
01045   int GetTXPassiveStrayOutOfVolume(int i) const;
01046 
01062   int GetTXSystemStatus() const;
01063 
01084   int GetBXTransform(int ph, double transform[8]) const;
01085 
01107   int GetBXPortStatus(int ph) const;
01108 
01117   unsigned int GetBXFrame(int ph) const;
01118 
01130   int GetBXToolInfo(int ph) const;
01131 
01145   int GetBXMarkerInfo(int ph, int marker) const;
01146 
01162   int GetBXSingleStray(int ph, double coord[3]) const;
01163 
01169   int GetBXNumberOfPassiveStrays() const;
01170 
01185   int GetBXPassiveStray(int i, double coord[3]) const;
01186 
01201   int GetBXPassiveStrayOutOfVolume(int i) const;
01202 
01218   int GetBXSystemStatus() const;
01219 
01228   int GetSSTATControl() const;
01229 
01242   int GetSSTATSensors() const;
01243 
01256   int GetSSTATTIU() const;
01257 
01259   const char *GetVERText() const;
01260 
01267   int GetIRCHKDetected() const;
01268 
01278   int GetIRCHKNumberOfSources(int side) const;
01279 
01295   int GetIRCHKSourceXY(int side, int i, double xy[2]) const;
01296 
01300   static const char* ErrorString(int errnum);
01301 
01312   static char* HexEncode(char* cp, const void* data, int n);
01313 
01321   static void* HexDecode(void* data, const char* cp, int n);
01322   
01323 protected:
01325   NDICommandInterpreter();
01326 
01328   virtual ~NDICommandInterpreter();
01329 
01331   virtual void PrintSelf( std::ostream& os, itk::Indent indent ) const; 
01332 
01333 private:
01334 
01336   itkStaticConstMacro( NDI_MAX_HANDLES, int, 24 );
01337 
01339   CommunicationType::Pointer m_Communication;
01340 
01342   char *m_CommandReply;                    /* reply without CRC and <CR> */
01343   char *m_SerialCommand;                   /* raw text to send to device */
01344   char *m_SerialReply;                     /* raw reply from device */
01345 
01347   bool m_Tracking;                           /* 'is tracking' flag */
01348 
01350   int m_ErrorCode;                         /* error code (zero if no error) */
01351 
01353   char m_SSTATControl[2];                  /* control processor status */
01354   char m_SSTATSensor[2];                   /* sensor processors status */
01355   char m_SSTATTIU[2];                      /* tiu processor status */
01356 
01358   int m_IRCHKDetected;                     /* irchk detected infrared */
01359   char m_IRCHKSources[128];                /* coordinates of sources */
01360 
01362   char m_PHRQReply[2];
01363 
01365   char m_PHSRReply[1284];
01366 
01368   int m_PHINFOccupied;
01369   char m_PHINFBasic[34];
01370   char m_PHINFTesting[8];
01371   char m_PHINFPartNumber[20];
01372   char m_PHINFAccessories[2];
01373   char m_PHINFMarkerType[2];
01374   char m_PHINFPortLocation[14];
01375   char m_PHINFGPIOStatus[2];
01376 
01378   int m_TXNumberOfHandles;
01379   unsigned char m_TXHandles[NDI_MAX_HANDLES];
01380   unsigned char m_TXHandleStatus[NDI_MAX_HANDLES];
01381   char m_TXSystemStatus[4];
01382   
01384   char m_TXTransforms[NDI_MAX_HANDLES][52];
01385   char m_TXPortStatus[NDI_MAX_HANDLES][8];
01386   char m_TXFrame[NDI_MAX_HANDLES][8];
01387 
01389   char m_TXInformation[NDI_MAX_HANDLES][12];
01390 
01392   char m_TXSingleStray[NDI_MAX_HANDLES][24];
01393 
01395   int m_TXNumberOfPassiveStrays;
01396   char m_TXPassiveStrayOutOfVolume[14];
01397   char m_TXPassiveStray[1052];
01398 
01400   int m_BXNumberOfHandles;
01401   unsigned char m_BXHandles[NDI_MAX_HANDLES];
01402   unsigned char m_BXHandleStatus[NDI_MAX_HANDLES];
01403   unsigned short m_BXSystemStatus;
01404 
01406   float m_BXTransforms[NDI_MAX_HANDLES][8];
01407   unsigned int m_BXPortStatus[NDI_MAX_HANDLES];
01408   unsigned int m_BXFrame[NDI_MAX_HANDLES];
01409 
01411   unsigned char m_BXToolInformation[NDI_MAX_HANDLES];
01412   unsigned char m_BXMarkerInformation[NDI_MAX_HANDLES][20];
01413 
01415   unsigned char m_BXSingleStrayStatus[NDI_MAX_HANDLES];
01416   float m_BXSingleStrayPosition[NDI_MAX_HANDLES][3];
01417 
01419   int m_BXNumberOfPassiveStrays;
01420   unsigned char m_BXPassiveStrayOutOfVolume[7];
01421   float m_BXPassiveStrayPosition[50][3];
01422 
01424   char m_VERText[1028];
01425 
01427   const char* Command(const char* format, int a);
01429   const char* Command(const char* format, int a, int b);
01431   const char* Command(const char* format, int a, int b, int c);
01433   const char* Command(const char* format, int a, int b, int c, int d);
01435   const char* Command(const char* format, int a, int b, const char* c);
01437   const char* Command(const char* format, const char* a, const char* b,
01438                       const char* c, const char* d, const char* e);
01439 
01441   int WriteSerialBreak();
01442 
01446   int WriteCommand(unsigned int *nc);
01447 
01453   int ReadBinaryReply(unsigned int offset);
01454 
01460   int ReadAsciiReply(unsigned int offset);
01461 
01463   int SetErrorCode(int errnum);
01464 
01468   void HelperForCOMM(const char* cp, const char* crp);
01469   void HelperForPHINF(const char* cp, const char* crp);
01470   void HelperForPHRQ(const char* cp, const char* crp);
01471   void HelperForPHSR(const char* cp, const char* crp);
01472   void HelperForTX(const char* cp, const char* crp);
01473   void HelperForBX(const char* cp, const char* crp);
01474   void HelperForIRCHK(const char* cp, const char* crp);
01475   void HelperForSSTAT(const char* cp, const char* crp);
01476   void HelperForVER(const char* cp, const char* crp);
01477 
01480   int TXIndexFromPortHandle(int ph, int *ip) const;
01481 
01487   static unsigned int HexadecimalStringToUnsignedInt(const char* cp, int n);
01488 
01494   static int HexadecimalStringToInt(const char* cp, int n);
01495 
01501   static int StringToInt(const char* cp, int n);
01502 
01509   static int SignedStringToInt(const char* cp, int n);
01510 
01513   int BXIndexFromPortHandle(int ph, int *ip) const;
01514 
01517   static unsigned char BinaryToUnsignedChar(const char *cp) {
01518     const unsigned char *ucp = (const unsigned char *)cp;
01519     return ucp[0]; }
01520 
01523   static unsigned short BinaryToUnsignedShort(const char *cp) {
01524     const unsigned char *ucp = (const unsigned char *)cp;
01525     return ((ucp[1] << 8) | ucp[0]); }
01526 
01528   static unsigned int BinaryToUnsignedInt(const char *cp) {
01529     const unsigned char *ucp = (const unsigned char *)cp;
01530     return (((ucp[3] << 8) | ucp[2]) << 16) | ((ucp[1] << 8) | ucp[0]); }
01531 
01533   static float BinaryToFloat(const char *cp) {
01534     const unsigned char *ucp = (const unsigned char *)cp;
01535     union { float f; unsigned int i; } u;
01536     u.i = (((ucp[3] << 8) | ucp[2]) << 16) | ((ucp[1] << 8) | ucp[0]);
01537     return u.f; }
01538   
01539 
01540   NDICommandInterpreter(const Self&); //purposely not implemented
01541   void operator=(const Self&); //purposely not implemented
01542 };
01543 
01544 }
01545 #endif