Example #1
0
XnStatus XnSensorIO::EnumerateSensors(XnConnectionString* aConnectionStrings, XnUInt32* pnCount)
{
    XnStatus nRetVal = XN_STATUS_OK;

    nRetVal = xnUSBInit();
    if (nRetVal != XN_STATUS_OK && nRetVal != XN_STATUS_USB_ALREADY_INIT)
        return nRetVal;

// Temporary patch: "Cache" the devices since running USB enum on the MacOSX platform takes several seconds due to problems in libusb!
#if (XN_PLATFORM == XN_PLATFORM_MACOSX)
    static XnStringsHash devicesSet;

    if (devicesSet.Size() == 0)
    {
        // search for a v6.0.1 device
        nRetVal = Enumerate(XN_SENSOR_6_0_1_PRODUCT_ID, devicesSet);
        XN_IS_STATUS_OK(nRetVal);

        // search for a v6.0 device
        nRetVal = Enumerate(XN_SENSOR_6_0_PRODUCT_ID, devicesSet);
        XN_IS_STATUS_OK(nRetVal);
    }
#else
    XnStringsHash devicesSet;

    // search for a v6.0.1 device
    nRetVal = Enumerate(XN_SENSOR_6_0_1_PRODUCT_ID, devicesSet);
    XN_IS_STATUS_OK(nRetVal);

    // search for a v6.0 device
    nRetVal = Enumerate(XN_SENSOR_6_0_PRODUCT_ID, devicesSet);
    XN_IS_STATUS_OK(nRetVal);

    // search for a v5.0 device
    nRetVal = Enumerate(XN_SENSOR_5_0_PRODUCT_ID, devicesSet);
    XN_IS_STATUS_OK(nRetVal);
#endif

    // now copy back
    XnUInt32 nCount = 0;
    for (XnStringsHash::ConstIterator it = devicesSet.begin(); it != devicesSet.end(); ++it, ++nCount)
    {
        if (nCount < *pnCount)
        {
            strcpy(aConnectionStrings[nCount], it.Key());
        }
    }

    if (nCount > *pnCount)
    {
        *pnCount = nCount;
        return XN_STATUS_OUTPUT_BUFFER_OVERFLOW;
    }

    // All is good...
    *pnCount = nCount;
    return (XN_STATUS_OK);
}
	XnStatus OpenNIMotorController::Create()
	{
		const XnUSBConnectionString *paths;
		XnUInt32 count;
		XnStatus res;
	
		// Init OpenNI USB
		res = xnUSBInit();
		//std::cout << xnGetStatusString(res) << " "  <<  res << std::endl;
		if( res != XN_STATUS_OK && res != 131142 /** USB alreay initialized **/ )
			return res;
	
		// list all "Kinect motor" USB devices
		res = xnUSBEnumerateDevices( 0x45e, 0x02b0, &paths, &count );
		if( res != XN_STATUS_OK )
			return res;
		
		const XnChar* pUSBtoUse = paths[0];
		if( count > 0 )
		{

			res = xnUSBOpenDeviceByPath( pUSBtoUse, &m_xDevice );
			for( int i=0; i < count; ++i )
			{
				unsigned short vendor_id;
				unsigned short product_id;
				unsigned char bus;
				unsigned char address;
				sscanf(paths[i], "%hx/%hx@%hhu/%hhu", &vendor_id, &product_id, &bus, &address);
				//printf("MotorInfo vendor_id %i product_id %i bus %i address %i \n", vendor_id, product_id, bus, address );
				//std::cout << "MI: " << paths[i] << std::endl;
			}
			if( res != XN_STATUS_OK )
				return res;

			// Init motors
			XnUChar buf;
			res = xnUSBSendControl( m_xDevice, (XnUSBControlType) 0xc0, 0x10, 0x00, 0x00, &buf, sizeof(buf), 0 );
			if( res != XN_STATUS_OK )
			{
				Release();
				return res;
			}
			
			res = xnUSBSendControl( m_xDevice, XN_USB_CONTROL_TYPE_VENDOR, 0x06, 0x01, 0x00, NULL, 0, 0);
			if( res != XN_STATUS_OK )
			{
				Release();
				return res;
			}
			m_bOpened = true;
			
			std::cout << "\n_2Real: The motor controller was initialized correctly" << std::endl;
			return XN_STATUS_OK;
		}
		return XN_STATUS_OS_FILE_OPEN_FAILED;
	}
XnStatus XnSensorIO::EnumerateSensors(XnConnectionString* aConnectionStrings, XnUInt32* pnCount)
{
	XnStatus nRetVal = XN_STATUS_OK;

	nRetVal = xnUSBInit();
	if (nRetVal != XN_STATUS_OK && nRetVal != XN_STATUS_USB_ALREADY_INIT)
		return nRetVal;

// Temporary patch: "Cache" the devices since running USB enum on the MacOSX platform takes several seconds due to problems in libusb!		
#if (XN_PLATFORM == XN_PLATFORM_MACOSX)	
	static XnStringsSet devicesSet;
	
	if (devicesSet.Size() == 0)
	{
		// search for supported devices
		for (XnUInt32 i = 0; i < ms_supportedProductsCount; ++i)
		{
			nRetVal = Enumerate(ms_supportedProducts[i], devicesSet);
			XN_IS_STATUS_OK(nRetVal);
		}
	}
#else
	XnStringsSet devicesSet;

	// search for supported devices
	for (XnUInt32 i = 0; i < ms_supportedProductsCount; ++i)
	{
		nRetVal = Enumerate(ms_supportedProducts[i], devicesSet);
		XN_IS_STATUS_OK(nRetVal);
	}
#endif
	
	// now copy back
	XnUInt32 nCount = 0;
	for (XnStringsSet::ConstIterator it = devicesSet.Begin(); it != devicesSet.End(); ++it, ++nCount)
	{
		if (nCount < *pnCount)
		{
			strcpy(aConnectionStrings[nCount], it->Key());
		}
	}

	if (nCount > *pnCount)
	{
		*pnCount = nCount;
		return XN_STATUS_OUTPUT_BUFFER_OVERFLOW;
	}

	// All is good...
	*pnCount = nCount;
	return (XN_STATUS_OK);
}
XnStatus XnSensorIO::EnumerateSensors(XnConnectionString* aConnectionStrings, XnUInt32* pnCount)
{
	XnStatus nRetVal = XN_STATUS_OK;
	XnBool bIsPresent = FALSE;

	nRetVal = xnUSBInit();
	if (nRetVal != XN_STATUS_OK && nRetVal != XN_STATUS_USB_ALREADY_INIT)
		return nRetVal;

	XnStringsHash devicesSet;

	// --avin mod--
	// search for a kinect device
	nRetVal = Enumerate(XN_SENSOR_PRODUCT_ID_KINECT, devicesSet);
	XN_IS_STATUS_OK(nRetVal);

	// now copy back
	XnUInt32 nCount = 0;
	for (XnStringsHash::ConstIterator it = devicesSet.begin(); it != devicesSet.end(); ++it, ++nCount)
	{
		if (nCount < *pnCount)
		{
			strcpy(aConnectionStrings[nCount], it.Key());
		}
	}

	if (nCount > *pnCount)
	{
		*pnCount = nCount;
		return XN_STATUS_OUTPUT_BUFFER_OVERFLOW;
	}

	// All is good...
	*pnCount = nCount;
	return (XN_STATUS_OK);
}
XnStatus XnSensorIO::OpenDevice(const XnChar* strPath)
{
	XnStatus nRetVal;
	XnUSBDeviceSpeed DevSpeed;

	nRetVal = xnUSBInit();
	if (nRetVal != XN_STATUS_OK && nRetVal != XN_STATUS_USB_ALREADY_INIT)
		return nRetVal;

	xnLogVerbose(XN_MASK_DEVICE_IO, "Connecting to USB device...");

	if (strPath == NULL || strcmp(strPath, "*:0") == 0)
	{
		// support old style API
		XnConnectionString aConnections[1];
		XnUInt32 nCount = 1;
		nRetVal = EnumerateSensors(aConnections, &nCount);
		if (nRetVal != XN_STATUS_OK && nRetVal != XN_STATUS_OUTPUT_BUFFER_OVERFLOW)
		{
			return nRetVal;
		}

		strPath = aConnections[0];
	}

	// try to open the device
	xnLogVerbose(XN_MASK_DEVICE_IO, "Trying to open sensor '%s'...", strPath);
	nRetVal = xnUSBOpenDeviceByPath(strPath, &m_pSensorHandle->USBDevice);
	XN_IS_STATUS_OK(nRetVal);

	nRetVal = xnUSBGetDeviceSpeed(m_pSensorHandle->USBDevice, &DevSpeed);
	XN_IS_STATUS_OK(nRetVal);

	if (DevSpeed != XN_USB_DEVICE_HIGH_SPEED)
	{
		XN_LOG_WARNING_RETURN(XN_STATUS_USB_UNKNOWN_DEVICE_SPEED, XN_MASK_DEVICE_IO, "Device is not high speed!");
	}

	// on older firmwares, control was sent over BULK endpoints. Check if this is the case
	xnLogVerbose(XN_MASK_DEVICE_IO, "Trying to open endpoint 0x4 for control out (for old firmwares)...");
	nRetVal = xnUSBOpenEndPoint(m_pSensorHandle->USBDevice, 0x4, XN_USB_EP_BULK, XN_USB_DIRECTION_OUT, &m_pSensorHandle->ControlConnection.ControlOutConnectionEp);
	if (nRetVal == XN_STATUS_USB_ENDPOINT_NOT_FOUND || nRetVal == XN_STATUS_USB_WRONG_ENDPOINT_TYPE || nRetVal == XN_STATUS_USB_WRONG_ENDPOINT_DIRECTION)
	{
		// this is not the case. use regular control endpoint (0)
		m_pSensorHandle->ControlConnection.bIsBulk = FALSE;
	}
	else
	{
		XN_IS_STATUS_OK(nRetVal);

		xnLogVerbose(XN_MASK_DEVICE_IO, "Opening endpoint 0x85 for control in...");
		nRetVal = xnUSBOpenEndPoint(m_pSensorHandle->USBDevice, 0x85, XN_USB_EP_BULK, XN_USB_DIRECTION_IN, &m_pSensorHandle->ControlConnection.ControlInConnectionEp);
		XN_IS_STATUS_OK(nRetVal);

		m_pSensorHandle->ControlConnection.bIsBulk = TRUE;
	}

	nRetVal = IsSensorLowBandwidth(strPath, &m_bIsLowBandwidth);
	XN_IS_STATUS_OK(nRetVal);

	xnLogInfo(XN_MASK_DEVICE_IO, "Connected to USB device%s", m_bIsLowBandwidth ? " (LowBand)" : "");

	strcpy(m_strDeviceName, strPath);

	return XN_STATUS_OK;
}