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");
    }
}
Example #2
0
// 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;
}