public OSXHIDInterface() { __drivers = new List <IDriver>(); __ports = new string[20]; HandleHIDDeviceAdded = HidDeviceAdded; HandleHIDDeviceRemoved = HidDeviceRemoved; HandleDeviceRemoved = DeviceRemoved; CFDictionaryRef[] dictionaries; dictionaries = new CFDictionaryRef[3]; //create 3 search patterns by Joystick,GamePad and MulitAxisController // base.typeRef = CFLibrary.CFDictionaryCreate(IntPtr.Zero,keyz,values,keys.Length,ref kcall,ref vcall); dictionaries[0] = CreateDeviceMatchingDictionary((uint)Native.HIDPage.GenericDesktop, (uint)Native.HIDUsageGD.Joystick); dictionaries[1] = CreateDeviceMatchingDictionary((uint)Native.HIDPage.GenericDesktop, (uint)Native.HIDUsageGD.GamePad); dictionaries[2] = CreateDeviceMatchingDictionary((uint)Native.HIDPage.GenericDesktop, (uint)Native.HIDUsageGD.MultiAxisController); DeviceTypes = new Native.CFArray(dictionaries); //create Hid manager hidmanager = Native.IOHIDManagerCreate(IntPtr.Zero, (int)Native.IOHIDOptionsType.kIOHIDOptionsTypeNone); }
/// <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); }
public OSXHIDInterface() { __drivers = new List<IDriver>(); __ports = new string[20]; HandleHIDDeviceAdded = HidDeviceAdded; HandleHIDDeviceRemoved = HidDeviceRemoved; HandleDeviceRemoved = DeviceRemoved; CFDictionaryRef[] dictionaries; dictionaries = new CFDictionaryRef[3]; //create 3 search patterns by Joystick,GamePad and MulitAxisController // base.typeRef = CFLibrary.CFDictionaryCreate(IntPtr.Zero,keyz,values,keys.Length,ref kcall,ref vcall); dictionaries[0] = CreateDeviceMatchingDictionary((uint)Native.HIDPage.GenericDesktop,(uint)Native.HIDUsageGD.Joystick); dictionaries[1] = CreateDeviceMatchingDictionary((uint)Native.HIDPage.GenericDesktop,(uint)Native.HIDUsageGD.GamePad); dictionaries[2] = CreateDeviceMatchingDictionary((uint)Native.HIDPage.GenericDesktop,(uint)Native.HIDUsageGD.MultiAxisController); DeviceTypes= new Native.CFArray (dictionaries); //create Hid manager hidmanager = Native.IOHIDManagerCreate(IntPtr.Zero,(int)Native.IOHIDOptionsType.kIOHIDOptionsTypeNone); }
/// <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; }