/// <summary> /// Finds and releases the joystick identified and authorized by JoyCapabilities struct. /// </summary> /// <param name="capabilities">Struct containing a token which is checked for safety /// - to make sure that the current owner of joystick wants to release the joystick</param> /// <returns>Success of disconnect operation</returns> public bool Disconnect(JoyCapabilities capabilities) { foreach (var joy in _joystics.Where(joy => joy.IsBusy && joy.Capabilities.Token == capabilities.Token)) { return(joy.Disconnect()); } return(false); }
/// <summary> /// Finds and releases the joystick identified and authorized by JoyCapabilities struct. /// </summary> /// <param name="capabilities">Struct containing a token which is checked for safety /// - to make sure that the current owner of joystick wants to release the joystick</param> /// <returns>Success of disconnect operation</returns> public bool Disconnect(JoyCapabilities capabilities) { foreach (var joy in _joystics.Where(joy => joy.IsBusy && joy.Capabilities.Token == capabilities.Token)) { return joy.Disconnect(); } return false; }
/// <summary> /// Tries to connect to the current instance of JoyControl which manages a specific virtual joystick /// </summary> /// <returns>Struct containing information about engaged joystick or (in case of error) /// information describing eventual problems with request</returns> public JoyCapabilities TryConnect() { if (IsBusy) { throw new Exception("Cannot connect to a joystick already connected."); } /* Creating a new instance every time when we start a new connection * because we have to refresh the access token to preserve the uniqueness * among all connection attempts */ Capabilities = new JoyCapabilities(); /* Checking if the vJoy driver is enabled */ if (!_joystick.vJoyEnabled()) { Capabilities.ErrorInfo = "vJoy driver not enabled."; return(Capabilities); } /* For information purposes only */ Capabilities.JoyInfo = String.Format("Vendor: {0}, Product :{1}, Version Number:{2}.", _joystick.GetvJoyManufacturerString(), _joystick.GetvJoyProductString(), _joystick.GetvJoySerialNumberString()); /* Checking eventual problems with occupied or not installed joystick */ var status = _joystick.GetVJDStatus(_joyId); switch (status) { case VjdStat.VJD_STAT_OWN: case VjdStat.VJD_STAT_FREE: break; case VjdStat.VJD_STAT_BUSY: Capabilities.ErrorInfo = String.Format("vJoy Device {0} is already owned by another feeder. Cannot continue.", _joyId); return(Capabilities); case VjdStat.VJD_STAT_MISS: Capabilities.ErrorInfo = String.Format("vJoy Device {0} is not installed or disabled. Cannot continue.", _joyId); return(Capabilities); default: Capabilities.ErrorInfo = String.Format("vJoy Device {0} general error. Cannot continue.", _joyId); return(Capabilities); } /* ##### Remark ##### * Generally a situation that in this moment the joystick is in state VJD_STAT_OWN shouldn't be possible * and we can consider to throw an exception when the situation occurs. */ /* Engaging joystick with specified id with the current instance of JoyControl */ if ((status == VjdStat.VJD_STAT_OWN) || ((status == VjdStat.VJD_STAT_FREE) && (!_joystick.AcquireVJD(_joyId)))) { Capabilities.ErrorInfo = String.Format("Failed to acquire vJoy device number {0}.", _joyId); return(Capabilities); } IsBusy = true; _joystick.ResetVJD(_joyId); Capabilities.JoyId = _joyId; Capabilities.AxisXExists = _joystick.GetVJDAxisExist(_joyId, HID_USAGES.HID_USAGE_X); Capabilities.AxisXExists = _joystick.GetVJDAxisExist(_joyId, HID_USAGES.HID_USAGE_Y); Capabilities.ButtonsCount = _joystick.GetVJDButtonNumber(_joyId); long max = 0; _joystick.GetVJDAxisMax(_joyId, HID_USAGES.HID_USAGE_X, ref max); Capabilities.AxisXMax = max; _joystick.GetVJDAxisMax(_joyId, HID_USAGES.HID_USAGE_X, ref max); Capabilities.AxisYMax = max; return(Capabilities); }
/// <summary> /// Tries to connect to the current instance of JoyControl which manages a specific virtual joystick /// </summary> /// <returns>Struct containing information about engaged joystick or (in case of error) /// information describing eventual problems with request</returns> public JoyCapabilities TryConnect() { if (IsBusy) throw new Exception("Cannot connect to a joystick already connected."); /* Creating a new instance every time when we start a new connection * because we have to refresh the access token to preserve the uniqueness * among all connection attempts */ Capabilities = new JoyCapabilities(); /* Checking if the vJoy driver is enabled */ if (!_joystick.vJoyEnabled()) { Capabilities.ErrorInfo = "vJoy driver not enabled."; return Capabilities; } /* For information purposes only */ Capabilities.JoyInfo = String.Format("Vendor: {0}, Product :{1}, Version Number:{2}.", _joystick.GetvJoyManufacturerString(), _joystick.GetvJoyProductString(), _joystick.GetvJoySerialNumberString()); /* Checking eventual problems with occupied or not installed joystick */ var status = _joystick.GetVJDStatus(_joyId); switch (status) { case VjdStat.VJD_STAT_OWN: case VjdStat.VJD_STAT_FREE: break; case VjdStat.VJD_STAT_BUSY: Capabilities.ErrorInfo = String.Format("vJoy Device {0} is already owned by another feeder. Cannot continue.", _joyId); return Capabilities; case VjdStat.VJD_STAT_MISS: Capabilities.ErrorInfo = String.Format("vJoy Device {0} is not installed or disabled. Cannot continue.", _joyId); return Capabilities; default: Capabilities.ErrorInfo = String.Format("vJoy Device {0} general error. Cannot continue.", _joyId); return Capabilities; } /* ##### Remark ##### * Generally a situation that in this moment the joystick is in state VJD_STAT_OWN shouldn't be possible * and we can consider to throw an exception when the situation occurs. */ /* Engaging joystick with specified id with the current instance of JoyControl */ if ((status == VjdStat.VJD_STAT_OWN) || ((status == VjdStat.VJD_STAT_FREE) && (!_joystick.AcquireVJD(_joyId)))) { Capabilities.ErrorInfo = String.Format("Failed to acquire vJoy device number {0}.", _joyId); return Capabilities; } IsBusy = true; _joystick.ResetVJD(_joyId); Capabilities.JoyId = _joyId; Capabilities.AxisXExists = _joystick.GetVJDAxisExist(_joyId, HID_USAGES.HID_USAGE_X); Capabilities.AxisXExists = _joystick.GetVJDAxisExist(_joyId, HID_USAGES.HID_USAGE_Y); Capabilities.ButtonsCount = _joystick.GetVJDButtonNumber(_joyId); long max = 0; _joystick.GetVJDAxisMax(_joyId, HID_USAGES.HID_USAGE_X, ref max); Capabilities.AxisXMax = max; _joystick.GetVJDAxisMax(_joyId, HID_USAGES.HID_USAGE_X, ref max); Capabilities.AxisYMax = max; return Capabilities; }