///!!! Sorry I couldn't found yet SetMotor and SetMotor

      
        /// <summary>
        /// 
        /// </summary>
        /// <param name="device"></param>
        /// <param name="mode"></param>
        internal void SetLed(XInputDevice device, byte mode)
        {
           

            _hidInterface.Write(new byte[]{0x1, 0x3, mode},device.ID);
        
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="device"></param>
        /// <param name="leftMotor"></param>
        /// <param name="rightMotor"></param>
        internal void SetMotor(XInputDevice device, byte leftMotor, byte rightMotor)
        {

			////char buf[] = {0x00, 0x01, 0x0f, 0xc0, 0x00, large, small, 0x00, 0x00, 0x00, 0x00, 0x00};
           // _hidInterface.Write(new byte[] { 0x00, 0x01, 0x0f, 0xc0, 0x00, leftMotor, rightMotor, 0x00, 0x00, 0x00, 0x00, 0x00 }, 
//			_hidInterface.Write (new byte[]{ 0x01, 0x0f, 0xc0, 0x00, leftMotor, rightMotor},device.PID);
//			_hidInterface.Write (new byte[]{ leftMotor, rightMotor},device.PID);
//			_hidInterface.Write (new byte[]{ 0x40, leftMotor, rightMotor},device.PID);
			throw new Exception ("Motor byte combination unknown");

  
        }
        public IDevice ResolveDevice(IHIDDevice hidDevice)
        //public IDevice<IAxisDetails, IButtonDetails, IDeviceExtension> ResolveDevice(IHIDDeviceInfo info)
        {
            int type = -1;
            int len = XPAD_DEVICE.Length;
            for (int inx = 0; inx < len; inx += 3)
            {
                if (hidDevice.VID == XPAD_DEVICE[inx] && hidDevice.PID == XPAD_DEVICE[inx + 1])
                {
                    type = XPAD_DEVICE[inx + 2];
                    break;
                }
            }

            if (type < 0) return null;

            XInputDevice device;
            int i = 0;

           _hidInterface = hidDevice.hidInterface;


			//check for profile
			DeviceProfile profile = hidDevice.loadProfile();


           


            device = new XInputDevice(hidDevice.index, hidDevice.PID, hidDevice.VID,hidDevice.ID, 8, 20, this, type);
			device.Name = hidDevice.Name;
			device.profile = profile;

		

			
			
			//inti button structure
            for (; i < 20; i++)
            {
                device.Buttons[i] = new ButtonDetails();

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

            //LX
            axisDetails = new AxisDetails();
            axisDetails.max = 65535;
            axisDetails.min = 0;
            device.Axis[JoystickAxis.AxisX] = axisDetails;


            //LY
            axisDetails = new AxisDetails();
            axisDetails.max = 65535;
            axisDetails.min = 0;
            device.Axis[JoystickAxis.AxisY] = axisDetails;

            //RX
#if UNITY_STANDALONE_OSX 
            axisDetails = new AxisDetails();
            axisDetails.max = 65535;
            axisDetails.min = 0;
            device.Axis[JoystickAxis.AxisZ] = axisDetails;
#endif

 //RX
#if UNITY_STANDALONE_WIN
            axisDetails = new AxisDetails();
            axisDetails.max = 65535;
            axisDetails.min = 0;
            device.Axis[JoystickAxis.AxisU] = axisDetails;
#endif

            //RY
            axisDetails = new AxisDetails();
            axisDetails.max = 65535;
            axisDetails.min = 0;
            device.Axis[JoystickAxis.AxisR] = axisDetails;


            //TRIGGERS

            //LEFT TRIGGER
            #if UNITY_STANDALONE_OSX
            axisDetails = new AxisDetails();
            axisDetails.max = 128;
            axisDetails.min = 0;
            device.Axis[JoystickAxis.AxisU] = axisDetails;

			//RIGHT TRIGGER
			axisDetails = new AxisDetails();
			axisDetails.max = 128;
			axisDetails.min = 0;
			device.Axis[JoystickAxis.AxisV] = axisDetails;
			#endif
			
			
			//LEFT TRIGGER
			#if UNITY_STANDALONE_WIN
            axisDetails = new AxisDetails();
            axisDetails.max = 128;
            axisDetails.min = 0;
            device.Axis[JoystickAxis.AxisZ] = axisDetails;
          


            //RIGHT TRIGGER
            axisDetails = new AxisDetails();
            axisDetails.max = 128;
            axisDetails.min = 0;
            device.Axis[JoystickAxis.AxisV] = axisDetails;
			#endif

            //POV
            axisDetails = new AxisDetails();
            axisDetails.isHat = true;
            device.Axis[JoystickAxis.AxisPovX] = axisDetails;
            axisDetails = new AxisDetails();
            axisDetails.isHat = true;
            device.Axis[JoystickAxis.AxisPovY] = axisDetails;

            ((HIDDevice)hidDevice).InputReportByteLength = 15;
            ((HIDDevice)hidDevice).OutputReportByteLength = 12;

			int numAxis=device.Axis.Count;
			for (i=0; i < numAxis; i++) {

				if (profile != null && profile.axisNaming.Length > i) {
					device.Axis [i].name = profile.axisNaming [i];
					
				}
				
			}
			
			
			return device;
			//return (IDevice<AxisDetails, ButtonDetails, XInputExtension>)joystick;
        }