phidgets-ffi 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,28 @@
1
+ module Phidgets
2
+ class Log
3
+ Klass = Phidgets::FFI::Log
4
+
5
+ def self.enable(loglevel=:warning, filename=nil)
6
+ Klass.enableLogging(loglevel, filename.to_s)
7
+ true
8
+ end
9
+
10
+ def self.disable
11
+ Klass.disableLogging
12
+ true
13
+ end
14
+
15
+ def self.log(loglevel, identifier, message, *args)
16
+ Klass.log(loglevel, identifier, message, *args)
17
+ end
18
+
19
+ def self.method_missing(method, *args, &block)
20
+ if Phidgets::FFI::LogLevel.symbols.include?(method)
21
+ log(method, *args)
22
+ true
23
+ else
24
+ super(method, *args, &block)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,109 @@
1
+ module Phidgets
2
+ class Manager
3
+ Klass = Phidgets::FFI::CPhidgetManager
4
+ include Utility
5
+
6
+ def initialize(&block)
7
+ if block_given?
8
+ create
9
+ open
10
+ yield self
11
+ close
12
+ delete
13
+ end
14
+ end
15
+
16
+ def create
17
+ ptr = ::FFI::MemoryPointer.new(:pointer, 1)
18
+ Klass.create(ptr)
19
+ @handle = ptr.get_pointer(0)
20
+ true
21
+ end
22
+
23
+ def open
24
+ Klass.open(@handle)
25
+ # There is no waiting for attachments in the manager, the check is instant so we sleep for a second to give it a chance to register things
26
+ sleep 1
27
+ true
28
+ end
29
+
30
+ def close
31
+ Klass.close(@handle)
32
+ true
33
+ end
34
+
35
+ def delete
36
+ Klass.delete(@handle)
37
+ true
38
+ end
39
+
40
+ def devices(timeout=5000)
41
+ devices_ptr, count = ::FFI::MemoryPointer.new(:pointer, 1), ::FFI::MemoryPointer.new(:int)
42
+ Klass.getAttachedDevices(@handle, devices_ptr, count)
43
+ devices = devices_ptr.get_array_of_pointer(0, count.get_int(0))
44
+ device_arr = devices.map do |device|
45
+ device = device.get_pointer(0)
46
+ Common.attributes(device)
47
+ end
48
+ Klass.freeAttachedDevicesArray(devices_ptr)
49
+
50
+ device_arr
51
+ end
52
+
53
+ def server_id
54
+ ptr = ::FFI::MemoryPointer.new(:string)
55
+ Phidgets::FFI::Common.getServerID(@handle, ptr)
56
+ strPtr = ptr.get_pointer(0)
57
+ strPtr.null? ? nil : strPtr.read_string
58
+ end
59
+
60
+ def server_address
61
+ str_ptr, int_ptr = ::FFI::MemoryPointer.new(:string), ::FFI::MemoryPointer.new(:int)
62
+ Phidgets::FFI::Common.getServerID(@handle, str_ptr, int_ptr)
63
+ strPtr = str_ptr.get_pointer(0)
64
+ address = (strPtr.null? ? nil : strPtr.read_string)
65
+ port = int_ptr.get_int(0)
66
+ [address, port]
67
+ end
68
+
69
+ def on_attach(obj=nil, &block)
70
+ @on_attach_obj = obj
71
+ @on_attach = Proc.new { |handle, obj_ptr|
72
+ yield object_for(obj_ptr)
73
+ }
74
+ Klass.set_OnAttach_Handler(@handle, @on_attach, pointer_for(obj))
75
+ end
76
+
77
+ def on_detach(obj=nil, &block)
78
+ @on_detach_obj = obj
79
+ @on_detach = Proc.new { |handle, obj_ptr|
80
+ yield object_for(obj_ptr)
81
+ }
82
+ Klass.set_OnDetach_Handler(@handle, @on_detach, pointer_for(obj))
83
+ end
84
+
85
+ def on_server_connect(obj=nil, &block)
86
+ @on_server_connect_obj = obj
87
+ @on_server_connect = Proc.new { |handle, obj_ptr|
88
+ yield self, object_for(obj_pointer)
89
+ }
90
+ Klass.set_OnServerConnect_Handler(@handle, @on_server_connect, pointer_for(obj))
91
+ end
92
+
93
+ def on_server_disconnect(obj=nil, &block)
94
+ @on_server_disconnect_obj = obj
95
+ @on_server_disconnect = Proc.new { |handle, obj_ptr|
96
+ yield self, object_for(obj_ptr)
97
+ }
98
+ Klass.set_OnServerDisconnect_Handler(@handle, @on_server_disconnect, pointer_for(obj))
99
+ end
100
+
101
+ def on_error(obj=nil, &block)
102
+ @on_error_obj = obj
103
+ @on_error = Proc.new { |handle, obj_ptr, code, description|
104
+ yield self, object_for(obj_ptr), code, description
105
+ }
106
+ Klass.set_OnError_Handler(@handle, @on_error, pointer_for(obj))
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,6 @@
1
+ module Phidgets
2
+ module FFI
3
+ extend ::FFI::Library
4
+ ffi_lib '/Library/Frameworks/Phidget21.framework/Versions/Current/Phidget21'
5
+ end
6
+ end
@@ -0,0 +1,112 @@
1
+ module Phidgets
2
+ class ServoController
3
+
4
+ Klass = Phidgets::FFI::CPhidgetServo
5
+ include Phidgets::Common
6
+
7
+ attr_reader :servos
8
+
9
+ def initialize(serial_number=-1, &block)
10
+ create
11
+ open(serial_number)
12
+ wait_for_attachment
13
+ load_servos
14
+ if block_given?
15
+ yield self
16
+ close
17
+ delete
18
+ end
19
+ end
20
+
21
+ def attributes
22
+ super.merge({
23
+ :servos => servos.size,
24
+ })
25
+ end
26
+
27
+ def on_change(obj=nil, &block)
28
+ @on_change_obj = obj
29
+ @on_change = Proc.new { |device, obj_ptr, index, position|
30
+ yield @servos[index], position, object_for(obj_ptr)
31
+ }
32
+ Klass.set_OnPositionChange_Handler(@handle, @on_change, pointer_for(obj))
33
+ end
34
+
35
+ private
36
+
37
+ def load_servos
38
+ ptr = ::FFI::MemoryPointer.new(:int)
39
+ Klass.getMotorCount(@handle, ptr)
40
+
41
+ @servos = []
42
+ ptr.get_int(0).times do |i|
43
+ @servos << Servo.new(@handle, i)
44
+ end
45
+ end
46
+ end
47
+
48
+ class Servo
49
+ Klass = Phidgets::FFI::CPhidgetServo
50
+
51
+ attr_reader :index
52
+
53
+ def initialize(handle, index)
54
+ @handle, @index = handle, index.to_i
55
+ end
56
+
57
+ def engaged
58
+ ptr = ::FFI::MemoryPointer.new(:int, 1)
59
+ Klass.getEngaged(@handle, @index, ptr)
60
+ (ptr.get_int(0) == 0) ? false : true
61
+ end
62
+ alias_method :engaged?, :engaged
63
+
64
+ def engaged=(val)
65
+ tmp = val ? 1 : 0
66
+ Klass.setEngaged(@handle, @index, tmp)
67
+
68
+ val
69
+ end
70
+
71
+ def max
72
+ ptr = ::FFI::MemoryPointer.new(:double, 1)
73
+ Klass.getPositionMax(@handle, @index, ptr)
74
+ ptr.get_double(0)
75
+ end
76
+
77
+ def min
78
+ ptr = ::FFI::MemoryPointer.new(:double, 1)
79
+ Klass.getPositionMin(@handle, @index, ptr)
80
+ ptr.get_double(0)
81
+ end
82
+
83
+ def position
84
+ ptr = ::FFI::MemoryPointer.new(:double, 1)
85
+ Klass.getPosition(@handle, @index, ptr)
86
+ ptr.get_double(0)
87
+ end
88
+
89
+ def position=(new_position)
90
+ Klass.setPosition(@handle, @index, new_position.to_f)
91
+ new_position
92
+ end
93
+
94
+ def type
95
+ ptr = ::FFI::MemoryPointer.new(:int)
96
+ Klass.getServoType(@handle, @index, ptr)
97
+
98
+ Phidgets::FFI::ServoType[ptr.get_int(0)]
99
+ end
100
+
101
+ def type=(servo_type=:default)
102
+ ptr = ::FFI::MemoryPointer.new(:int)
103
+ Klass.setServoType(@handle, @index, Phidgets::FFI::ServoType[servo_type])
104
+ servo_type
105
+ end
106
+
107
+ def set_parameters(min_pcm, max_pcm, degrees)
108
+ Klass.setServoParameters(@handle, @index, min_pcm.to_f, max_pcm.to_f, degrees.to_f)
109
+ true
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,5 @@
1
+ module Phidgets
2
+ module FFI
3
+ VERSION = "0.0.3"
4
+ end
5
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path("../lib/phidgets-ffi/version", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "phidgets-ffi"
6
+ s.version = Phidgets::FFI::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ["Kelley Reynolds"]
9
+ s.email = ["kelley@insidesystems.net"]
10
+ s.homepage = "http://rubygems.org/gems/phidgets-ffi"
11
+ s.summary = "FFI Bindings for the Phidget Library"
12
+ s.description = "FFI Bindings for the Phidget Library"
13
+
14
+ s.required_rubygems_version = ">= 1.3.6"
15
+ s.rubyforge_project = "phidgets-ffi"
16
+
17
+ s.add_development_dependency "bundler", ">= 1.0.0"
18
+ s.add_runtime_dependency "ffi", ">= 1.0.9"
19
+
20
+ s.files = `git ls-files`.split("\n")
21
+ s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
22
+ s.require_path = 'lib'
23
+ end
metadata ADDED
@@ -0,0 +1,133 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: phidgets-ffi
3
+ version: !ruby/object:Gem::Version
4
+ hash: 25
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 3
10
+ version: 0.0.3
11
+ platform: ruby
12
+ authors:
13
+ - Kelley Reynolds
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-07-13 00:00:00 -04:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: bundler
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 23
30
+ segments:
31
+ - 1
32
+ - 0
33
+ - 0
34
+ version: 1.0.0
35
+ type: :development
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: ffi
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 5
46
+ segments:
47
+ - 1
48
+ - 0
49
+ - 9
50
+ version: 1.0.9
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ description: FFI Bindings for the Phidget Library
54
+ email:
55
+ - kelley@insidesystems.net
56
+ executables: []
57
+
58
+ extensions: []
59
+
60
+ extra_rdoc_files: []
61
+
62
+ files:
63
+ - .gitignore
64
+ - Gemfile
65
+ - LICENSE
66
+ - README.rdoc
67
+ - Rakefile
68
+ - examples/ffi/dictionary.rb
69
+ - examples/ffi/interface_kit.rb
70
+ - examples/ffi/library_version.rb
71
+ - examples/ffi/log.rb
72
+ - examples/ffi/manager.rb
73
+ - examples/ffi/servo.rb
74
+ - examples/interface_kit.rb
75
+ - examples/log.rb
76
+ - examples/manager.rb
77
+ - examples/servo.rb
78
+ - lib/phidgets-ffi.rb
79
+ - lib/phidgets-ffi/common.rb
80
+ - lib/phidgets-ffi/error.rb
81
+ - lib/phidgets-ffi/ffi/common.rb
82
+ - lib/phidgets-ffi/ffi/constants.rb
83
+ - lib/phidgets-ffi/ffi/core_ext.rb
84
+ - lib/phidgets-ffi/ffi/dictionary.rb
85
+ - lib/phidgets-ffi/ffi/interface_kit.rb
86
+ - lib/phidgets-ffi/ffi/log.rb
87
+ - lib/phidgets-ffi/ffi/manager.rb
88
+ - lib/phidgets-ffi/ffi/servo.rb
89
+ - lib/phidgets-ffi/interface_kit.rb
90
+ - lib/phidgets-ffi/log.rb
91
+ - lib/phidgets-ffi/manager.rb
92
+ - lib/phidgets-ffi/phidgets-ffi.rb
93
+ - lib/phidgets-ffi/servo.rb
94
+ - lib/phidgets-ffi/version.rb
95
+ - phidgets-ffi.gemspec
96
+ has_rdoc: true
97
+ homepage: http://rubygems.org/gems/phidgets-ffi
98
+ licenses: []
99
+
100
+ post_install_message:
101
+ rdoc_options: []
102
+
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ hash: 3
111
+ segments:
112
+ - 0
113
+ version: "0"
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ hash: 23
120
+ segments:
121
+ - 1
122
+ - 3
123
+ - 6
124
+ version: 1.3.6
125
+ requirements: []
126
+
127
+ rubyforge_project: phidgets-ffi
128
+ rubygems_version: 1.3.7
129
+ signing_key:
130
+ specification_version: 3
131
+ summary: FFI Bindings for the Phidget Library
132
+ test_files: []
133
+