phidgets-ffi 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+