CLeapHmdLatest::CLeapHmdLatest( vr::IServerDriverHost * pDriverHost, int base, int n )
    : m_pDriverHost( pDriverHost )
    , m_nBase( base )
    , m_nId( n )
    , m_bCalibrated( true )
    , m_pAlignmentPartner( NULL )
    , m_unSteamVRTrackedDeviceId( vr::k_unTrackedDeviceIndexInvalid )
{
    DriverLog("CLeapHmdLatest::CLeapHmdLatest(base=%d, n=%d)\n", base, n);
    
    memset(m_hmdPos, 0, sizeof(m_hmdPos));

    char buf[256];
    GenerateSerialNumber( buf, sizeof( buf ), base, n );
    m_strSerialNumber = buf;

    memset( &m_ControllerState, 0, sizeof( m_ControllerState ) );
    memset( &m_Pose, 0, sizeof( m_Pose ) );
    m_Pose.result = vr::TrackingResult_Uninitialized;

    m_firmware_revision = 0x0001;
    m_hardware_revision = 0x0001;

    // Load config from steamvr.vrsettings
    vr::IVRSettings *settings_;
    settings_ = m_pDriverHost->GetSettings(vr::IVRSettings_Version);

    // Load rendermodel
    char tmp_[256];
    settings_->GetString("leap", (m_nId ==  LEFT_CONTROLLER) ? "renderModel_lefthand" : (m_nId == RIGHT_CONTROLLER) ? "renderModel_righthand" : "renderModel", tmp_, sizeof(tmp_), "vr_controller_vive_1_5");
    m_strRenderModel = tmp_;

    // set the 
    m_gripAngleOffset = settings_->GetFloat("leap", (m_nId == LEFT_CONTROLLER) ? "gripAngleOffset_lefthand" : (m_nId == RIGHT_CONTROLLER) ? "gripAngleOffset_righthand" : "gripAngleOffset", 0.0);
}
void CServerDriver_Hydra::ScanForNewControllers( bool bNotifyServer )
{
	for ( int base = 0; base < sixenseGetMaxBases(); ++base )
	{
		if ( sixenseIsBaseConnected( base ) )
		{
			sixenseSetActiveBase( base );
			for ( int i = 0; i < sixenseGetMaxControllers(); ++i )
			{
				if ( sixenseIsControllerEnabled( i ) )
				{
					char buf[256];
					GenerateSerialNumber( buf, sizeof( buf ), base, i );
					scope_lock lock( m_Mutex );
					if ( !FindTrackedDeviceDriver( buf, vr::ITrackedDeviceServerDriver_Version ) )
					{
						DriverLog( "added new device %s\n", buf );
						m_vecControllers.push_back( new CHydraHmdLatest( m_pDriverHost, base, i ) );
						if ( bNotifyServer && m_pDriverHost )
						{
							m_pDriverHost->TrackedDeviceAdded( m_vecControllers.back()->GetSerialNumber() );
						}
					}
				}
			}
		}
	}
}
void CServerDriver_Leap::ScanForNewControllers( bool bNotifyServer )
{
    while (m_vecControllers.size() < 2)
    {
        char buf[256];
        int base = 0;
        int i = m_vecControllers.size();
        GenerateSerialNumber( buf, sizeof( buf ), base, i );
        if ( !FindTrackedDeviceDriver( buf ) )
        {
            DriverLog( "added new device %s\n", buf );
            m_vecControllers.push_back( new CLeapHmdLatest( m_pDriverHost, base, i ) );
            if ( bNotifyServer && m_pDriverHost )
            {
                m_pDriverHost->TrackedDeviceAdded( m_vecControllers.back()->GetSerialNumber() );
            }
        }
    }
}
CHydraHmdLatest::CHydraHmdLatest( vr::IServerDriverHost * pDriverHost, int base, int n )
	: m_pDriverHost( pDriverHost )
	, m_nBase( base )
	, m_nId( n )
	, m_ucPoseSequenceNumber( 0 )
	, m_eHemisphereTrackingState( k_eHemisphereTrackingDisabled )
	, m_bCalibrated( false )
	, m_pAlignmentPartner( NULL )
	, m_eSystemButtonState( k_eIdle )
	, m_unSteamVRTrackedDeviceId( vr::k_unTrackedDeviceIndexInvalid )
{
	char buf[256];
	GenerateSerialNumber( buf, sizeof( buf ), base, n );
	m_strSerialNumber = buf;

	memset( &m_ControllerState, 0, sizeof( m_ControllerState ) );
	memset( &m_Pose, 0, sizeof( m_Pose ) );
	m_Pose.result = vr::TrackingResult_Calibrating_InProgress;

	sixenseControllerData cd;
	sixenseGetNewestData( m_nId, &cd );
	m_firmware_revision = cd.firmware_revision;
	m_hardware_revision = cd.hardware_revision;
}