/// <summary> /// Resolves the device. /// </summary> /// <returns>returns JoystickDevice if driver is for this device or null</returns> /// <param name="info">Info.</param> /// <param name="hidDevice">Hid device.</param> public IDevice ResolveDevice(IHIDDevice hidDevice) { this._hidInterface = hidDevice.hidInterface; IntPtr deviceRef = hidDevice.deviceHandle; JoystickDevice device; int axisIndex = 0; int buttonIndex = 0; Native.CFArray elements = new Native.CFArray(); IOHIDElementRef element; IOHIDElementType type; //copy all matched elements.typeRef = Native.IOHIDDeviceCopyMatchingElements(deviceRef, IntPtr.Zero, (int)Native.IOHIDOptionsType.kIOHIDOptionsTypeNone); int numButtons = 0; int numPov = 0; int numElements = elements.Length; int HIDElementType = Native.IOHIDElementGetTypeID(); //check for profile DeviceProfile profile = hidDevice.loadProfile(); IAxisDetails axisDetailsPovX = null; IAxisDetails axisDetailsPovY = null; List <IAxisDetails> axisDetailsList = new List <IAxisDetails>(); IAxisDetails axisDetails; for (int elementIndex = 0; elementIndex < numElements; elementIndex++) { element = elements[elementIndex].typeRef; if (element != IntPtr.Zero && Native.CFGetTypeID(element) == HIDElementType) { type = Native.IOHIDElementGetType(element); // All of the axis elements I've ever detected have been kIOHIDElementTypeInput_Misc. kIOHIDElementTypeInput_Axis is only included for good faith... if (type == IOHIDElementType.kIOHIDElementTypeInput_Misc || type == IOHIDElementType.kIOHIDElementTypeInput_Axis) { axisDetails = new AxisDetails(); axisDetails.uid = Native.IOHIDElementGetCookie(element); axisDetails.min = (int)Native.IOHIDElementGetLogicalMin(element); axisDetails.max = (int)Native.IOHIDElementGetLogicalMax(element); axisDetails.isNullable = Native.IOHIDElementHasNullState(element); if (Native.IOHIDElementGetUsage(element) == (uint)Native.HIDUsageGD.Hatswitch) { axisDetails.isHat = true; axisDetailsPovX = axisDetails; axisDetailsPovY = new AxisDetails(); axisDetailsPovY.uid = Native.IOHIDElementGetCookie(element); axisDetailsPovY.min = (int)Native.IOHIDElementGetLogicalMin(element); axisDetailsPovY.max = (int)Native.IOHIDElementGetLogicalMax(element); axisDetailsPovY.isNullable = Native.IOHIDElementHasNullState(element); axisDetailsPovY.isHat = true; numPov++; } else { if (axisDetails.min == 0) { axisDetails.isTrigger = true; } axisDetailsList.Add(axisDetails); } } else if (type == IOHIDElementType.kIOHIDElementTypeInput_Button) { numButtons++; } } } if (axisDetailsPovX != null) { int diff; diff = axisDetailsList.Count - 8; //need 2 slots for Pov X,Y if (diff >= 0) { //just insert them axisDetailsList.Insert((int)JoystickAxis.AxisPovX, axisDetailsPovX); axisDetailsList.Insert((int)JoystickAxis.AxisPovY, axisDetailsPovY); } else if (diff < -1) { diff = diff + 2; while (diff < 0) { axisDetailsList.Add(null); diff += 1; } axisDetailsList.Add(axisDetailsPovX); axisDetailsList.Add(axisDetailsPovY); } else //=-1 { axisDetailsList.Resize(9); axisDetailsList[(int)JoystickAxis.AxisPovX] = axisDetailsPovX; axisDetailsList[(int)JoystickAxis.AxisPovY] = axisDetailsPovY; } } device = new JoystickDevice(hidDevice.index, hidDevice.PID, hidDevice.VID, hidDevice.ID, axisDetailsList.Count, numButtons, this); device.Name = hidDevice.Name; device.numPOV = numPov; device.profile = profile; for (; axisIndex < device.Axis.Count; axisIndex++) { device.Axis[(JoystickAxis)axisIndex] = axisDetailsList[axisIndex]; if (profile != null && profile.axisNaming.Length > axisIndex && device.Axis[axisIndex] != null) { device.Axis[axisIndex].name = profile.axisNaming [axisIndex]; } } for (int elementIndex = 0; elementIndex < numElements; elementIndex++) { element = elements[elementIndex].typeRef; if (element != IntPtr.Zero && Native.CFGetTypeID(element) == HIDElementType) { type = Native.IOHIDElementGetType(element); if (type == IOHIDElementType.kIOHIDElementTypeInput_Button) { // device.Buttons[buttonIndex] = new ButtonDetails(Native.IOHIDElementGetCookie(element)); if (profile != null && profile.buttonNaming.Length > buttonIndex) { device.Buttons[buttonIndex].name = profile.buttonNaming [buttonIndex]; } buttonIndex++; } } } //joystick.isReady = false; device.Extension = new OSXDefaultExtension(); return(device); }