libusb 0.2.2-x86-mingw32 → 0.3.0-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,8 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ lib/libusb-1.0*
6
+ lib/pkgconfig
7
+ include
8
+ tmp
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ rvm:
3
+ - "1.8.7"
4
+ - "1.9.2"
5
+ - "1.9.3"
6
+ - jruby-18mode # JRuby in 1.8 mode
7
+ - jruby-19mode # JRuby in 1.9 mode
8
+ - rbx-18mode
9
+ - rbx-19mode
10
+ script: bundle exec rake travis
data/.yardopts CHANGED
@@ -1 +1,6 @@
1
- --title "libusb-1.0 Ruby Interface" --no-private lib/**/*.rb
1
+ --title "libusb-1.0 Ruby Interface"
2
+ --no-private
3
+ lib/**/*.rb
4
+ -
5
+ README.md
6
+ History.md
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in libusb.gemspec
4
+ gemspec
5
+
6
+ group :test do
7
+ gem 'eventmachine'
8
+ end
9
+
10
+ platforms :rbx do
11
+ # travis currently runs a slightly older version of rbx,
12
+ # that needs this special ffi version.
13
+ if ENV['TRAVIS']
14
+ gem 'ffi', :git => "git://github.com/ffi/ffi.git", :ref => '5f31908'
15
+ end
16
+ end
@@ -1,40 +1,52 @@
1
- === 0.2.2 / 2012-10-19
2
-
1
+ 0.3.0 / 2013-01-21
2
+ ------------------
3
+ * Build bundled libusbx sources in case libusb-1.0.so can not be loaded from the system
4
+ * Replace Hoe with Bundler
5
+ * Add timeout and completion_flag to Context#handle_events
6
+ * Add asynchronous DevHandle#{control|interrupt|bulk}_transfer method variants
7
+ * Add the ability to retrieve the data already transfered when it comes to an exception
8
+ * Add notification API for libusb's file describtors for event driven USB transfers
9
+ * Add experimental integration to EventMachine
10
+ * Add several convenience methods to descriptors
11
+ * Add missing return code checks to libusb_init() and libusb_get_device_list()
12
+
13
+ 0.2.2 / 2012-10-19
14
+ ------------------
3
15
  * Add method Interface#bInterfaceNumber
4
16
  * Fix methods (#claim_interface, #detach_kernel_driver) with Interface-type parameter
5
17
  * update to libusbx-1.0.14 for windows build
6
18
 
7
- === 0.2.1 / 2012-09-25
8
-
19
+ 0.2.1 / 2012-09-25
20
+ ------------------
9
21
  * Rename Configuration#maxPower to #bMaxPower as done in libusbx-1.0.13 and in ruby-usb.gem
10
22
  * update to libusbx-1.0.13 for windows build (with support for libusbK and libusb0)
11
23
 
12
- === 0.2.0 / 2012-06-15
13
-
24
+ 0.2.0 / 2012-06-15
25
+ ------------------
14
26
  * Divide up the libusb library across multiple files, required with autoload
15
27
  * add methods: LIBUSB.has_capability?, Device#device_speed (libusb-1.0.9+)
16
28
  * add possibility to read out libusb version: LIBUSB.version (libusbx-1.0.10+)
17
29
  * add methods: Device#parent, Device#port_number, Device#port_path (libusbx-1.0.12+)
18
30
  * switch to libusbx-1.0.12 for windows build
19
31
 
20
- === 0.1.3 / 2012-03-15
21
-
32
+ 0.1.3 / 2012-03-15
33
+ -------------------
22
34
  * Add documentation of descriptor accessors
23
35
  * Fix #extra accessor of Configuration, Setting and Endpoint
24
36
 
25
- === 0.1.2 / 2012-03-14
26
-
37
+ 0.1.2 / 2012-03-14
38
+ ------------------
27
39
  * Mark all blocking functions as blocking in FFI, so that parallel threads are not blocked
28
40
  * Add method Device#open_interface
29
41
  * Add block variant to #claim_interface
30
42
  * update API documentation
31
43
 
32
- === 0.1.1 / 2011-12-09
33
-
44
+ 0.1.1 / 2011-12-09
45
+ ------------------
34
46
  * avoid ffi calls with :blocking=>true, als long as it isn't stable on win32
35
47
 
36
- === 0.1.0 / 2011-10-01
37
-
48
+ 0.1.0 / 2011-10-01
49
+ ------------------
38
50
  * add test suite based on mass storage devices
39
51
  * usable async transfers
40
52
  * migration to rake-compiler and hoe
@@ -45,6 +57,6 @@
45
57
  * add LIBUSB constants
46
58
  * downcase methods names
47
59
 
48
- === 0.0.1 / 2009-06-23
49
-
60
+ 0.0.1 / 2009-06-23
61
+ ------------------
50
62
  * first public release
@@ -0,0 +1,144 @@
1
+ <!-- -*- coding: utf-8 -*- -->
2
+
3
+ [![Build Status](https://travis-ci.org/larskanis/libusb.png?branch=debug_travis)](https://travis-ci.org/larskanis/libusb)
4
+
5
+ Access USB devices from Ruby
6
+ ============================
7
+
8
+ LIBUSB is a Ruby binding that gives Ruby programmers access to arbitrary USB devices.
9
+
10
+ * [libusb](http://libusbx.org) is a library that gives full access to devices connected via the USB bus. No special kernel driver is thus necessary for accessing USB devices.
11
+ * This Ruby binding supports the API version 1.0 of [libusb](http://libusbx.org). Note that the old "legacy" version 0.1.x of libusb uses a completely different API that is covered by the ruby extension [ruby-usb](http://www.a-k-r.org/ruby-usb/) .
12
+
13
+
14
+ LIBUSB for Ruby is covered by the GNU Lesser General Public License version 3.
15
+
16
+ Features
17
+ --------
18
+
19
+ * Access to descriptors of devices, configurations, interfaces, settings and endpoints
20
+ * Synchronous and asynchronous communication for bulk, control, interrupt and isochronous transfers
21
+ * Compatibility layer for [ruby-usb](http://www.a-k-r.org/ruby-usb/) (API based on libusb-0.1). See {::USB} for description.
22
+
23
+ Synopsis
24
+ --------
25
+ See [the documentation](http://rubydoc.info/gems/libusb/frames) for a full API description.
26
+
27
+ ```ruby
28
+ require "libusb"
29
+
30
+ usb = LIBUSB::Context.new
31
+ device = usb.devices(:idVendor => 0x04b4, :idProduct => 0x8613).first
32
+ device.open_interface(0) do |handle|
33
+ handle.control_transfer(:bmRequestType => 0x40, :bRequest => 0xa0, :wValue => 0xe600, :wIndex => 0x0000, :dataOut => 1.chr)
34
+ end
35
+ ```
36
+ {LIBUSB::Context#devices} is used to get all or only particular devices.
37
+ After {LIBUSB::Device#open_interface opening and claiming} the {LIBUSB::Device} the resulting {LIBUSB::DevHandle} can be
38
+ used to communicate with the connected USB device
39
+ by {LIBUSB::DevHandle#control_transfer}, {LIBUSB::DevHandle#bulk_transfer},
40
+ {LIBUSB::DevHandle#interrupt_transfer} or by using the {LIBUSB::Transfer} classes.
41
+
42
+ A {LIBUSB::Device} can also be used to retrieve information about it,
43
+ by using the device descriptor attributes.
44
+ A {LIBUSB::Device} could have several configurations. You can then decide of which
45
+ configuration to enable. You can only enable one configuration at a time.
46
+
47
+ Each {LIBUSB::Configuration} has one or more interfaces. These can be seen as functional group
48
+ performing a single feature of the device.
49
+
50
+ Each {LIBUSB::Interface} has at least one {LIBUSB::Setting}. The first setting is always default.
51
+ An alternate setting can be used independent on each interface.
52
+
53
+ Each {LIBUSB::Setting} specifies it's own set of communication endpoints.
54
+ Each {LIBUSB::Endpoint} specifies the type of transfer, direction, polling interval and
55
+ maximum packet size.
56
+
57
+
58
+ Prerequisites
59
+ -------------
60
+
61
+ * Linux, MacOSX or Windows system with Ruby MRI 1.8.7/1.9.x, JRuby or recent version of Rubinius
62
+ * [libusb](http://libusb.org) or [libusbx](http://libusbx.org) library version 1.0.8+ :
63
+ * Debian or Ubuntu:
64
+
65
+ ```
66
+ $ sudo apt-get install libusb-1.0-0-dev
67
+ ```
68
+ * OS-X: install with homebrew:
69
+
70
+ ```
71
+ $ brew install libusb
72
+ ```
73
+ or macports:
74
+
75
+ ```
76
+ $ port install libusb
77
+ ```
78
+ * Windows: libusb.gem already comes with a precompiled `libusb.dll`, but you need to install a device driver (see below)
79
+
80
+
81
+ Install
82
+ -------
83
+
84
+ $ gem install libusb
85
+
86
+ Latest code can be used in this way:
87
+
88
+ $ git clone git://github.com/larskanis/libusb.git
89
+ $ rake install_gem
90
+
91
+
92
+ Usage on Windows
93
+ ----------------
94
+
95
+ In contrast to Linux, any access to an USB device by LIBUSB on Windows requires a proper driver
96
+ installed in the system. Fortunately creating such a driver is quite easy with
97
+ [Zadig](http://sourceforge.net/projects/libwdi/files/zadig/). Select the interesting USB device,
98
+ choose WinUSB driver and press "Install Driver". That's it. You may take the generated output directory
99
+ with it's INI-file and use it for driver installation on other 32 or 64 bit Windows
100
+ systems.
101
+
102
+
103
+ Cross compiling for Windows
104
+ ---------------------------
105
+
106
+ Libusb-gem can be build on a linux or darwin host for the win32 platform,
107
+ using the mingw cross compiler collection. Libusb is downloaded from source
108
+ git repo, cross compiled and included in the generated libusb.gem.
109
+
110
+ Install mingw32. On a debian based system this should work:
111
+
112
+ $ apt-get install mingw32
113
+
114
+ On MacOS X, if you have MacPorts installed:
115
+
116
+ $ port install i386-mingw32-gcc
117
+
118
+ Download and cross compile libusb for win32:
119
+
120
+ $ rake cross gem
121
+
122
+ If everything works, there should be `libusb-VERSION-x86-mingw32.gem` in the pkg
123
+ directory.
124
+
125
+ EventMachine integration
126
+ ------------------------
127
+
128
+ Libusb for Ruby comes with an experimental integration to [EventMachine](http://rubyeventmachine.com/).
129
+ That API is currently proof of concept - see {LIBUSB::Context#eventmachine_register}.
130
+ If you're experienced with EventMachine, please leave a comment.
131
+
132
+
133
+ Resources
134
+ ---------
135
+
136
+ * Project's home page: http://github.com/larskanis/libusb
137
+ * API documentation: http://rubydoc.info/gems/libusb/frames
138
+ * Mailinglist: http://rubyforge.org/mailman/listinfo/libusb-hackers
139
+ * Overall introduction to USB: http://www.usbmadesimple.co.uk
140
+
141
+ Todo
142
+ ----
143
+
144
+ * stabilize EventMachine interface
data/Rakefile CHANGED
@@ -1,13 +1,24 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # -*- ruby -*-
3
3
 
4
- require 'rubygems'
5
- require 'hoe'
4
+ require 'bundler/gem_tasks'
6
5
  require 'pathname'
7
6
  require 'uri'
8
7
  require 'rake/extensiontask'
9
8
  require 'rake/extensioncompiler'
10
9
 
10
+ task :gem => :build
11
+ task :compile do
12
+ sh "ruby ext/extconf.rb"
13
+ end
14
+ task :test=>:compile do
15
+ sh "ruby -w -W2 -I. -Ilib -e \"#{Dir["test/test_*.rb"].map{|f| "require '#{f}';"}.join}\" -- -v"
16
+ end
17
+ travis_tests = %w[test_libusb_capability.rb test_libusb_structs.rb test_libusb_version.rb]
18
+ task :travis=>:compile do
19
+ sh "ruby -w -W2 -I. -Ilib -e \"#{travis_tests.map{|f| "require 'test/#{f}';"}.join}\" -- -v"
20
+ end
21
+ task :default => :test
11
22
 
12
23
  # Cross-compilation constants
13
24
  COMPILE_HOME = Pathname( "./tmp" ).expand_path
@@ -45,28 +56,10 @@ LIBUSB_TARBALL = STATIC_SOURCESDIR + File.basename( LIBUSB_SOURCE_URI
45
56
  STATIC_LIBUSB_BUILDDIR = STATIC_BUILDDIR + LIBUSB_TARBALL.basename(".tar.bz2")
46
57
  LIBUSB_CONFIGURE = STATIC_LIBUSB_BUILDDIR + 'configure'
47
58
  LIBUSB_MAKEFILE = STATIC_LIBUSB_BUILDDIR + 'Makefile'
48
- LIBUSB_DLL = STATIC_LIBUSB_BUILDDIR + 'libusb/.libs/libusb-1.0.dll'
49
-
50
-
51
- hoe = Hoe.spec 'libusb' do
52
- developer('Lars Kanis', 'kanis@comcard.de')
53
-
54
- extra_deps << ['ffi', '>= 1.0']
55
- extra_dev_deps << ['rake-compiler', '>= 0.6']
56
-
57
- self.url = 'http://github.com/larskanis/libusb'
58
- self.summary = 'Access USB devices from Ruby via libusb-1.0'
59
- self.description = 'LIBUSB is a Ruby binding that gives Ruby programmers access to arbitrary USB devices'
60
-
61
- self.readme_file = 'README.rdoc'
62
- spec_extras[:rdoc_options] = ['--main', readme_file, "--charset=UTF-8"]
63
- spec_extras[:files] = `git ls-files`.split
64
- self.extra_rdoc_files << self.readme_file
65
-
66
- # clean intermediate files and folders
67
- self.clean_globs << STATIC_BUILDDIR.to_s
68
- end
59
+ LIBUSB_DLL = STATIC_LIBUSB_BUILDDIR + 'libusb/.libs/libusb-1.0.dll'
69
60
 
61
+ EXT_BUILDDIR = Pathname( "./ext" ).expand_path
62
+ EXT_LIBUSB_BUILDDIR = EXT_BUILDDIR + LIBUSB_TARBALL.basename(".tar.bz2")
70
63
 
71
64
  #####################################################################
72
65
  ### C R O S S - C O M P I L A T I O N - T A S K S
@@ -135,10 +128,11 @@ task :libusb_dll => [ "copy:libusb_dll" ]
135
128
 
136
129
  desc 'Cross compile libusb for win32'
137
130
  task :cross => [ :mingw32, :libusb_dll ] do |t|
138
- spec = hoe.spec.dup
131
+ spec = Gem::Specification::load("libusb.gemspec")
139
132
  spec.instance_variable_set(:"@cache_file", nil) if spec.respond_to?(:cache_file)
140
133
  spec.platform = Gem::Platform.new('i386-mingw32')
141
134
  spec.files << "lib/#{File.basename(LIBUSB_DLL)}"
135
+ spec.files -= `git ls-files ext/libusbx-*`.split("\n")
142
136
 
143
137
  # Generate a package for this gem
144
138
  Gem::PackageTask.new(spec) do |pkg|
@@ -156,4 +150,14 @@ task :mingw32 do
156
150
  end
157
151
  end
158
152
 
153
+ desc "Download and update bundled libusb(x)"
154
+ task :update_libusb => LIBUSB_TARBALL do
155
+ sh 'rm', '-r', (EXT_BUILDDIR + "libusbx-*").to_s do end
156
+ sh 'git', 'rm', '-rfq', (EXT_BUILDDIR + "libusbx-*").to_s do end
157
+ sh 'tar', '-xjf', LIBUSB_TARBALL.to_s, '-C', EXT_LIBUSB_BUILDDIR.parent.to_s
158
+ drops = %w[msvc].map{|f| (EXT_LIBUSB_BUILDDIR+f).to_s }
159
+ sh 'rm', '-r', '-f', *drops
160
+ sh 'git', 'add', EXT_LIBUSB_BUILDDIR.to_s
161
+ end
162
+
159
163
  # vim: syntax=ruby
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'ffi'
5
+
6
+ begin
7
+ module LibTest
8
+ extend FFI::Library
9
+ ext = FFI::Platform.windows? ? 'dll' : 'so'
10
+ bundled_dll = File.expand_path("../../lib/libusb-1.0.#{ext}", __FILE__)
11
+ ffi_lib(['libusb-1.0', bundled_dll])
12
+ end
13
+ rescue LoadError
14
+ # Unable to load libusb library on this system,
15
+ # so we build our bundled version:
16
+
17
+ libusb_dir = Dir[File.expand_path('../../ext/libusbx-*', __FILE__)].first
18
+ root_dir = File.expand_path('../..', __FILE__)
19
+ raise "could not find embedded libusb sources" unless libusb_dir
20
+
21
+ old_dir = Dir.pwd
22
+ Dir.chdir libusb_dir
23
+ cmd = "./configure --prefix=#{root_dir} && make && make install"
24
+ puts cmd
25
+ system cmd
26
+ raise "libusb build exited with #{$?.exitstatus}" if $?.exitstatus!=0
27
+ Dir.chdir old_dir
28
+ end
29
+
30
+ File.open("Makefile", "w") do |mf|
31
+ mf.puts "# Dummy makefile since libusb-1.0 is usable on this system"
32
+ mf.puts "all install::\n"
33
+ end
@@ -14,12 +14,11 @@
14
14
  # along with Libusb for Ruby. If not, see <http://www.gnu.org/licenses/>.
15
15
 
16
16
  module LIBUSB
17
- VERSION = "0.2.2"
18
-
19
17
  require 'libusb/call'
20
18
  require 'libusb/constants'
21
19
  require 'libusb/context'
22
- autoload :Version, 'libusb/version'
20
+ autoload :VERSION, 'libusb/version_gem'
21
+ autoload :Version, 'libusb/version_struct'
23
22
  autoload :Configuration, 'libusb/configuration'
24
23
  autoload :DevHandle, 'libusb/dev_handle'
25
24
  autoload :Device, 'libusb/device'
@@ -17,16 +17,15 @@ require 'rubygems'
17
17
  require 'ffi'
18
18
 
19
19
  module LIBUSB
20
- # C level interface
20
+ # C level interface - for internal use only
21
+ #
22
+ # All enum codes are available as constants in {LIBUSB} namespace.
21
23
  module Call
22
24
  extend FFI::Library
23
25
 
24
- if FFI::Platform.windows?
25
- bundled_dll = File.join(File.dirname(__FILE__), '..', 'libusb-1.0.dll')
26
- ffi_lib(['libusb-1.0', bundled_dll])
27
- else
28
- ffi_lib 'libusb-1.0'
29
- end
26
+ ext = FFI::Platform.windows? ? 'dll' : 'so'
27
+ bundled_dll = File.expand_path("../../libusb-1.0.#{ext}", __FILE__)
28
+ ffi_lib(['libusb-1.0', bundled_dll])
30
29
 
31
30
  ClassCodes = enum :libusb_class_code, [
32
31
  :CLASS_PER_INTERFACE, 0,
@@ -211,7 +210,16 @@ module LIBUSB
211
210
  attach_function 'libusb_free_transfer', [:pointer], :void
212
211
 
213
212
  attach_function 'libusb_handle_events', [:libusb_context], :int, :blocking=>true
213
+ try_attach_function 'libusb_handle_events_completed', [:libusb_context, :pointer], :int, :blocking=>true
214
+ attach_function 'libusb_handle_events_timeout', [:libusb_context, :pointer], :int, :blocking=>true
215
+ try_attach_function 'libusb_handle_events_timeout_completed', [:libusb_context, :pointer, :pointer], :int, :blocking=>true
216
+
217
+ callback :libusb_pollfd_added_cb, [:int, :short, :pointer], :void
218
+ callback :libusb_pollfd_removed_cb, [:int, :pointer], :void
214
219
 
220
+ attach_function 'libusb_get_pollfds', [:libusb_context], :pointer
221
+ attach_function 'libusb_get_next_timeout', [:libusb_context, :pointer], :int
222
+ attach_function 'libusb_set_pollfd_notifiers', [:libusb_context, :libusb_pollfd_added_cb, :libusb_pollfd_removed_cb, :pointer], :void
215
223
 
216
224
  callback :libusb_transfer_cb_fn, [:pointer], :void
217
225
 
@@ -267,5 +275,39 @@ module LIBUSB
267
275
  :iSerialNumber, :uint8,
268
276
  :bNumConfigurations, :uint8
269
277
  end
278
+
279
+ class Timeval < FFI::Struct
280
+ layout :tv_sec, :long,
281
+ :tv_usec, :long
282
+
283
+ # set timeval to the number of milliseconds
284
+ # @param [Fixnum] value
285
+ def in_ms=(value)
286
+ self[:tv_sec], self[:tv_usec] = (value*1000).divmod(1000000)
287
+ end
288
+
289
+ # get the number of milliseconds in timeval
290
+ # @return [Fixnum]
291
+ def in_ms
292
+ self[:tv_sec]*1000 + self[:tv_usec]/1000
293
+ end
294
+
295
+ # set timeval to the number of seconds
296
+ # @param [Numeric] value
297
+ def in_s=(value)
298
+ self[:tv_sec], self[:tv_usec] = (value*1000000).divmod(1000000)
299
+ end
300
+
301
+ # get the number of seconds in timeval
302
+ # @return [Float]
303
+ def in_s
304
+ self[:tv_sec] + self[:tv_usec]/1000000.0
305
+ end
306
+ end
307
+
308
+ class Pollfd < FFI::Struct
309
+ layout :fd, :int,
310
+ :events, :short
311
+ end
270
312
  end
271
313
  end