def device_available(vjoy_id): """Returns whether or not a device is available, i.e. can be acquired. :param vjoy_id id of the vjoy device to check :return True if the device is available, False otherwise """ dev_free = VJoyInterface.GetVJDStatus(vjoy_id) == VJoyState.Free.value dev_acquire = VJoyInterface.AcquireVJD(vjoy_id) VJoyInterface.RelinquishVJD(vjoy_id) return dev_free & dev_acquire
def __init__(self, vjoy_id): """Creates a new object. :param vjoy_id id of the vJoy device to initialize. """ self.vjoy_id = None if not VJoyInterface.vJoyEnabled(): logging.getLogger("system").error("vJoy is not currently running") raise VJoyError("vJoy is not currently running") if VJoyInterface.GetvJoyVersion() != 0x218: logging.getLogger("system").error( "Running incompatible vJoy version, 2.1.8 required" ) raise VJoyError("Running incompatible vJoy version, 2.1.8 required") elif VJoyInterface.GetVJDStatus(vjoy_id) != VJoyState.Free.value: logging.getLogger("system").error( "Requested vJoy device is not available - vid: {}".format(vjoy_id) ) raise VJoyError( "Requested vJoy device is not available - vid: {}".format(vjoy_id) ) elif not VJoyInterface.AcquireVJD(vjoy_id): logging.getLogger("system").error( "Failed to acquire the vJoy device - vid: {}".format(vjoy_id) ) raise VJoyError( "Failed to acquire the vJoy device - vid: {}".format(vjoy_id) ) self.vjoy_id = vjoy_id self.pid = os.getpid() # Initialize all controls self._axis_lookup = {} self._axis_names = {} self._axis = self._init_axes() self._button = self._init_buttons() self._hat = self._init_hats() # Timestamp of the last time the device was used self._last_active = time.time() self._keep_alive_timer = threading.Timer( VJoy.keep_alive_timeout, self._keep_alive ) self._keep_alive_timer.start() # Reset all controls self.reset()
def ensure_ownership(self): """Ensure this devices is still owned by the process. This object can only be constructed if it successfully acquires the vjoy device and destroys itself when relinquishing control. Therefore, it cannot ever not own the vJoy device. Under certain circumstances the vJoy devices are reset (issue #129). By checking for ownership and reacquiring if needed this can be solved. """ if self.pid != VJoyInterface.GetOwnerPid(self.vjoy_id): if not VJoyInterface.AcquireVJD(self.vjoy_id): logging.getLogger("system").error( "Failed to re-acquire the vJoy device - vid: {}".format( self.vjoy_id )) raise VJoyError( "Failed to re-acquire the vJoy device - vid: {}".format( self.vjoy_id ))