void mtsMicroScribeDigitizer::InitComponent(void) { mtsInterfaceProvided * provided = AddInterfaceProvided(DigitizerInterfaceName); if (provided) { StateTable.AddData(DeviceStatus, "DeviceStatus"); StateTable.AddData(TipPosition, "TipPosition"); StateTable.AddData(TipOrientation, "TipOrientation"); StateTable.AddData(TipOrientationUnitVector, "TipOrientationUnitVector"); StateTable.AddData(ButtonState, "ButtonState"); StateTable.AddData(JointReadings, "JointReadings"); provided->AddCommandReadState(StateTable, DeviceStatus, DigitizerCommandNames::GetDeviceStatus); provided->AddCommandReadState(StateTable, TipPosition, DigitizerCommandNames::GetTipPosition); provided->AddCommandReadState(StateTable, TipOrientation, DigitizerCommandNames::GetTipOrientation); provided->AddCommandReadState(StateTable, TipOrientationUnitVector, DigitizerCommandNames::GetTipOrientationUnitVector); provided->AddCommandReadState(StateTable, ButtonState, DigitizerCommandNames::GetButtonState); provided->AddCommandReadState(StateTable, JointReadings, DigitizerCommandNames::GetJointReadings); provided->AddCommandRead(&mtsMicroScribeDigitizer::GetDigitizerInfo, this, DigitizerCommandNames::GetDigitizerInfo); provided->AddEventVoid(EventButton1Up, DigitizerEventNames::EventButton1Up); provided->AddEventVoid(EventButton1Down, DigitizerEventNames::EventButton1Down); provided->AddEventVoid(EventButton2Up, DigitizerEventNames::EventButton2Up); provided->AddEventVoid(EventButton2Down, DigitizerEventNames::EventButton2Down); provided->AddEventVoid(EventDigitizerConnected, DigitizerEventNames::EventDigitizerConnected); provided->AddEventVoid(EventDigitizerDisconnected, DigitizerEventNames::EventDigitizerDisconnected); } // Device initialization if (ARM_SUCCESS != ArmStart(NULL)) { // Retry after calling ArmEnd() ArmEnd(); if (ARM_SUCCESS != ArmStart(NULL)) { cmnThrow("mtsMicroScribeDigitizer: Startup: Failed to initialize MicroScribe Digitizer"); } } // Custom error handler registration if (ARM_SUCCESS != ArmSetErrorHandlerFunction(NO_HCI_HANDLER, ErrorHandler_NoHCI)) { cmnThrow("mtsMicroScribeDigitizer: Startup: Failed to register error handler: NO_HCI_HANDLER"); } if (ARM_SUCCESS != ArmSetErrorHandlerFunction(BAD_PORT_HANDLER, ErrorHandler_BadPort)) { cmnThrow("mtsMicroScribeDigitizer: Startup: Failed to register error handler: BAD_PORT_HANDLER"); } if (ARM_SUCCESS != ArmSetErrorHandlerFunction(CANT_OPEN_HANDLER, ErrorHandler_CantOpen)) { cmnThrow("mtsMicroScribeDigitizer: Startup: Failed to register error handler: CANT_OPEN_HANDLER"); } if (ARM_SUCCESS != ArmSetErrorHandlerFunction(CANT_BEGIN_HANDLER, ErrorHandler_CantBegin)) { cmnThrow("mtsMicroScribeDigitizer: Startup: Failed to register error handler: CANT_BEGIN_HANDLER"); } }
// This creates a vrpn_3DMicroscribe and sets it to reset mode. vrpn_3DMicroscribe::vrpn_3DMicroscribe (const char * name, vrpn_Connection * c, const char * Port, long int BaudRate, float OffsetX/* = 0.0f*/, float OffsetY/* = 0.0f*/, float OffsetZ/* = 0.0f*/, float Scale/*=1.0f*/): vrpn_Tracker(name, c), vrpn_Button_Filter(name, c), _numbuttons(2) { // Set the parameters in the parent classes vrpn_Button::num_buttons = _numbuttons; if(!strcmp(Port, "COM1") ) m_PortNumber=1; else if(!strcmp(Port, "COM2") ) m_PortNumber=2; else if(!strcmp(Port, "COM3") ) m_PortNumber=3; else if(!strcmp(Port, "COM4") ) m_PortNumber=4; m_BaudRate=BaudRate; m_OffSet[0]=OffsetX; m_OffSet[1]=OffsetY; m_OffSet[2]=OffsetZ; m_Scale=Scale; // Set the status of the buttons and analogs to 0 to start clear_values(); #ifdef VRPN_USE_MICROSCRIBE int iResult; iResult=ArmStart(NULL); if(ARM_SUCCESS != iResult) { //error starting the MicroScribe drivers VRPN_MSG_ERROR( "Unable to start MicroScribe ArmDll32." ); return; } //don't use error handlers iResult = ArmSetErrorHandlerFunction(NO_HCI_HANDLER, NULL); iResult = ArmSetErrorHandlerFunction(BAD_PORT_HANDLER, NULL); iResult = ArmSetErrorHandlerFunction(CANT_OPEN_HANDLER, NULL); iResult = ArmSetErrorHandlerFunction(CANT_BEGIN_HANDLER, NULL); //connect to the correct port switch(m_PortNumber) { case 1: iResult = ArmConnect(1, m_BaudRate); break; case 2: iResult = ArmConnect(2, m_BaudRate); break; case 3: iResult = ArmConnect(3, m_BaudRate); break; case 4: iResult = ArmConnect(4, m_BaudRate); break; default: iResult = ArmConnect(0, 0); //try all available ports and baud rates break; } if(ARM_SUCCESS != iResult) { //error connecting, end the thread ArmEnd(); VRPN_MSG_ERROR( "Unable to connect to the MicroScribe." ); return; } #endif // Set the mode to reset status = STATUS_RESETTING; }