Esempio n. 1
0
        public override HIDReport ReadDefault()
        {
            if (!IsConnected)
            {
                return(null);
            }

            //thru to get joystick info
            Native.JoystickError result = Native.joyGetPosEx(ord, ref info);


            if (result == Native.JoystickError.NoError)
            {
                CompactDeviceData.Clear();
                CompactDeviceData.Add(BitConverter.GetBytes(info.Buttons));                                              //4B
                CompactDeviceData.Add(BitConverter.GetBytes(info.Pov));                                                  //2B
                CompactDeviceData.Add(BitConverter.GetBytes(info.XPos));                                                 //4B
                CompactDeviceData.Add(BitConverter.GetBytes(info.YPos));
                CompactDeviceData.Add(BitConverter.GetBytes(info.ZPos));
                CompactDeviceData.Add(BitConverter.GetBytes(info.RPos));
                CompactDeviceData.Add(BitConverter.GetBytes(info.UPos));
                CompactDeviceData.Add(BitConverter.GetBytes(info.VPos));



                byte[] compactByteArray = new byte[30];
                int    inx = 0;
                int    len;

                for (int i = 0; i < 8; i++)
                {
                    len = CompactDeviceData [i].Length;
                    System.Buffer.BlockCopy(CompactDeviceData [i], 0, compactByteArray, inx, len);
                    inx += len;
                }



                __lastHIDReport.Data   = compactByteArray;
                __lastHIDReport.Status = HIDReport.ReadStatus.Success;
            }
            else
            {
                __lastHIDReport.Data   = new byte[1];
                __lastHIDReport.Status = HIDReport.ReadStatus.ReadError;
            }


            return(__lastHIDReport);
        }
Esempio n. 2
0
        public IDevice ResolveDevice(IHIDDevice hidDevice)
        {
            _hidInterface = hidDevice.hidInterface;

            JoystickDevice device;

            //Get jostick capabilities
            Native.JoyCaps       caps;
            Native.JoystickError result = Native.JoystickError.InvalidParameters;



            DeviceProfile profile;



            int i;

            for (i = 0; i < 16; i++)
            {
                result = Native.joyGetDevCaps(i, out caps, Native.JoyCaps.SizeInBytes);


                if (result == Native.JoystickError.NoError && caps.PID == hidDevice.PID && hidDevice.VID == caps.VID)
                {
                    //UnityEngine.Debug.Log("ID:"+i+" on PID:"+info.PID+" VID:"+info.VID+" info:"+info.DevicePath+"Bts"+caps.NumButtons.ToString()+"axes"+caps.NumAxes
                    //  +"ProdID"+caps.PID+" name:"+caps.ProductName+" regkey"+caps.RegKey+"Man:"+caps.VID);



                    int num_axes = caps.NumAxes;

                    //!!! save ordNumber(I don't have still function that would return ordNum for WinMM from PID);
                    ((GenericHIDDevice)hidDevice).ord = i;

                    profile = hidDevice.loadProfile();

                    device           = new JoystickDevice(hidDevice.index, hidDevice.PID, hidDevice.VID, hidDevice.ID, 8, caps.NumButtons, this);
                    device.Extension = new WinDefaultExtension();
                    device.Name      = hidDevice.Name;
                    device.profile   = profile;

                    int buttonIndex = 0;
                    for (; buttonIndex < caps.NumButtons; buttonIndex++)
                    {
                        device.Buttons[buttonIndex] = new ButtonDetails();

                        if (profile != null && profile.buttonNaming.Length > buttonIndex)
                        {
                            device.Buttons[buttonIndex].name = profile.buttonNaming[buttonIndex];
                        }
                    }


                    // Make sure to reverse the vertical axes, so that +1 points up and -1 points down.
                    int         axis = 0;
                    AxisDetails axisDetails;
                    if (axis < num_axes)
                    {
                        axisDetails       = new AxisDetails();
                        axisDetails.max   = caps.XMax;
                        axisDetails.min   = caps.XMin;
                        device.Axis[axis] = axisDetails;
                        //if(axisDetails.min==0 && axisDetails.max==255) axisDetails.isTrigger=true;

                        if (profile != null && profile.axisNaming.Length > axis)
                        {
                            axisDetails.name = profile.axisNaming[axis];
                        }

                        axis++;
                    }
                    if (axis < num_axes)
                    {
                        axisDetails     = new AxisDetails();
                        axisDetails.max = caps.YMax;
                        axisDetails.min = caps.YMin;
                        // if (axisDetails.min == 0 && axisDetails.max == 32767) axisDetails.isTrigger = true;
                        device.Axis[axis] = axisDetails;


                        if (profile != null && profile.axisNaming.Length > axis)
                        {
                            axisDetails.name = profile.axisNaming[axis];
                        }

                        //	stick.Details.Min[axis] = caps.YMin; stick.Details.Max[axis] = caps.YMax;
                        axis++;
                    }
                    if (axis < num_axes)
                    {
                        axisDetails     = new AxisDetails();
                        axisDetails.max = caps.ZMax;
                        axisDetails.min = caps.ZMin;
                        //if(axisDetails.min==0) axisDetails.isTrigger=true;
                        device.Axis[axis] = axisDetails;

                        if (profile != null && profile.axisNaming.Length > axis)
                        {
                            axisDetails.name = profile.axisNaming[axis];
                        }

                        axis++;
                    }

                    if (axis < num_axes)
                    {
                        axisDetails     = new AxisDetails();
                        axisDetails.min = caps.RMin;
                        axisDetails.max = caps.RMax;
                        //    if (axisDetails.min == 0 && axisDetails.max == 255) axisDetails.isTrigger = true;
                        device.Axis[axis] = axisDetails;

                        if (profile != null && profile.axisNaming.Length > axis)
                        {
                            axisDetails.name = profile.axisNaming[axis];
                        }

                        axis++;
                    }

                    if (axis < num_axes)
                    {
                        axisDetails     = new AxisDetails();
                        axisDetails.min = caps.UMin;
                        axisDetails.max = caps.UMax;
                        //     if (axisDetails.min == 0 && axisDetails.max == 255) axisDetails.isTrigger = true;
                        device.Axis[axis] = axisDetails;
                        if (profile != null && profile.axisNaming.Length > axis)
                        {
                            axisDetails.name = profile.axisNaming[axis];
                        }
                        axis++;
                    }

                    if (axis < num_axes)
                    {
                        axisDetails     = new AxisDetails();
                        axisDetails.max = caps.VMax;
                        axisDetails.min = caps.VMin;
                        //     if (axisDetails.min == 0 && axisDetails.max == 255) axisDetails.isTrigger = true;
                        device.Axis[axis] = axisDetails;

                        if (profile != null && profile.axisNaming.Length > axis)
                        {
                            axisDetails.name = profile.axisNaming[axis];
                        }
                        axis++;
                    }

                    if ((caps.Capabilities & Native.JoystCapsFlags.HasPov) != 0)
                    {
                        device.Axis[JoystickAxis.AxisPovX] = new AxisDetails();
                        device.Axis[JoystickAxis.AxisPovY] = new AxisDetails();

                        if (profile != null && profile.axisNaming.Length > (int)JoystickAxis.AxisPovX)
                        {
                            device.Axis[JoystickAxis.AxisPovX].name = profile.axisNaming[(int)JoystickAxis.AxisPovX];
                        }

                        if (profile != null && profile.axisNaming.Length > (int)JoystickAxis.AxisPovY)
                        {
                            device.Axis[JoystickAxis.AxisPovY].name = profile.axisNaming[(int)JoystickAxis.AxisPovY];
                        }


                        device.numPOV = 1;

                        //                        WinDefaultExtension extension = joystick.Extension as WinDefaultExtension;
                        //
                        //                        extension.PovType = Native.PovType.Exists;
                        //                        if ((caps.Capabilities & Native.JoystCapsFlags.HasPov4Dir) != 0)
                        //                            extension.PovType |= Native.PovType.Discrete;
                        //                        if ((caps.Capabilities & Native.JoystCapsFlags.HasPovContinuous) != 0)
                        //                            extension.PovType |= Native.PovType.Continuous;
                    }



                    //  UnityEngine.Debug.Log(" max:" + caps.YMax + " min:" + caps.YMin + " max:" + caps.ZMax + " min:" + caps.ZMin);

                    //    UnityEngine.Debug.Log(" max:" + caps.RMax + " min:" + caps.RMin + " max:" + caps.UMax + " min:" + caps.UMin);

                    return(device);
                }
            }


            return(null);

            //return (IDevice<IAxisDetails, IButtonDetails, IDeviceExtension>)joystick;
        }