aboutsummaryrefslogtreecommitdiffstats
path: root/LibOVR/Src/OVR_OSX_HIDDevice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'LibOVR/Src/OVR_OSX_HIDDevice.cpp')
-rw-r--r--LibOVR/Src/OVR_OSX_HIDDevice.cpp924
1 files changed, 0 insertions, 924 deletions
diff --git a/LibOVR/Src/OVR_OSX_HIDDevice.cpp b/LibOVR/Src/OVR_OSX_HIDDevice.cpp
deleted file mode 100644
index af840e0..0000000
--- a/LibOVR/Src/OVR_OSX_HIDDevice.cpp
+++ /dev/null
@@ -1,924 +0,0 @@
-/************************************************************************************
-Filename : OVR_OSX_HIDDevice.cpp
-Content : OSX HID device implementation.
-Created : February 26, 2013
-Authors : Lee Cooper
-
-Copyright : Copyright 2014 Oculus VR, Inc. All Rights reserved.
-
-Licensed under the Oculus VR Rift SDK License Version 3.1 (the "License");
-you may not use the Oculus VR Rift SDK except in compliance with the License,
-which is provided at the time of installation or download, or which
-otherwise accompanies this software in either electronic or hard copy form.
-
-You may obtain a copy of the License at
-
-http://www.oculusvr.com/licenses/LICENSE-3.1
-
-Unless required by applicable law or agreed to in writing, the Oculus VR SDK
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
-*************************************************************************************/
-
-#include "OVR_OSX_HIDDevice.h"
-
-#include <IOKit/usb/IOUSBLib.h>
-
-namespace OVR { namespace OSX {
-
-
-//-------------------------------------------------------------------------------------
-// **** OSX::DeviceManager
-
-HIDDeviceManager::HIDDeviceManager(DeviceManager* manager)
- : DevManager(manager)
-{
- HIDManager = NULL;
-}
-
-HIDDeviceManager::~HIDDeviceManager()
-{
-}
-
-CFRunLoopRef HIDDeviceManager::getRunLoop()
-{
- if (DevManager != NULL)
- {
- return DevManager->pThread->GetRunLoop();
- }
-
- return CFRunLoopGetCurrent();
-}
-
-bool HIDDeviceManager::initializeManager()
-{
- if (HIDManager != NULL)
- {
- return true;
- }
-
- HIDManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
-
- if (!HIDManager)
- {
- return false;
- }
-
- // Create a Matching Dictionary
- CFMutableDictionaryRef matchDict =
- CFDictionaryCreateMutable(kCFAllocatorDefault,
- 2,
- &kCFTypeDictionaryKeyCallBacks,
- &kCFTypeDictionaryValueCallBacks);
-
- // Specify a device manufacturer in the Matching Dictionary
- UInt32 vendorId = Oculus_VendorId;
- CFNumberRef vendorIdRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &vendorId);
- CFDictionarySetValue(matchDict,
- CFSTR(kIOHIDVendorIDKey),
- vendorIdRef);
- // Register the Matching Dictionary to the HID Manager
- IOHIDManagerSetDeviceMatching(HIDManager, matchDict);
- CFRelease(vendorIdRef);
- CFRelease(matchDict);
-
- // Register a callback for USB device detection with the HID Manager
- IOHIDManagerRegisterDeviceMatchingCallback(HIDManager, &staticDeviceMatchingCallback, this);
-
- IOHIDManagerScheduleWithRunLoop(HIDManager, getRunLoop(), kCFRunLoopDefaultMode);
-
- return true;
-}
-
-bool HIDDeviceManager::Initialize()
-{
- return initializeManager();
-}
-
-void HIDDeviceManager::Shutdown()
-{
- OVR_ASSERT_LOG(HIDManager, ("Should have called 'Initialize' before 'Shutdown'."));
- CFRelease(HIDManager);
-
- LogText("OVR::OSX::HIDDeviceManager - shutting down.\n");
-}
-
-bool HIDDeviceManager::getIntProperty(IOHIDDeviceRef device, CFStringRef propertyName, SInt32* pResult)
-{
-
- CFTypeRef ref = IOHIDDeviceGetProperty(device, propertyName);
-
- if (!ref)
- {
- return false;
- }
-
- if (CFGetTypeID(ref) != CFNumberGetTypeID())
- {
- return false;
- }
-
- CFNumberGetValue((CFNumberRef) ref, kCFNumberSInt32Type, pResult);
-
- return true;
-}
-
-bool HIDDeviceManager::initVendorProductVersion(IOHIDDeviceRef device, HIDDeviceDesc* pDevDesc)
-{
-
- if (!getVendorId(device, &(pDevDesc->VendorId)))
- {
- return false;
- }
-
- if (!getProductId(device, &(pDevDesc->ProductId)))
- {
- return false;
- }
-
- SInt32 result;
- if (!getIntProperty(device, CFSTR(kIOHIDVersionNumberKey), &result))
- {
- return false;
- }
- pDevDesc->VersionNumber = result;
-
- return true;
-}
-
-bool HIDDeviceManager::initUsage(IOHIDDeviceRef device, HIDDeviceDesc* pDevDesc)
-{
-
- SInt32 result;
-
- if (!getIntProperty(device, CFSTR(kIOHIDPrimaryUsagePageKey), &result))
- {
- return false;
- }
-
- pDevDesc->UsagePage = result;
-
-
- if (!getIntProperty(device, CFSTR(kIOHIDPrimaryUsageKey), &result))
- {
- return false;
- }
-
- pDevDesc->Usage = result;
-
- return true;
-}
-
-bool HIDDeviceManager::initSerialNumber(IOHIDDeviceRef device, HIDDeviceDesc* pDevDesc)
-{
- return getSerialNumberString(device, &(pDevDesc->SerialNumber));
-}
-
-bool HIDDeviceManager::initStrings(IOHIDDeviceRef device, HIDDeviceDesc* pDevDesc)
-{
-
- // Regardless of whether they fail we'll try and get the remaining.
- getStringProperty(device, CFSTR(kIOHIDManufacturerKey), &(pDevDesc->Manufacturer));
- getStringProperty(device, CFSTR(kIOHIDProductKey), &(pDevDesc->Product));
-
- return true;
-}
-
-bool HIDDeviceManager::getStringProperty(IOHIDDeviceRef device,
- CFStringRef propertyName,
- String* pResult)
-{
-
- CFStringRef str = (CFStringRef) IOHIDDeviceGetProperty(device, propertyName);
-
- if (!str)
- {
- return false;
- }
-
- CFIndex length = CFStringGetLength(str);
- CFRange range = CFRangeMake(0, length);
-
- // Test the conversion first to get required buffer size.
- CFIndex bufferLength;
- CFIndex numberOfChars = CFStringGetBytes(str,
- range,
- kCFStringEncodingUTF8,
- (char) '?',
- FALSE,
- NULL,
- 0,
- &bufferLength);
-
- if (numberOfChars == 0)
- {
- return false;
- }
-
- // Now allocate buffer.
- char* buffer = new char[bufferLength+1];
-
- numberOfChars = CFStringGetBytes(str,
- range,
- kCFStringEncodingUTF8,
- (char) '?',
- FALSE,
- (UInt8*) buffer,
- bufferLength,
- NULL);
- OVR_ASSERT_LOG(numberOfChars != 0, ("CFStringGetBytes failed."));
-
- buffer[bufferLength] = '\0';
- *pResult = String(buffer);
-
- return true;
-}
-
-bool HIDDeviceManager::getVendorId(IOHIDDeviceRef device, UInt16* pResult)
-{
- SInt32 result;
-
- if (!getIntProperty(device, CFSTR(kIOHIDVendorIDKey), &result))
- {
- return false;
- }
-
- *pResult = result;
-
- return true;
-}
-
-bool HIDDeviceManager::getProductId(IOHIDDeviceRef device, UInt16* pResult)
-{
- SInt32 result;
-
- if (!getIntProperty(device, CFSTR(kIOHIDProductIDKey), &result))
- {
- return false;
- }
-
- *pResult = result;
-
- return true;
-}
-
-bool HIDDeviceManager::getLocationId(IOHIDDeviceRef device, SInt32* pResult)
-{
- SInt32 result;
-
- if (!getIntProperty(device, CFSTR(kIOHIDLocationIDKey), &result))
- {
- return false;
- }
-
- *pResult = result;
-
- return true;
-}
-
-bool HIDDeviceManager::getSerialNumberString(IOHIDDeviceRef device, String* pResult)
-{
-
- if (!getStringProperty(device, CFSTR(kIOHIDSerialNumberKey), pResult))
- {
- return false;
- }
-
- return true;
-}
-
-bool HIDDeviceManager::getPath(IOHIDDeviceRef device, String* pPath)
-{
-
- String transport;
- if (!getStringProperty(device, CFSTR(kIOHIDTransportKey), &transport))
- {
- return false;
- }
-
- UInt16 vendorId;
- if (!getVendorId(device, &vendorId))
- {
- return false;
- }
-
- UInt16 productId;
- if (!getProductId(device, &productId))
- {
- return false;
- }
-
- String serialNumber;
- if (!getSerialNumberString(device, &serialNumber))
- {
- return false;
- }
-
-
- StringBuffer buffer;
- buffer.AppendFormat("%s:vid=%04hx:pid=%04hx:ser=%s",
- transport.ToCStr(),
- vendorId,
- productId,
- serialNumber.ToCStr());
-
- *pPath = String(buffer);
-
- return true;
-}
-
-bool HIDDeviceManager::Enumerate(HIDEnumerateVisitor* enumVisitor)
-{
- if (!initializeManager())
- {
- return false;
- }
-
-
- CFSetRef deviceSet = IOHIDManagerCopyDevices(HIDManager);
- if (!deviceSet)
- return false;
-
- CFIndex deviceCount = CFSetGetCount(deviceSet);
-
- // Allocate a block of memory and read the set into it.
- IOHIDDeviceRef* devices = (IOHIDDeviceRef*) OVR_ALLOC(sizeof(IOHIDDeviceRef) * deviceCount);
- CFSetGetValues(deviceSet, (const void **) devices);
-
-
- // Iterate over devices.
- for (CFIndex deviceIndex = 0; deviceIndex < deviceCount; deviceIndex++)
- {
- IOHIDDeviceRef hidDev = devices[deviceIndex];
-
- if (!hidDev)
- {
- continue;
- }
-
- HIDDeviceDesc devDesc;
-
- if (getPath(hidDev, &(devDesc.Path)) &&
- initVendorProductVersion(hidDev, &devDesc) &&
- enumVisitor->MatchVendorProduct(devDesc.VendorId, devDesc.ProductId) &&
- initUsage(hidDev, &devDesc))
- {
- initStrings(hidDev, &devDesc);
- initSerialNumber(hidDev, &devDesc);
-
- // Look for the device to check if it is already opened.
- Ptr<DeviceCreateDesc> existingDevice = DevManager->FindHIDDevice(devDesc, true);
- // if device exists and it is opened then most likely the CreateHIDFile
- // will fail; therefore, we just set Enumerated to 'true' and continue.
- if (existingDevice && existingDevice->pDevice)
- {
- existingDevice->Enumerated = true;
- continue;
- }
-
- // Construct minimal device that the visitor callback can get feature reports from.
- OSX::HIDDevice device(this, hidDev);
-
- enumVisitor->Visit(device, devDesc);
- }
- }
-
- OVR_FREE(devices);
- CFRelease(deviceSet);
-
- return true;
-}
-
-OVR::HIDDevice* HIDDeviceManager::Open(const String& path)
-{
-
- Ptr<OSX::HIDDevice> device = *new OSX::HIDDevice(this);
-
- if (!device->HIDInitialize(path))
- {
- return NULL;
- }
-
- device->AddRef();
-
- return device;
-}
-
-bool HIDDeviceManager::getFullDesc(IOHIDDeviceRef device, HIDDeviceDesc* desc)
-{
-
- if (!initVendorProductVersion(device, desc))
- {
- return false;
- }
-
- if (!initUsage(device, desc))
- {
- return false;
- }
-
- if (!initSerialNumber(device, desc))
- {
- return false;
- }
-
- initStrings(device, desc);
-
- return true;
-}
-
-// New USB device specified in the matching dictionary has been added (callback function)
-void HIDDeviceManager::staticDeviceMatchingCallback(void *inContext,
- IOReturn inResult,
- void *inSender,
- IOHIDDeviceRef inIOHIDDeviceRef)
-{
- OVR_UNUSED(inResult);
- OVR_UNUSED(inSender);
- HIDDeviceManager* hidMgr = static_cast<HIDDeviceManager*>(inContext);
- HIDDeviceDesc hidDevDesc;
- hidMgr->getPath(inIOHIDDeviceRef, &hidDevDesc.Path);
- hidMgr->getFullDesc(inIOHIDDeviceRef, &hidDevDesc);
-
- hidMgr->DevManager->DetectHIDDevice(hidDevDesc);
-}
-
-//-------------------------------------------------------------------------------------
-// **** OSX::HIDDevice
-
-HIDDevice::HIDDevice(HIDDeviceManager* manager)
- : InMinimalMode(false), HIDManager(manager)
-{
- Device = NULL;
- RepluggedNotificationPort = 0;
-}
-
-// This is a minimal constructor used during enumeration for us to pass
-// a HIDDevice to the visit function (so that it can query feature reports).
-HIDDevice::HIDDevice(HIDDeviceManager* manager, IOHIDDeviceRef device)
-: InMinimalMode(true), HIDManager(manager), Device(device)
-{
- RepluggedNotificationPort = 0;
-}
-
-HIDDevice::~HIDDevice()
-{
- if (!InMinimalMode)
- {
- HIDShutdown();
- }
-}
-
-bool HIDDevice::HIDInitialize(const String& path)
-{
-
- DevDesc.Path = path;
-
- if (!openDevice())
- {
- LogText("OVR::OSX::HIDDevice - Failed to open HIDDevice: %s", path.ToCStr());
- return false;
- }
-
- // Setup notification for when a device is unplugged and plugged back in.
- if (!setupDevicePluggedInNotification())
- {
- LogText("OVR::OSX::HIDDevice - Failed to setup notification for when device plugged back in.");
- closeDevice(false);
- return false;
- }
-
- HIDManager->DevManager->pThread->AddTicksNotifier(this);
-
-
- LogText("OVR::OSX::HIDDevice - Opened '%s'\n"
- " Manufacturer:'%s' Product:'%s' Serial#:'%s'\n",
- DevDesc.Path.ToCStr(),
- DevDesc.Manufacturer.ToCStr(), DevDesc.Product.ToCStr(),
- DevDesc.SerialNumber.ToCStr());
-
- return true;
-}
-
-bool HIDDevice::initInfo()
-{
- // Device must have been successfully opened.
- OVR_ASSERT(Device);
-
-
- // Get report lengths.
- SInt32 bufferLength;
- bool getResult = HIDManager->getIntProperty(Device, CFSTR(kIOHIDMaxInputReportSizeKey), &bufferLength);
- OVR_ASSERT(getResult);
- InputReportBufferLength = (UInt16) bufferLength;
-
- getResult = HIDManager->getIntProperty(Device, CFSTR(kIOHIDMaxOutputReportSizeKey), &bufferLength);
- OVR_ASSERT(getResult);
- OutputReportBufferLength = (UInt16) bufferLength;
-
- getResult = HIDManager->getIntProperty(Device, CFSTR(kIOHIDMaxFeatureReportSizeKey), &bufferLength);
- OVR_ASSERT(getResult);
- FeatureReportBufferLength = (UInt16) bufferLength;
-
-
- if (ReadBufferSize < InputReportBufferLength)
- {
- OVR_ASSERT_LOG(false, ("Input report buffer length is bigger than read buffer."));
- return false;
- }
-
- // Get device desc.
- if (!HIDManager->getFullDesc(Device, &DevDesc))
- {
- OVR_ASSERT_LOG(false, ("Failed to get device desc while initializing device."));
- return false;
- }
-
- return true;
-}
-
-void HIDDevice::staticDeviceAddedCallback(void* pContext, io_iterator_t iterator)
-{
- HIDDevice* pDevice = (HIDDevice*) pContext;
- pDevice->deviceAddedCallback(iterator);
-}
-
-void HIDDevice::deviceAddedCallback(io_iterator_t iterator)
-{
-
- if (Device == NULL)
- {
- if (openDevice())
- {
- LogText("OVR::OSX::HIDDevice - Reopened device : %s", DevDesc.Path.ToCStr());
-
- Ptr<DeviceCreateDesc> existingHIDDev = HIDManager->DevManager->FindHIDDevice(DevDesc, true);
- if (existingHIDDev && existingHIDDev->pDevice)
- {
- HIDManager->DevManager->CallOnDeviceAdded(existingHIDDev);
- }
- }
- }
-
- // Reset callback.
- while (IOIteratorNext(iterator))
- ;
-}
-
-bool HIDDevice::openDevice()
-{
-
- // Have to iterate through devices again to generate paths.
- CFSetRef deviceSet = IOHIDManagerCopyDevices(HIDManager->HIDManager);
- CFIndex deviceCount = CFSetGetCount(deviceSet);
-
- // Allocate a block of memory and read the set into it.
- IOHIDDeviceRef* devices = (IOHIDDeviceRef*) OVR_ALLOC(sizeof(IOHIDDeviceRef) * deviceCount);
- CFSetGetValues(deviceSet, (const void **) devices);
-
-
- // Iterate over devices.
- IOHIDDeviceRef device = NULL;
-
- for (CFIndex deviceIndex = 0; deviceIndex < deviceCount; deviceIndex++)
- {
- IOHIDDeviceRef tmpDevice = devices[deviceIndex];
-
- if (!tmpDevice)
- {
- continue;
- }
-
- String path;
- if (!HIDManager->getPath(tmpDevice, &path))
- {
- continue;
- }
-
- if (path == DevDesc.Path)
- {
- device = tmpDevice;
- break;
- }
- }
-
-
- OVR_FREE(devices);
-
- if (!device)
- {
- CFRelease(deviceSet);
- return false;
- }
-
- // Attempt to open device.
- if (IOHIDDeviceOpen(device, kIOHIDOptionsTypeSeizeDevice)
- != kIOReturnSuccess)
- {
- CFRelease(deviceSet);
- return false;
- }
-
- // Retain the device before we release the set.
- CFRetain(device);
- CFRelease(deviceSet);
-
-
- Device = device;
-
-
- if (!initInfo())
- {
- IOHIDDeviceClose(Device, kIOHIDOptionsTypeSeizeDevice);
- CFRelease(Device);
- Device = NULL;
- return false;
- }
-
-
- // Setup the Run Loop and callbacks.
- IOHIDDeviceScheduleWithRunLoop(Device,
- HIDManager->getRunLoop(),
- kCFRunLoopDefaultMode);
-
- IOHIDDeviceRegisterInputReportCallback(Device,
- ReadBuffer,
- ReadBufferSize,
- staticHIDReportCallback,
- this);
-
- IOHIDDeviceRegisterRemovalCallback(Device,
- staticDeviceRemovedCallback,
- this);
-
- return true;
-}
-
-void HIDDevice::HIDShutdown()
-{
-
- HIDManager->DevManager->pThread->RemoveTicksNotifier(this);
-
- if (Device != NULL) // Device may already have been closed if unplugged.
- {
- closeDevice(false);
- }
-
- IOObjectRelease(RepluggedNotification);
- if (RepluggedNotificationPort)
- IONotificationPortDestroy(RepluggedNotificationPort);
-
- LogText("OVR::OSX::HIDDevice - HIDShutdown '%s'\n", DevDesc.Path.ToCStr());
-}
-
-bool HIDDevice::setupDevicePluggedInNotification()
-{
-
- // Setup notification when devices are plugged in.
- RepluggedNotificationPort = IONotificationPortCreate(kIOMasterPortDefault);
-
- CFRunLoopSourceRef notificationRunLoopSource =
- IONotificationPortGetRunLoopSource(RepluggedNotificationPort);
-
- CFRunLoopAddSource(HIDManager->getRunLoop(),
- notificationRunLoopSource,
- kCFRunLoopDefaultMode);
-
- CFMutableDictionaryRef matchingDict = IOServiceMatching(kIOUSBDeviceClassName);
-
- // Have to specify vendorId and productId. Doesn't seem to accept additional
- // things like serial number.
- SInt32 vendorId = DevDesc.VendorId;
- CFNumberRef numberRef = CFNumberCreate(kCFAllocatorDefault,
- kCFNumberSInt32Type,
- &vendorId);
- CFDictionarySetValue(matchingDict, CFSTR(kUSBVendorID), numberRef);
- CFRelease(numberRef);
-
- SInt32 deviceProductId = DevDesc.ProductId;
- numberRef = CFNumberCreate(kCFAllocatorDefault,
- kCFNumberSInt32Type,
- &deviceProductId);
- CFDictionarySetValue(matchingDict, CFSTR(kUSBProductID), numberRef);
- CFRelease(numberRef);
-
- kern_return_t result =
- IOServiceAddMatchingNotification(RepluggedNotificationPort,
- kIOMatchedNotification,
- matchingDict,
- staticDeviceAddedCallback,
- this,
- &RepluggedNotification);
-
- if (result != KERN_SUCCESS)
- {
- CFRelease(RepluggedNotificationPort);
- RepluggedNotificationPort = 0;
- return false;
- }
-
- // Iterate through to arm.
- while (IOIteratorNext(RepluggedNotification))
- {
- }
-
- return true;
-}
-
-void HIDDevice::closeDevice(bool wasUnplugged)
-{
- OVR_ASSERT(Device != NULL);
-
- if (!wasUnplugged)
- {
- // Clear the registered callbacks.
- IOHIDDeviceRegisterInputReportCallback(Device,
- ReadBuffer,
- InputReportBufferLength,
- NULL,
- this);
-
- IOHIDDeviceRegisterRemovalCallback(Device, NULL, this);
-
- IOHIDDeviceUnscheduleFromRunLoop(Device,
- HIDManager->getRunLoop(),
- kCFRunLoopDefaultMode);
- IOHIDDeviceClose(Device, kIOHIDOptionsTypeNone);
- }
-
- CFRelease(Device);
- Device = NULL;
-
- LogText("OVR::OSX::HIDDevice - HID Device Closed '%s'\n", DevDesc.Path.ToCStr());
-}
-
-void HIDDevice::staticHIDReportCallback(void* pContext,
- IOReturn result,
- void* pSender,
- IOHIDReportType reportType,
- uint32_t reportId,
- uint8_t* pReport,
- CFIndex reportLength)
-{
- OVR_UNUSED(result);
- OVR_UNUSED(pSender);
- OVR_UNUSED(reportType);
- OVR_UNUSED(reportId);
-
- HIDDevice* pDevice = (HIDDevice*) pContext;
- return pDevice->hidReportCallback(pReport, (UInt32)reportLength);
-}
-
-void HIDDevice::hidReportCallback(UByte* pData, UInt32 length)
-{
-
- // We got data.
- if (Handler)
- {
- Handler->OnInputReport(pData, length);
- }
-}
-
-void HIDDevice::staticDeviceRemovedCallback(void* pContext, IOReturn result, void* pSender)
-{
- OVR_UNUSED(result);
- OVR_UNUSED(pSender);
- HIDDevice* pDevice = (HIDDevice*) pContext;
- pDevice->deviceRemovedCallback();
-}
-
-void HIDDevice::deviceRemovedCallback()
-{
- Ptr<HIDDevice> _this(this); // prevent from release
-
- Ptr<DeviceCreateDesc> existingHIDDev = HIDManager->DevManager->FindHIDDevice(DevDesc, true);
- if (existingHIDDev && existingHIDDev->pDevice)
- {
- HIDManager->DevManager->CallOnDeviceRemoved(existingHIDDev);
- }
- closeDevice(true);
-}
-
-CFStringRef HIDDevice::generateRunLoopModeString(IOHIDDeviceRef device)
-{
- const UInt32 safeBuffSize = 256;
- char nameBuff[safeBuffSize];
- OVR_sprintf(nameBuff, safeBuffSize, "%016lX", device);
-
- return CFStringCreateWithCString(NULL, nameBuff, kCFStringEncodingASCII);
-}
-
-bool HIDDevice::SetFeatureReport(UByte* data, UInt32 length)
-{
-
- if (!Device)
- return false;
-
- UByte reportID = data[0];
-
- if (reportID == 0)
- {
- // Not using reports so remove from data packet.
- data++;
- length--;
- }
-
- IOReturn result = IOHIDDeviceSetReport( Device,
- kIOHIDReportTypeFeature,
- reportID,
- data,
- length);
-
- return (result == kIOReturnSuccess);
-}
-
-bool HIDDevice::GetFeatureReport(UByte* data, UInt32 length)
-{
- if (!Device)
- return false;
-
- CFIndex bufferLength = length;
-
- // Report id is in first byte of the buffer.
- IOReturn result = IOHIDDeviceGetReport(Device, kIOHIDReportTypeFeature, data[0], data, &bufferLength);
-
- return (result == kIOReturnSuccess);
-}
-
-double HIDDevice::OnTicks(double tickSeconds)
-{
-
- if (Handler)
- {
- return Handler->OnTicks(tickSeconds);
- }
-
- return DeviceManagerThread::Notifier::OnTicks(tickSeconds);
-}
-
-HIDDeviceManager* HIDDeviceManager::CreateInternal(OSX::DeviceManager* devManager)
-{
-
- if (!System::IsInitialized())
- {
- // Use custom message, since Log is not yet installed.
- OVR_DEBUG_STATEMENT(Log::GetDefaultLog()->
- LogMessage(Log_Debug, "HIDDeviceManager::Create failed - OVR::System not initialized"); );
- return 0;
- }
-
- Ptr<OSX::HIDDeviceManager> manager = *new OSX::HIDDeviceManager(devManager);
-
- if (manager)
- {
- if (manager->Initialize())
- {
- manager->AddRef();
- }
- else
- {
- manager.Clear();
- }
- }
-
- return manager.GetPtr();
-}
-
-} // namespace OSX
-
-//-------------------------------------------------------------------------------------
-// ***** Creation
-
-// Creates a new HIDDeviceManager and initializes OVR.
-HIDDeviceManager* HIDDeviceManager::Create(Ptr<OVR::DeviceManager>& deviceManager)
-{
-
- if (!System::IsInitialized())
- {
- // Use custom message, since Log is not yet installed.
- OVR_DEBUG_STATEMENT(Log::GetDefaultLog()->
- LogMessage(Log_Debug, "HIDDeviceManager::Create failed - OVR::System not initialized"); );
- return 0;
- }
-
- Ptr<OSX::DeviceManager> deviceManagerOSX = *new OSX::DeviceManager;
-
- if (!deviceManagerOSX)
- {
- return NULL;
- }
-
- if (!deviceManagerOSX->Initialize(NULL))
- {
- return NULL;
- }
-
- deviceManager = deviceManagerOSX;
-
- return deviceManagerOSX->GetHIDDeviceManager();
-}
-
-} // namespace OVR