libusb 0.3.4-x86-mingw32 → 0.4.0-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/Gemfile +1 -0
- data/History.md +10 -0
- data/README.md +19 -6
- data/Rakefile +1 -1
- data/lib/libusb.rb +4 -0
- data/lib/libusb/call.rb +43 -1
- data/lib/libusb/constants.rb +5 -0
- data/lib/libusb/context.rb +100 -0
- data/lib/libusb/dev_handle.rb +27 -0
- data/lib/libusb/device.rb +10 -4
- data/lib/libusb/version_gem.rb +1 -1
- data/test/test_libusb_capability.rb +2 -2
- data/test/test_libusb_compat.rb +2 -2
- data/test/test_libusb_compat_mass_storage.rb +2 -2
- data/test/test_libusb_descriptors.rb +4 -2
- data/test/test_libusb_event_machine.rb +2 -2
- data/test/test_libusb_gc.rb +2 -2
- data/test/test_libusb_hotplug.rb +115 -0
- data/test/test_libusb_iso_transfer.rb +3 -3
- data/test/test_libusb_mass_storage.rb +6 -16
- data/test/test_libusb_mass_storage2.rb +26 -3
- data/test/test_libusb_structs.rb +2 -2
- data/test/test_libusb_threads.rb +2 -2
- data/test/test_libusb_version.rb +2 -2
- metadata +26 -4
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e6ff0b9c57f1c86dac3f6cd56e804112c96bf4b5
|
4
|
+
data.tar.gz: 27a4286d64b7a0be89793787e8e447b0a9fe96df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d2a8e51e6c846d4d9405687fc6fd8db2fe775517cdd71b4288345bdde938ab0ad3bbed1f3817aaa6156175de523b22f6cbbd1fa2e4b37c5ad5495d3e5e9b3e7
|
7
|
+
data.tar.gz: 05d689eca61ab92c98ea799a42146877573103e7811e1dae5832940726be47f783405fa44700a4724e6d2091bd6df46198248d3a9977b42fd885455527270785
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data.tar.gz.sig
ADDED
Binary file
|
data/Gemfile
CHANGED
data/History.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
0.4.0 / 2013-11-20
|
2
|
+
------------------
|
3
|
+
* Add support for device hotplug notifications.
|
4
|
+
* Update to libusbx-1.0.17.
|
5
|
+
* Add DevHandle#auto_detach_kernel_driver= of libusb-1.0.16.
|
6
|
+
* Add new capabilities introduced with libusb-1.0.16.
|
7
|
+
* Offer #has_capability? for libusb versions older than 1.0.9.
|
8
|
+
* Add new method port_numbers with alias to port_path.
|
9
|
+
* Use libusb_get_port_numbers preferred to now deprecated libusb_get_port_path.
|
10
|
+
|
1
11
|
0.3.4 / 2013-04-05
|
2
12
|
------------------
|
3
13
|
* Avoid closing of pollfds by the Ruby GC when used as IO object.
|
data/README.md
CHANGED
@@ -58,36 +58,49 @@ maximum packet size.
|
|
58
58
|
Prerequisites
|
59
59
|
-------------
|
60
60
|
|
61
|
-
* Linux, MacOSX or Windows system with Ruby MRI 1.8.7/1.9.
|
62
|
-
* [libusb](http://libusb.org) or [libusbx](http://libusbx.org) library version 1.0.8+ :
|
61
|
+
* Linux, MacOSX or Windows system with Ruby MRI 1.8.7/1.9/2.0, JRuby or recent version of Rubinius
|
62
|
+
* Optionally: [libusb](http://libusb.org) or [libusbx](http://libusbx.org) library version 1.0.8+ :
|
63
63
|
* Debian or Ubuntu:
|
64
64
|
|
65
65
|
```
|
66
66
|
$ sudo apt-get install libusb-1.0-0-dev
|
67
67
|
```
|
68
|
-
* OS-X: install with homebrew:
|
68
|
+
* OS-X: install with homebrew (note the `x`):
|
69
69
|
|
70
70
|
```
|
71
|
-
$ brew install
|
71
|
+
$ brew install libusbx
|
72
72
|
```
|
73
73
|
or macports:
|
74
74
|
|
75
75
|
```
|
76
76
|
$ port install libusb
|
77
77
|
```
|
78
|
-
* Windows: libusb.gem already comes with a precompiled `libusb.dll`, but you need to install a device driver (see below)
|
79
|
-
|
78
|
+
* Windows: libusb.gem already comes with a precompiled `libusb.dll`, but you need to install a device driver (see [below](#usage-on-windows))
|
80
79
|
|
81
80
|
Install
|
82
81
|
-------
|
83
82
|
|
84
83
|
$ gem install libusb
|
85
84
|
|
85
|
+
While ```gem install``` the system is checked for a usable libusb(x) library installation.
|
86
|
+
If none could be found, a bundled libusbx version is built and used, instead.
|
87
|
+
|
86
88
|
Latest code can be used in this way:
|
87
89
|
|
88
90
|
$ git clone git://github.com/larskanis/libusb.git
|
89
91
|
$ rake install_gem
|
90
92
|
|
93
|
+
Device hotplug support
|
94
|
+
----------------------
|
95
|
+
|
96
|
+
Support for device hotplugging can be used, if ```LIBUSB.has_capability?(:CAP_HAS_HOTPLUG)``` returns ```true```.
|
97
|
+
This requires libusb(x)-1.0.16 or newer on Linux or OS-X. Windows support is [still on the way](https://github.com/libusbx/libusbx/issues/9).
|
98
|
+
|
99
|
+
A hotplug event handler can be registered with {LIBUSB::Context#on_hotplug_event}.
|
100
|
+
You then need to call {LIBUSB::Context#handle_events} in order to receive any events.
|
101
|
+
This can be done as blocking calls (possibly in it's own thread) or by using {LIBUSB::Context#pollfds} to
|
102
|
+
detect any events to handle.
|
103
|
+
|
91
104
|
|
92
105
|
Usage on Windows
|
93
106
|
----------------
|
data/Rakefile
CHANGED
@@ -35,7 +35,7 @@ STATIC_SOURCESDIR = COMPILE_HOME + 'sources'
|
|
35
35
|
# LIBUSB_TARBALL = STATIC_SOURCESDIR + "libusb-#{LIBUSB_VERSION}.tar.bz2"
|
36
36
|
|
37
37
|
# Fetch tarball from libusbx
|
38
|
-
LIBUSB_VERSION = ENV['LIBUSB_VERSION'] || '1.0.
|
38
|
+
LIBUSB_VERSION = ENV['LIBUSB_VERSION'] || '1.0.17'
|
39
39
|
LIBUSB_SOURCE_URI = URI( "http://downloads.sourceforge.net/project/libusbx/releases/#{LIBUSB_VERSION[/^\d+\.\d+\.\d+/]}/source/libusbx-#{LIBUSB_VERSION}.tar.bz2" )
|
40
40
|
LIBUSB_TARBALL = STATIC_SOURCESDIR + File.basename( LIBUSB_SOURCE_URI.path )
|
41
41
|
|
data/lib/libusb.rb
CHANGED
data/lib/libusb/call.rb
CHANGED
@@ -149,11 +149,44 @@ module LIBUSB
|
|
149
149
|
]
|
150
150
|
|
151
151
|
Capabilities = enum :libusb_capability, [
|
152
|
-
:CAP_HAS_CAPABILITY,
|
152
|
+
:CAP_HAS_CAPABILITY, 0x0000,
|
153
|
+
# Hotplug support is available on this platform.
|
154
|
+
:CAP_HAS_HOTPLUG, 0x0001,
|
155
|
+
# The library can access HID devices without requiring user intervention.
|
156
|
+
# Note that before being able to actually access an HID device, you may
|
157
|
+
# still have to call additional libusb functions such as
|
158
|
+
# {DevHandle#detach_kernel_driver}.
|
159
|
+
:CAP_HAS_HID_ACCESS, 0x0100,
|
160
|
+
# The library supports detaching of the default USB driver, using
|
161
|
+
# {DevHandle#detach_kernel_driver}, if one is set by the OS kernel.
|
162
|
+
:CAP_SUPPORTS_DETACH_KERNEL_DRIVER, 0x0101,
|
163
|
+
]
|
164
|
+
|
165
|
+
# Since libusb version 1.0.16.
|
166
|
+
#
|
167
|
+
# Hotplug events
|
168
|
+
HotplugEvents = enum :libusb_hotplug_event, [
|
169
|
+
# A device has been plugged in and is ready to use.
|
170
|
+
:HOTPLUG_EVENT_DEVICE_ARRIVED, 0x01,
|
171
|
+
|
172
|
+
# A device has left and is no longer available.
|
173
|
+
# It is the user's responsibility to call libusb_close on any handle associated with a disconnected device.
|
174
|
+
# It is safe to call libusb_get_device_descriptor on a device that has left.
|
175
|
+
:HOTPLUG_EVENT_DEVICE_LEFT, 0x02,
|
176
|
+
]
|
177
|
+
|
178
|
+
# Since libusb version 1.0.16.
|
179
|
+
#
|
180
|
+
# Flags for hotplug events */
|
181
|
+
HotplugFlags = enum :libusb_hotplug_flag, [
|
182
|
+
# Arm the callback and fire it for all matching currently attached devices.
|
183
|
+
:HOTPLUG_ENUMERATE, 1,
|
153
184
|
]
|
154
185
|
|
155
186
|
typedef :pointer, :libusb_context
|
187
|
+
typedef :pointer, :libusb_device
|
156
188
|
typedef :pointer, :libusb_device_handle
|
189
|
+
typedef :int, :libusb_hotplug_callback_handle
|
157
190
|
|
158
191
|
def self.try_attach_function(method, *args)
|
159
192
|
if ffi_libraries.find{|lib| lib.find_function(method) }
|
@@ -182,6 +215,7 @@ module LIBUSB
|
|
182
215
|
try_attach_function 'libusb_get_port_number', [:pointer], :uint8
|
183
216
|
try_attach_function 'libusb_get_parent', [:pointer], :pointer
|
184
217
|
try_attach_function 'libusb_get_port_path', [:pointer, :pointer, :pointer, :uint8], :uint8
|
218
|
+
try_attach_function 'libusb_get_port_numbers', [:pointer, :pointer, :uint8], :uint8
|
185
219
|
attach_function 'libusb_get_device_address', [:pointer], :uint8
|
186
220
|
try_attach_function 'libusb_get_device_speed', [:pointer], :libusb_speed
|
187
221
|
attach_function 'libusb_get_max_packet_size', [:pointer, :uint8], :int
|
@@ -204,6 +238,7 @@ module LIBUSB
|
|
204
238
|
attach_function 'libusb_kernel_driver_active', [:libusb_device_handle, :int], :int
|
205
239
|
attach_function 'libusb_detach_kernel_driver', [:libusb_device_handle, :int], :int
|
206
240
|
attach_function 'libusb_attach_kernel_driver', [:libusb_device_handle, :int], :int
|
241
|
+
try_attach_function 'libusb_set_auto_detach_kernel_driver', [:libusb_device_handle, :int], :int
|
207
242
|
|
208
243
|
attach_function 'libusb_get_string_descriptor_ascii', [:pointer, :uint8, :pointer, :int], :int
|
209
244
|
|
@@ -226,6 +261,13 @@ module LIBUSB
|
|
226
261
|
|
227
262
|
callback :libusb_transfer_cb_fn, [:pointer], :void
|
228
263
|
|
264
|
+
callback :libusb_hotplug_callback_fn, [:libusb_context, :libusb_device, :libusb_hotplug_event, :pointer], :int
|
265
|
+
try_attach_function 'libusb_hotplug_register_callback', [
|
266
|
+
:libusb_context, :libusb_hotplug_event, :libusb_hotplug_flag,
|
267
|
+
:int, :int, :int, :libusb_hotplug_callback_fn,
|
268
|
+
:pointer, :pointer], :int
|
269
|
+
try_attach_function 'libusb_hotplug_deregister_callback', [:libusb_context, :libusb_hotplug_callback_handle], :void
|
270
|
+
|
229
271
|
class IsoPacketDescriptor < FFI::Struct
|
230
272
|
layout :length, :uint,
|
231
273
|
:actual_length, :uint,
|
data/lib/libusb/constants.rb
CHANGED
@@ -26,6 +26,8 @@ module LIBUSB
|
|
26
26
|
Call::IsoSyncTypes.to_h.each{|k,v| const_set(k,v) }
|
27
27
|
Call::Speeds.to_h.each{|k,v| const_set(k,v) }
|
28
28
|
Call::Capabilities.to_h.each{|k,v| const_set(k,v) }
|
29
|
+
Call::HotplugEvents.to_h.each{|k,v| const_set(k,v) }
|
30
|
+
Call::HotplugFlags.to_h.each{|k,v| const_set(k,v) }
|
29
31
|
|
30
32
|
# Base class of libusb errors
|
31
33
|
class Error < RuntimeError
|
@@ -73,6 +75,9 @@ module LIBUSB
|
|
73
75
|
POLLIN = 1
|
74
76
|
POLLOUT = 4
|
75
77
|
|
78
|
+
# Wildcard matching for hotplug events.
|
79
|
+
HOTPLUG_MATCH_ANY = -1
|
80
|
+
|
76
81
|
|
77
82
|
# http://www.usb.org/developers/defined_class
|
78
83
|
# @private
|
data/lib/libusb/context.rb
CHANGED
@@ -70,6 +70,31 @@ module LIBUSB
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
+
class HotplugCallback < FFI::Struct
|
74
|
+
layout :handle, :int
|
75
|
+
|
76
|
+
attr_reader :context
|
77
|
+
|
78
|
+
# @private
|
79
|
+
def initialize(context, ctx, callbacks)
|
80
|
+
super()
|
81
|
+
@context = context
|
82
|
+
@ctx = ctx
|
83
|
+
@callbacks = callbacks
|
84
|
+
end
|
85
|
+
|
86
|
+
# Deregisters the hotplug callback.
|
87
|
+
#
|
88
|
+
# Deregister a callback from a {Context}. This function is safe to call from within
|
89
|
+
# a hotplug callback.
|
90
|
+
#
|
91
|
+
# Since libusb version 1.0.16.
|
92
|
+
def deregister
|
93
|
+
Call.libusb_hotplug_deregister_callback(@ctx, self[:handle])
|
94
|
+
@callbacks.delete(self[:handle])
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
73
98
|
|
74
99
|
# Initialize libusb context.
|
75
100
|
def initialize
|
@@ -79,6 +104,7 @@ module LIBUSB
|
|
79
104
|
@ctx = m.read_pointer
|
80
105
|
@on_pollfd_added = nil
|
81
106
|
@on_pollfd_removed = nil
|
107
|
+
@hotplug_callbacks = {}
|
82
108
|
end
|
83
109
|
|
84
110
|
# Deinitialize libusb.
|
@@ -304,5 +330,79 @@ module LIBUSB
|
|
304
330
|
end
|
305
331
|
Call.libusb_set_pollfd_notifiers @ctx, @on_pollfd_added, @on_pollfd_removed, nil
|
306
332
|
end
|
333
|
+
|
334
|
+
# Register a hotplug event notification.
|
335
|
+
#
|
336
|
+
# Register a callback with the {LIBUSB::Context}. The callback will fire
|
337
|
+
# when a matching event occurs on a matching device. The callback is armed
|
338
|
+
# until either it is deregistered with {HotplugCallback#deregister} or the
|
339
|
+
# supplied block returns +:finish+ to indicate it is finished processing events.
|
340
|
+
#
|
341
|
+
# If the flag {Call::HotplugFlags HOTPLUG_ENUMERATE} is passed the callback will be
|
342
|
+
# called with a {Call::HotplugEvents :HOTPLUG_EVENT_DEVICE_ARRIVED} for all devices
|
343
|
+
# already plugged into the machine. Note that libusb modifies its internal
|
344
|
+
# device list from a separate thread, while calling hotplug callbacks from
|
345
|
+
# {#handle_events}, so it is possible for a device to already be present
|
346
|
+
# on, or removed from, its internal device list, while the hotplug callbacks
|
347
|
+
# still need to be dispatched. This means that when using
|
348
|
+
# {Call::HotplugFlags HOTPLUG_ENUMERATE}, your callback may be called twice for the arrival
|
349
|
+
# of the same device, once from {#on_hotplug_event} and once
|
350
|
+
# from {#handle_events}; and/or your callback may be called for the
|
351
|
+
# removal of a device for which an arrived call was never made.
|
352
|
+
#
|
353
|
+
# Since libusb version 1.0.16.
|
354
|
+
#
|
355
|
+
# @param [Hash] args
|
356
|
+
# @option args [Fixnum,Symbol] :events bitwise or of events that will trigger this callback.
|
357
|
+
# Default is +LIBUSB::HOTPLUG_EVENT_DEVICE_ARRIVED|LIBUSB::HOTPLUG_EVENT_DEVICE_LEFT+ .
|
358
|
+
# See {Call::HotplugEvents HotplugEvents}
|
359
|
+
# @option args [Fixnum,Symbol] :flags hotplug callback flags. Default is 0. See {Call::HotplugFlags HotplugFlags}
|
360
|
+
# @option args [Fixnum] :vendor_id the vendor id to match. Default is {HOTPLUG_MATCH_ANY}.
|
361
|
+
# @option args [Fixnum] :product_id the product id to match. Default is {HOTPLUG_MATCH_ANY}.
|
362
|
+
# @option args [Fixnum] :dev_class the device class to match. Default is {HOTPLUG_MATCH_ANY}.
|
363
|
+
# @return [HotplugCallback] The handle to the registered callback.
|
364
|
+
#
|
365
|
+
# @yieldparam [Device] device the attached or removed {Device} is yielded to the block
|
366
|
+
# @yieldparam [Symbol] event a {Call::HotplugEvents HotplugEvents} symbol
|
367
|
+
# @yieldreturn [Symbol] +:finish+ to deregister the callback, +:repeat+ to receive additional events
|
368
|
+
# @raise [ArgumentError, LIBUSB::Error] in case of failure
|
369
|
+
def on_hotplug_event(args={}, &block)
|
370
|
+
events = args.delete(:events) || (HOTPLUG_EVENT_DEVICE_ARRIVED | HOTPLUG_EVENT_DEVICE_LEFT)
|
371
|
+
flags = args.delete(:flags) || 0
|
372
|
+
vendor_id = args.delete(:vendor_id) || HOTPLUG_MATCH_ANY
|
373
|
+
product_id = args.delete(:product_id) || HOTPLUG_MATCH_ANY
|
374
|
+
dev_class = args.delete(:dev_class) || HOTPLUG_MATCH_ANY
|
375
|
+
raise ArgumentError, "invalid params #{args.inspect}" unless args.empty?
|
376
|
+
|
377
|
+
handle = HotplugCallback.new self, @ctx, @hotplug_callbacks
|
378
|
+
|
379
|
+
block2 = proc do |ctx, pDevice, event, _user_data|
|
380
|
+
raise "internal error: unexpected context" unless @ctx==ctx
|
381
|
+
dev = Device.new @ctx, pDevice
|
382
|
+
|
383
|
+
blres = block.call(dev, event)
|
384
|
+
|
385
|
+
case blres
|
386
|
+
when :finish
|
387
|
+
1
|
388
|
+
when :repeat
|
389
|
+
0
|
390
|
+
else
|
391
|
+
raise ArgumentError, "hotplug event handler must return :finish or :repeat"
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
res = Call.libusb_hotplug_register_callback(@ctx,
|
396
|
+
events, flags,
|
397
|
+
vendor_id, product_id, dev_class,
|
398
|
+
block2, nil, handle)
|
399
|
+
|
400
|
+
LIBUSB.raise_error res, "in libusb_hotplug_register_callback" if res<0
|
401
|
+
|
402
|
+
# Avoid GC'ing of the block:
|
403
|
+
@hotplug_callbacks[handle[:handle]] = block2
|
404
|
+
|
405
|
+
return handle
|
406
|
+
end
|
307
407
|
end
|
308
408
|
end
|
data/lib/libusb/dev_handle.rb
CHANGED
@@ -225,6 +225,33 @@ module LIBUSB
|
|
225
225
|
LIBUSB.raise_error res, "in libusb_attach_kernel_driver" if res!=0
|
226
226
|
end
|
227
227
|
|
228
|
+
# @private
|
229
|
+
if Call.respond_to?(:libusb_set_auto_detach_kernel_driver)
|
230
|
+
|
231
|
+
# @method auto_detach_kernel_driver=
|
232
|
+
# Enable/disable libusb's automatic kernel driver detachment.
|
233
|
+
#
|
234
|
+
# When this is enabled libusb will automatically detach the kernel driver on an
|
235
|
+
# interface when claiming the interface, and attach it when releasing the
|
236
|
+
# interface.
|
237
|
+
#
|
238
|
+
# Automatic kernel driver detachment is disabled on newly opened device handles by
|
239
|
+
# default.
|
240
|
+
#
|
241
|
+
# On platforms which do not have CAP_SUPPORTS_DETACH_KERNEL_DRIVER this
|
242
|
+
# function will return ERROR_NOT_SUPPORTED, and libusb will continue as if
|
243
|
+
# this function was never called.
|
244
|
+
#
|
245
|
+
# Available since libusb-1.0.16.
|
246
|
+
#
|
247
|
+
# @param [Boolean] enable whether to enable or disable auto kernel driver detachment
|
248
|
+
#
|
249
|
+
# @see LIBUSB.has_capability?
|
250
|
+
def auto_detach_kernel_driver=(enable)
|
251
|
+
res = Call.libusb_set_auto_detach_kernel_driver(@pHandle, enable ? 1 : 0)
|
252
|
+
LIBUSB.raise_error res, "in libusb_set_auto_detach_kernel_driver" if res!=0
|
253
|
+
end
|
254
|
+
end
|
228
255
|
|
229
256
|
# Perform a USB bulk transfer.
|
230
257
|
#
|
data/lib/libusb/device.rb
CHANGED
@@ -95,7 +95,7 @@ module LIBUSB
|
|
95
95
|
# Available since libusb-1.0.12.
|
96
96
|
#
|
97
97
|
# @return [Fixnum, nil] the port number (+nil+ if not available)
|
98
|
-
# @see #
|
98
|
+
# @see #port_numbers
|
99
99
|
def port_number
|
100
100
|
r = Call.libusb_get_port_number(@pDev)
|
101
101
|
r==0 ? nil : r
|
@@ -105,7 +105,7 @@ module LIBUSB
|
|
105
105
|
# Available since libusb-1.0.12.
|
106
106
|
#
|
107
107
|
# @return [Device, nil] the device parent or +nil+ if not available
|
108
|
-
# @see #
|
108
|
+
# @see #port_numbers
|
109
109
|
def parent
|
110
110
|
pppDevs = FFI::MemoryPointer.new :pointer
|
111
111
|
Call.libusb_get_device_list(@context.instance_variable_get(:@ctx), pppDevs)
|
@@ -122,13 +122,19 @@ module LIBUSB
|
|
122
122
|
# @return [Array<Fixnum>]
|
123
123
|
# @see #parent
|
124
124
|
# @see #port_number
|
125
|
-
def
|
125
|
+
def port_numbers
|
126
126
|
# As per the USB 3.0 specs, the current maximum limit for the depth is 7.
|
127
127
|
path_len = 7
|
128
128
|
pPath = FFI::MemoryPointer.new :pointer, path_len
|
129
|
-
|
129
|
+
|
130
|
+
l = if Call.respond_to?(:libusb_get_port_numbers)
|
131
|
+
Call.libusb_get_port_numbers(@pDev, pPath, path_len)
|
132
|
+
else
|
133
|
+
Call.libusb_get_port_path(@context.instance_variable_get(:@ctx), @pDev, pPath, path_len)
|
134
|
+
end
|
130
135
|
pPath.read_array_of_uint8(l)
|
131
136
|
end
|
137
|
+
alias port_path port_numbers
|
132
138
|
end
|
133
139
|
|
134
140
|
if Call.respond_to?(:libusb_get_device_speed)
|
data/lib/libusb/version_gem.rb
CHANGED
@@ -13,10 +13,10 @@
|
|
13
13
|
# You should have received a copy of the GNU Lesser General Public License
|
14
14
|
# along with Libusb for Ruby. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
|
16
|
-
require "
|
16
|
+
require "minitest/autorun"
|
17
17
|
require "libusb"
|
18
18
|
|
19
|
-
class TestLibusbCapability < Test
|
19
|
+
class TestLibusbCapability < Minitest::Test
|
20
20
|
def test_version_parts
|
21
21
|
assert LIBUSB.has_capability?(:CAP_HAS_CAPABILITY)
|
22
22
|
end
|
data/test/test_libusb_compat.rb
CHANGED
@@ -13,10 +13,10 @@
|
|
13
13
|
# You should have received a copy of the GNU Lesser General Public License
|
14
14
|
# along with Libusb for Ruby. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
|
16
|
-
require "
|
16
|
+
require "minitest/autorun"
|
17
17
|
require "libusb/compat"
|
18
18
|
|
19
|
-
class TestLibusbCompat < Test
|
19
|
+
class TestLibusbCompat < Minitest::Test
|
20
20
|
include USB
|
21
21
|
|
22
22
|
attr_accessor :usb
|
@@ -13,10 +13,10 @@
|
|
13
13
|
# You should have received a copy of the GNU Lesser General Public License
|
14
14
|
# along with Libusb for Ruby. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
|
16
|
-
require "
|
16
|
+
require "minitest/autorun"
|
17
17
|
require "libusb/compat"
|
18
18
|
|
19
|
-
class TestLibusbCompatMassStorage < Test
|
19
|
+
class TestLibusbCompatMassStorage < Minitest::Test
|
20
20
|
include USB
|
21
21
|
|
22
22
|
attr_accessor :devh
|
@@ -13,10 +13,10 @@
|
|
13
13
|
# You should have received a copy of the GNU Lesser General Public License
|
14
14
|
# along with Libusb for Ruby. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
|
16
|
-
require "
|
16
|
+
require "minitest/autorun"
|
17
17
|
require "libusb"
|
18
18
|
|
19
|
-
class TestLibusbDescriptors < Test
|
19
|
+
class TestLibusbDescriptors < Minitest::Test
|
20
20
|
include LIBUSB
|
21
21
|
|
22
22
|
attr_accessor :usb
|
@@ -165,6 +165,8 @@ class TestLibusbDescriptors < Test::Unit::TestCase
|
|
165
165
|
assert_operator dev.bus_number, :>=, 0, "#{dev.inspect} should have a bus_number"
|
166
166
|
assert_operator dev.device_address, :>=, 0, "#{dev.inspect} should have a device_address"
|
167
167
|
assert_operator([:SPEED_UNKNOWN, :SPEED_LOW, :SPEED_FULL, :SPEED_HIGH, :SPEED_SUPER], :include?, dev.device_speed, "#{dev.inspect} should have a device_speed")
|
168
|
+
path = dev.port_numbers
|
169
|
+
assert_kind_of Array, path, "#{dev.inspect} should have port_numbers"
|
168
170
|
path = dev.port_path
|
169
171
|
assert_kind_of Array, path, "#{dev.inspect} should have a port_path"
|
170
172
|
path.each do |port|
|
@@ -13,12 +13,12 @@
|
|
13
13
|
# You should have received a copy of the GNU Lesser General Public License
|
14
14
|
# along with Libusb for Ruby. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
|
16
|
-
require "
|
16
|
+
require "minitest/autorun"
|
17
17
|
require "libusb"
|
18
18
|
require "libusb/eventmachine"
|
19
19
|
require "eventmachine"
|
20
20
|
|
21
|
-
class TestLibusbEventMachine < Test
|
21
|
+
class TestLibusbEventMachine < Minitest::Test
|
22
22
|
include LIBUSB
|
23
23
|
BOMS_GET_MAX_LUN = 0xFE
|
24
24
|
|
data/test/test_libusb_gc.rb
CHANGED
@@ -16,10 +16,10 @@
|
|
16
16
|
# These tests should be started with valgrind to check for
|
17
17
|
# invalid memmory access.
|
18
18
|
|
19
|
-
require "
|
19
|
+
require "minitest/autorun"
|
20
20
|
require "libusb"
|
21
21
|
|
22
|
-
class TestLibusbGc < Test
|
22
|
+
class TestLibusbGc < Minitest::Test
|
23
23
|
include LIBUSB
|
24
24
|
|
25
25
|
def get_some_endpoint
|
@@ -0,0 +1,115 @@
|
|
1
|
+
# This file is part of Libusb for Ruby.
|
2
|
+
#
|
3
|
+
# Libusb for Ruby is free software: you can redistribute it and/or modify
|
4
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
5
|
+
# the Free Software Foundation, either version 3 of the License, or
|
6
|
+
# (at your option) any later version.
|
7
|
+
#
|
8
|
+
# Libusb for Ruby is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU Lesser General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU Lesser General Public License
|
14
|
+
# along with Libusb for Ruby. If not, see <http://www.gnu.org/licenses/>.
|
15
|
+
|
16
|
+
require "minitest/autorun"
|
17
|
+
require "libusb"
|
18
|
+
|
19
|
+
class TestLibusbHotplug < Minitest::Test
|
20
|
+
include LIBUSB
|
21
|
+
|
22
|
+
attr_reader :ctx
|
23
|
+
|
24
|
+
def setup
|
25
|
+
@ctx = Context.new
|
26
|
+
end
|
27
|
+
|
28
|
+
def teardown
|
29
|
+
@ctx.exit
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_enumerate
|
33
|
+
devs = []
|
34
|
+
ctx.on_hotplug_event :flags => HOTPLUG_ENUMERATE do |dev, event|
|
35
|
+
devs << dev
|
36
|
+
assert_equal :HOTPLUG_EVENT_DEVICE_ARRIVED, event
|
37
|
+
:repeat
|
38
|
+
end
|
39
|
+
# Not really necessary, but just to be sure that the callback was called:
|
40
|
+
ctx.handle_events 0
|
41
|
+
|
42
|
+
assert_equal ctx.devices.sort, devs.sort
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_enumerate_with_left
|
46
|
+
devs = []
|
47
|
+
ctx.on_hotplug_event :flags => HOTPLUG_ENUMERATE, :events => HOTPLUG_EVENT_DEVICE_LEFT do |dev, event|
|
48
|
+
devs << dev
|
49
|
+
assert_equal :HOTPLUG_EVENT_DEVICE_ARRIVED, event
|
50
|
+
:repeat
|
51
|
+
end
|
52
|
+
# Not really necessary, but just to be sure that the callback was called:
|
53
|
+
ctx.handle_events 0
|
54
|
+
|
55
|
+
assert_equal [], devs.sort, "Enumerate should not send any LEFT events"
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_deregister
|
59
|
+
handle1 = ctx.on_hotplug_event{ assert false, "Callback should not be called" }
|
60
|
+
handle2 = ctx.on_hotplug_event{ assert false, "Callback should not be called" }
|
61
|
+
handle1.deregister
|
62
|
+
handle2.deregister
|
63
|
+
ctx.handle_events 0
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_wrong_yieldreturn
|
67
|
+
ex = assert_raises(ArgumentError) do
|
68
|
+
ctx.on_hotplug_event :flags => :HOTPLUG_ENUMERATE do |dev, event|
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
assert_match(/:finish.*:repeat/, ex.to_s, "Should give a useful hint")
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_context
|
76
|
+
handle = ctx.on_hotplug_event do |dev, event|
|
77
|
+
end
|
78
|
+
assert_equal ctx, handle.context, "The callback handle should have it's context"
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_real_device_plugging_and_yieldreturn_and_gc_and_deregister
|
82
|
+
# This callback should be triggered once
|
83
|
+
devs = []
|
84
|
+
ctx.on_hotplug_event do |dev, event|
|
85
|
+
devs << [dev, event]
|
86
|
+
:finish
|
87
|
+
end
|
88
|
+
|
89
|
+
# This callback should be triggered twice
|
90
|
+
devs2 = []
|
91
|
+
ctx.on_hotplug_event do |dev, event|
|
92
|
+
devs2 << [dev, event]
|
93
|
+
puts format(" %p: %p", event, dev)
|
94
|
+
:repeat
|
95
|
+
end
|
96
|
+
|
97
|
+
# This callback should never be triggered
|
98
|
+
handle = ctx.on_hotplug_event{ assert false, "Deregistered callback should never be called" }
|
99
|
+
|
100
|
+
# GC shouldn't free any relevant callbacks or blocks
|
101
|
+
GC.start
|
102
|
+
|
103
|
+
print "\nPlease add and remove an USB device (2*5 sec): "
|
104
|
+
handle.deregister
|
105
|
+
ctx.handle_events 0
|
106
|
+
ctx.handle_events 5000
|
107
|
+
ctx.handle_events 5000
|
108
|
+
|
109
|
+
skip if devs.empty? && devs2.empty?
|
110
|
+
assert_equal 1, devs.length, "Should be deregistered after the first event"
|
111
|
+
assert_equal 2, devs2.length, "Should have received two events"
|
112
|
+
assert_operator devs2.map(&:last), :include?, :HOTPLUG_EVENT_DEVICE_ARRIVED, "Should have received ARRIVED"
|
113
|
+
assert_operator devs2.map(&:last), :include?, :HOTPLUG_EVENT_DEVICE_LEFT, "Should have received LEFT"
|
114
|
+
end
|
115
|
+
end
|
@@ -13,10 +13,10 @@
|
|
13
13
|
# You should have received a copy of the GNU Lesser General Public License
|
14
14
|
# along with Libusb for Ruby. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
|
16
|
-
require "
|
16
|
+
require "minitest/autorun"
|
17
17
|
require "libusb"
|
18
18
|
|
19
|
-
class TestLibusbIsoTransfer < Test
|
19
|
+
class TestLibusbIsoTransfer < Minitest::Test
|
20
20
|
include LIBUSB
|
21
21
|
|
22
22
|
def setup
|
@@ -43,7 +43,7 @@ class TestLibusbIsoTransfer < Test::Unit::TestCase
|
|
43
43
|
assert_equal 12, tr[7].length, "packet length should be set"
|
44
44
|
assert_equal 13, tr[8].length, "packet length should be set"
|
45
45
|
|
46
|
-
|
46
|
+
assert_raises(LIBUSB::ERROR_IO, "the randomly choosen device will probably not handle iso transfer") do
|
47
47
|
tr.submit!
|
48
48
|
end
|
49
49
|
end
|
@@ -19,10 +19,10 @@
|
|
19
19
|
# http://en.wikipedia.org/wiki/SCSI_command
|
20
20
|
#
|
21
21
|
|
22
|
-
require "
|
22
|
+
require "minitest/autorun"
|
23
23
|
require "libusb"
|
24
24
|
|
25
|
-
class TestLibusbMassStorage < Test
|
25
|
+
class TestLibusbMassStorage < Minitest::Test
|
26
26
|
include LIBUSB
|
27
27
|
|
28
28
|
class CSWError < RuntimeError; end
|
@@ -215,7 +215,7 @@ class TestLibusbMassStorage < Test::Unit::TestCase
|
|
215
215
|
sleep 0.01
|
216
216
|
end
|
217
217
|
end
|
218
|
-
|
218
|
+
assert_raises(LIBUSB::ERROR_TIMEOUT) do
|
219
219
|
begin
|
220
220
|
bulk_transfer(:endpoint=>endpoint_in, :dataIn=>123)
|
221
221
|
rescue LIBUSB::ERROR_TIMEOUT => err
|
@@ -257,20 +257,10 @@ class TestLibusbMassStorage < Test::Unit::TestCase
|
|
257
257
|
end
|
258
258
|
end
|
259
259
|
|
260
|
-
def test_attach_kernel_driver
|
261
|
-
dev.release_interface(0)
|
262
|
-
if RUBY_PLATFORM=~/linux/i
|
263
|
-
dev.attach_kernel_driver(0)
|
264
|
-
assert dev.kernel_driver_active?(0), "kernel driver should be active again"
|
265
|
-
end
|
266
|
-
dev.close
|
267
|
-
@dev = nil
|
268
|
-
end
|
269
|
-
|
270
260
|
def test_wrong_argument
|
271
|
-
|
272
|
-
|
273
|
-
|
261
|
+
assert_raises(ArgumentError){ dev.bulk_transfer(:endpoint=>endpoint_in, :dataOut=>"data") }
|
262
|
+
assert_raises(ArgumentError){ dev.interrupt_transfer(:endpoint=>endpoint_in, :dataOut=>"data") }
|
263
|
+
assert_raises(ArgumentError){ dev.control_transfer(
|
274
264
|
:bmRequestType=>ENDPOINT_OUT|REQUEST_TYPE_CLASS|RECIPIENT_INTERFACE,
|
275
265
|
:bRequest=>BOMS_RESET,
|
276
266
|
:wValue=>0, :wIndex=>0, :dataIn=>123) }
|
@@ -14,10 +14,10 @@
|
|
14
14
|
# along with Libusb for Ruby. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
#
|
16
16
|
|
17
|
-
require "
|
17
|
+
require "minitest/autorun"
|
18
18
|
require "libusb"
|
19
19
|
|
20
|
-
class TestLibusbMassStorage2 < Test
|
20
|
+
class TestLibusbMassStorage2 < Minitest::Test
|
21
21
|
include LIBUSB
|
22
22
|
|
23
23
|
attr_accessor :usb
|
@@ -35,7 +35,6 @@ class TestLibusbMassStorage2 < Test::Unit::TestCase
|
|
35
35
|
# Ensure kernel driver is detached
|
36
36
|
device.open do |dev|
|
37
37
|
if RUBY_PLATFORM=~/linux/i && dev.kernel_driver_active?(interface)
|
38
|
-
assert dev.kernel_driver_active?(0), "DevHandle#kernel_driver_active? may be called with an Interface instance or a Fixnum"
|
39
38
|
dev.detach_kernel_driver(interface)
|
40
39
|
end
|
41
40
|
end
|
@@ -70,4 +69,28 @@ class TestLibusbMassStorage2 < Test::Unit::TestCase
|
|
70
69
|
end
|
71
70
|
assert_equal 12345, res, "Block versions should pass through the result"
|
72
71
|
end
|
72
|
+
|
73
|
+
def test_attach_kernel_driver
|
74
|
+
# Should work with both Fixnum and Interface parameter
|
75
|
+
[0, interface].each do |i|
|
76
|
+
device.open do |dev|
|
77
|
+
dev.attach_kernel_driver(i)
|
78
|
+
assert dev.kernel_driver_active?(i), "kernel driver should be active again"
|
79
|
+
dev.detach_kernel_driver(i)
|
80
|
+
refute dev.kernel_driver_active?(i), "kernel driver should be detached"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_auto_detach_kernel_driver
|
86
|
+
assert LIBUSB.has_capability?(:CAP_SUPPORTS_DETACH_KERNEL_DRIVER), "libusb should have CAP_SUPPORTS_DETACH_KERNEL_DRIVER"
|
87
|
+
|
88
|
+
device.open do |dev|
|
89
|
+
dev.attach_kernel_driver 0
|
90
|
+
assert dev.kernel_driver_active?(0), "kernel driver should attached, now"
|
91
|
+
dev.auto_detach_kernel_driver = true
|
92
|
+
dev.claim_interface(0)
|
93
|
+
refute dev.kernel_driver_active?(0), "kernel driver should get detached automatically"
|
94
|
+
end
|
95
|
+
end
|
73
96
|
end
|
data/test/test_libusb_structs.rb
CHANGED
@@ -13,10 +13,10 @@
|
|
13
13
|
# You should have received a copy of the GNU Lesser General Public License
|
14
14
|
# along with Libusb for Ruby. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
|
16
|
-
require "
|
16
|
+
require "minitest/autorun"
|
17
17
|
require "libusb"
|
18
18
|
|
19
|
-
class TestLibusbStructs < Test
|
19
|
+
class TestLibusbStructs < Minitest::Test
|
20
20
|
def test_struct_Timeval
|
21
21
|
s = LIBUSB::Call::Timeval.new
|
22
22
|
assert_equal 0, s.in_ms
|
data/test/test_libusb_threads.rb
CHANGED
@@ -16,10 +16,10 @@
|
|
16
16
|
# This test requires two connected, but not mounted mass storage device with
|
17
17
|
# read/write access allowed.
|
18
18
|
|
19
|
-
require "
|
19
|
+
require "minitest/autorun"
|
20
20
|
require "libusb"
|
21
21
|
|
22
|
-
class TestLibusbThreads < Test
|
22
|
+
class TestLibusbThreads < Minitest::Test
|
23
23
|
include LIBUSB
|
24
24
|
|
25
25
|
BOMS_GET_MAX_LUN = 0xFE
|
data/test/test_libusb_version.rb
CHANGED
@@ -13,10 +13,10 @@
|
|
13
13
|
# You should have received a copy of the GNU Lesser General Public License
|
14
14
|
# along with Libusb for Ruby. If not, see <http://www.gnu.org/licenses/>.
|
15
15
|
|
16
|
-
require "
|
16
|
+
require "minitest/autorun"
|
17
17
|
require "libusb"
|
18
18
|
|
19
|
-
class TestLibusbVersion < Test
|
19
|
+
class TestLibusbVersion < Minitest::Test
|
20
20
|
def setup
|
21
21
|
@v = LIBUSB.version
|
22
22
|
end
|
metadata
CHANGED
@@ -1,14 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libusb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: x86-mingw32
|
6
6
|
authors:
|
7
7
|
- Lars Kanis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
|
-
cert_chain:
|
11
|
-
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIDPDCCAiSgAwIBAgIBADANBgkqhkiG9w0BAQUFADBEMQ0wCwYDVQQDDARsYXJz
|
14
|
+
MR8wHQYKCZImiZPyLGQBGRYPZ3JlaXotcmVpbnNkb3JmMRIwEAYKCZImiZPyLGQB
|
15
|
+
GRYCZGUwHhcNMTMwMzExMjAyMjIyWhcNMTQwMzExMjAyMjIyWjBEMQ0wCwYDVQQD
|
16
|
+
DARsYXJzMR8wHQYKCZImiZPyLGQBGRYPZ3JlaXotcmVpbnNkb3JmMRIwEAYKCZIm
|
17
|
+
iZPyLGQBGRYCZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZb4Uv
|
18
|
+
RFJfRu/VEWiy3psh2jinETjiuBrL0NeRFGf8H7iU9+gx/DI/FFhfHGLrDeIskrJx
|
19
|
+
YIWDMmEjVO10UUdj7wu4ZhmU++0Cd7Kq9/TyP/shIP3IjqHjVLCnJ3P6f1cl5rxZ
|
20
|
+
gqo+d3BAoDrmPk0rtaf6QopwUw9RBiF8V4HqvpiY+ruJotP5UQDP4/lVOKvA8PI9
|
21
|
+
P0GmVbFBrbc7Zt5h78N3UyOK0u+nvOC23BvyHXzCtcFsXCoEkt+Wwh0RFqVZdnjM
|
22
|
+
LMO2vULHKKHDdX54K/sbVCj9pN9h1aotNzrEyo55zxn0G9PHg/G3P8nMvAXPkUTe
|
23
|
+
brhXrfCwWRvOXA4TAgMBAAGjOTA3MAsGA1UdDwQEAwIEsDAJBgNVHRMEAjAAMB0G
|
24
|
+
A1UdDgQWBBRAHK81igrXodaDj8a8/BIKsaZrETANBgkqhkiG9w0BAQUFAAOCAQEA
|
25
|
+
Iswhcol3ytXthaUH3k5LopZ09viZrZHzAw0QleI3Opl/9QEGJ2BPV9+93iC0OrNL
|
26
|
+
hmnxig6vKK1EeJ5PHXJ8hOI3nTZBrOmQcEXNBqyToP1FHMWZqwZ8wiBPXtiCqDBR
|
27
|
+
ePQ25J9xFNzQ1ItgzNSpx5cs67QNKrx5woocoBHD6kStFbshZPJx4axl3GbUFQd5
|
28
|
+
H//3YdPQOH3jaVeUXhS+pz/gfbx8fhFAtsQ+855A3HO7g2ZRIg/atAp/0MFyn5s5
|
29
|
+
0rq+VHOIPyvxF5khT0mYAcNmZTC8z1yPsqdgwfYNDjsSWwiIRSPUSmJRvfjM8hsW
|
30
|
+
mMFp4kPUHbWOqCp2mz9gCA==
|
31
|
+
-----END CERTIFICATE-----
|
32
|
+
date: 2013-11-20 00:00:00.000000000 Z
|
12
33
|
dependencies:
|
13
34
|
- !ruby/object:Gem::Dependency
|
14
35
|
name: ffi
|
@@ -90,6 +111,7 @@ files:
|
|
90
111
|
- test/test_libusb_descriptors.rb
|
91
112
|
- test/test_libusb_event_machine.rb
|
92
113
|
- test/test_libusb_gc.rb
|
114
|
+
- test/test_libusb_hotplug.rb
|
93
115
|
- test/test_libusb_iso_transfer.rb
|
94
116
|
- test/test_libusb_mass_storage.rb
|
95
117
|
- test/test_libusb_mass_storage2.rb
|
@@ -119,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
141
|
version: '0'
|
120
142
|
requirements: []
|
121
143
|
rubyforge_project: libusb
|
122
|
-
rubygems_version: 2.0.
|
144
|
+
rubygems_version: 2.0.3
|
123
145
|
signing_key:
|
124
146
|
specification_version: 4
|
125
147
|
summary: Access USB devices from Ruby via libusb-1.0
|
metadata.gz.sig
ADDED
Binary file
|