aberant-tuio-ruby 0.0.2 → 0.1.0
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.
- data/VERSION.yml +2 -2
- data/lib/core_ext/float.rb +5 -0
- data/lib/core_ext/object.rb +11 -0
- data/lib/my_environment.rb +6 -0
- data/lib/tuio_client.rb +156 -39
- data/lib/tuio_container.rb +50 -0
- data/lib/tuio_cursor.rb +53 -0
- data/lib/tuio_object.rb +80 -0
- data/lib/tuio_point.rb +45 -0
- data/spec/integration/tuio_event_spec.rb +165 -0
- data/spec/spec_helper.rb +4 -3
- data/spec/unit/tuio_container_spec.rb +74 -0
- data/spec/unit/tuio_cursor_spec.rb +29 -0
- data/spec/unit/tuio_object_spec.rb +96 -0
- data/spec/unit/tuio_point_spec.rb +46 -0
- metadata +17 -3
- data/spec/tuio_event_spec.rb +0 -55
data/VERSION.yml
CHANGED
data/lib/tuio_client.rb
CHANGED
@@ -1,13 +1,18 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'osc'
|
3
3
|
|
4
|
+
require File.join( File.dirname( __FILE__ ), 'my_environment')
|
4
5
|
|
6
|
+
require "tuio_object"
|
7
|
+
require "tuio_cursor"
|
5
8
|
|
6
|
-
class
|
9
|
+
class TuioClient
|
7
10
|
include OSC
|
8
11
|
|
12
|
+
client_block_setter :object_creation, :object_update, :object_removal
|
13
|
+
client_block_setter :cursor_creation, :cursor_update, :cursor_removal
|
14
|
+
|
9
15
|
def initialize( args = {} )
|
10
|
-
@host = args[:host] || 'localhost'
|
11
16
|
@port = args[:port] || 3333
|
12
17
|
|
13
18
|
@tuio_objects = { }
|
@@ -15,25 +20,29 @@ class TUIOClient
|
|
15
20
|
|
16
21
|
@osc = OSC::SimpleServer.new(@port)
|
17
22
|
|
18
|
-
@osc.add_method '/tuio/2Dobj'
|
23
|
+
@osc.add_method '/tuio/2Dobj' do |msg|
|
19
24
|
args = msg.to_a
|
20
25
|
|
21
26
|
case args.shift
|
22
27
|
when "set"
|
23
|
-
|
28
|
+
track_tuio_object( args )
|
24
29
|
when "alive"
|
25
30
|
keep_alive( :tuio_objects, args )
|
31
|
+
when "fseq"
|
32
|
+
# puts args
|
26
33
|
end
|
27
34
|
end
|
28
35
|
|
29
|
-
@osc.add_method '/tuio/2Dcur'
|
36
|
+
@osc.add_method '/tuio/2Dcur' do |msg|
|
30
37
|
args = msg.to_a
|
31
38
|
|
32
39
|
case args.shift
|
33
40
|
when "set"
|
34
|
-
|
41
|
+
track_tuio_cursor args
|
35
42
|
when "alive"
|
36
43
|
keep_alive( :tuio_cursors, args )
|
44
|
+
when "fseq"
|
45
|
+
# puts args
|
37
46
|
end
|
38
47
|
end
|
39
48
|
end
|
@@ -44,6 +53,10 @@ class TUIOClient
|
|
44
53
|
end
|
45
54
|
end
|
46
55
|
|
56
|
+
####################################
|
57
|
+
# getters #
|
58
|
+
####################################
|
59
|
+
|
47
60
|
def tuio_objects
|
48
61
|
@tuio_objects
|
49
62
|
end
|
@@ -60,55 +73,159 @@ class TUIOClient
|
|
60
73
|
@tuio_cursors[id]
|
61
74
|
end
|
62
75
|
|
76
|
+
####################################
|
77
|
+
# call backs #
|
78
|
+
####################################
|
79
|
+
|
80
|
+
# def on_cursor_update( &cur_update_blk )
|
81
|
+
# @cur_update_blk = cur_update_blk
|
82
|
+
# end
|
83
|
+
|
63
84
|
private
|
64
|
-
|
65
|
-
def
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
85
|
+
|
86
|
+
def track_tuio_object( args )
|
87
|
+
session_id = session_id_from( args )
|
88
|
+
|
89
|
+
if tuio_object_previously_tracked?( session_id )
|
90
|
+
|
91
|
+
tuio_object = grab_tuio_object_by( session_id )
|
92
|
+
|
93
|
+
return if tuio_object.args_equal?( args )
|
94
|
+
|
95
|
+
tuio_object.update( *update_object_params_from( args ) )
|
96
|
+
|
97
|
+
trigger_object_update_callback( tuio_object )
|
98
|
+
else
|
99
|
+
tuio_object = track_new_tuio_object_with( session_id, args )
|
100
|
+
|
101
|
+
trigger_object_creation_callback( tuio_object )
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def track_tuio_cursor( args )
|
106
|
+
session_id = session_id_from( args )
|
107
|
+
|
108
|
+
if tuio_cursor_previously_tracked?( session_id )
|
109
|
+
tuio_cursor = grab_tuio_cursor_by( session_id )
|
110
|
+
|
111
|
+
return if tuio_cursor.args_equal?( args )
|
112
|
+
tuio_cursor.update( *update_cursor_params_from( args ))
|
113
|
+
|
114
|
+
trigger_cursor_update_callback( tuio_cursor )
|
115
|
+
|
116
|
+
else # this is a new cursor
|
117
|
+
finger_id = @tuio_cursors.size
|
118
|
+
track_new_tuio_cursor_with( session_id, args )
|
119
|
+
|
120
|
+
trigger_cursor_creation_callback( grab_tuio_cursor_by( session_id ) )
|
121
|
+
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def session_id_from( args )
|
126
|
+
args[0]
|
127
|
+
end
|
128
|
+
|
129
|
+
def new_object_params_from( args )
|
130
|
+
args[0..4]
|
131
|
+
end
|
132
|
+
|
133
|
+
def update_object_params_from( args )
|
134
|
+
args[2..9]
|
135
|
+
end
|
136
|
+
|
137
|
+
def new_cursor_params_from( args )
|
138
|
+
args[0..2]
|
139
|
+
end
|
140
|
+
|
141
|
+
def update_cursor_params_from( args )
|
142
|
+
args[1..5]
|
74
143
|
end
|
75
144
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
145
|
+
|
146
|
+
def tuio_object_previously_tracked?( session_id )
|
147
|
+
@tuio_objects.has_key?( session_id )
|
148
|
+
end
|
149
|
+
|
150
|
+
def tuio_cursor_previously_tracked?( session_id )
|
151
|
+
@tuio_cursors.has_key?( session_id )
|
152
|
+
end
|
153
|
+
|
154
|
+
def grab_tuio_object_by( session_id )
|
155
|
+
@tuio_objects[session_id]
|
156
|
+
end
|
157
|
+
|
158
|
+
def grab_tuio_cursor_by( session_id )
|
159
|
+
@tuio_cursors[session_id]
|
160
|
+
end
|
161
|
+
|
162
|
+
def track_new_tuio_object_with( session_id, args )
|
163
|
+
@tuio_objects[session_id] = TuioObject.new( *new_object_params_from( args ) )
|
164
|
+
end
|
165
|
+
|
166
|
+
def track_new_tuio_cursor_with( session_id, args )
|
167
|
+
@tuio_cursors[session_id] = TuioCursor.new( *new_cursor_params_from( args ) )
|
168
|
+
end
|
169
|
+
|
170
|
+
####################################
|
171
|
+
# call backs #
|
172
|
+
####################################
|
173
|
+
|
174
|
+
def trigger_object_update_callback( tuio_object )
|
175
|
+
@object_update_callback_blk.call( tuio_object ) if @object_update_callback_blk
|
176
|
+
end
|
177
|
+
|
178
|
+
def trigger_object_creation_callback( tuio_object )
|
179
|
+
@object_creation_callback_blk.call( tuio_object ) if @object_creation_callback_blk
|
180
|
+
end
|
181
|
+
|
182
|
+
def trigger_object_deletion_callback( tuio_object )
|
183
|
+
@object_removal_callback_blk.call( tuio_object ) if @object_removal_callback_blk
|
184
|
+
end
|
185
|
+
|
186
|
+
def trigger_cursor_creation_callback( tuio_cursor )
|
187
|
+
@cursor_creation_callback_blk.call( tuio_cursor ) if @cursor_creation_callback_blk
|
188
|
+
end
|
189
|
+
|
190
|
+
def trigger_cursor_update_callback( tuio_cursor )
|
191
|
+
@cursor_update_callback_blk.call( tuio_cursor ) if @cursor_update_callback_blk
|
192
|
+
end
|
193
|
+
|
194
|
+
def trigger_cursor_update_callback( tuio_cursor )
|
195
|
+
@cursor_update_callback_blk.call( tuio_cursor ) if @cursor_update_callback_blk
|
196
|
+
end
|
197
|
+
|
198
|
+
def trigger_cursor_deletion_callback( tuio_object )
|
199
|
+
@cursor_removal_callback_blk.call( tuio_object ) if @cursor_removal_callback_blk
|
200
|
+
end
|
201
|
+
|
202
|
+
def delete_tuio_objects( session_id )
|
203
|
+
tuio_object = grab_tuio_object_by( session_id )
|
92
204
|
|
93
|
-
|
205
|
+
trigger_object_deletion_callback( tuio_object )
|
94
206
|
end
|
95
207
|
|
96
|
-
def
|
97
|
-
tuio_cursor =
|
98
|
-
|
208
|
+
def delete_tuio_cursors( session_id )
|
209
|
+
tuio_cursor = grab_tuio_cursor_by( session_id )
|
210
|
+
|
211
|
+
trigger_cursor_deletion_callback( tuio_cursor )
|
99
212
|
end
|
100
213
|
|
214
|
+
|
101
215
|
def keep_alive( type, session_ids )
|
216
|
+
return if session_ids.nil?
|
102
217
|
all_keys = send( type ).keys
|
103
218
|
|
104
219
|
dead = all_keys.reject { |key| session_ids.include? key }
|
105
220
|
|
106
|
-
dead.each do |
|
107
|
-
send( type
|
221
|
+
dead.each do | session_id |
|
222
|
+
send( "delete_#{type}", session_id )
|
223
|
+
|
224
|
+
send( type ).delete( session_id )
|
108
225
|
end
|
109
226
|
end
|
110
227
|
end
|
111
228
|
|
112
229
|
if $0 == __FILE__
|
113
|
-
|
230
|
+
TuioClient.new.start
|
114
231
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'tuio_point'
|
2
|
+
|
3
|
+
module TuioContainer
|
4
|
+
attr_accessor :session_id, :x_pos, :y_pos, :x_speed, :y_speed, :motion_accel
|
5
|
+
|
6
|
+
|
7
|
+
def initialize( session_id, x_pos, y_pos )
|
8
|
+
@session_id = session_id
|
9
|
+
@x_pos = x_pos
|
10
|
+
@y_pos = y_pos
|
11
|
+
|
12
|
+
@x_speed = 0.0
|
13
|
+
@y_speed = 0.0
|
14
|
+
@motion_accel = 0.0
|
15
|
+
|
16
|
+
add_point_to_path( TuioPoint.new( x_pos, y_pos ) )
|
17
|
+
end
|
18
|
+
|
19
|
+
def update( x_pos, y_pos, x_speed, y_speed, motion_accel )
|
20
|
+
@x_pos = x_pos
|
21
|
+
@y_pos = y_pos
|
22
|
+
@x_speed = x_speed
|
23
|
+
@y_speed = y_speed
|
24
|
+
@motion_accel = motion_accel
|
25
|
+
|
26
|
+
new_point = TuioPoint.new( x_pos, y_pos )
|
27
|
+
add_point_to_path( new_point ) unless new_point == @path.last
|
28
|
+
end
|
29
|
+
|
30
|
+
def path
|
31
|
+
@path
|
32
|
+
end
|
33
|
+
|
34
|
+
def args_equal?( args )
|
35
|
+
@session_id == args[0] &&
|
36
|
+
@x_pos.approx_equal?( args[1] ) &&
|
37
|
+
@y_pos.approx_equal?( args[2] ) &&
|
38
|
+
@x_speed.approx_equal?( args[3] ) &&
|
39
|
+
@y_speed.approx_equal?( args[4] ) &&
|
40
|
+
@motion_accel.approx_equal?( args[5] )
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def add_point_to_path( tuio_point )
|
46
|
+
@path ||= []
|
47
|
+
@path << tuio_point
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
data/lib/tuio_cursor.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
class TuioCursor
|
2
|
+
include TuioContainer
|
3
|
+
|
4
|
+
attr_reader :finger_id, :x_speed, :y_speed, :motion_accel
|
5
|
+
|
6
|
+
def initialize( session_id, x_pos, y_pos ) #, x_speed, y_speed, motion_accel )
|
7
|
+
super( session_id, x_pos, y_pos )
|
8
|
+
|
9
|
+
@x_speed = 0.0
|
10
|
+
@y_speed = 0.0
|
11
|
+
@motion_accel = 0.0
|
12
|
+
end
|
13
|
+
|
14
|
+
def args_equal?( args )
|
15
|
+
super( args_to_container_from_cursor( args ) ) &&
|
16
|
+
|
17
|
+
@x_speed.approx_equal?(args[3] ) &&
|
18
|
+
@y_speed.approx_equal?(args[4] ) &&
|
19
|
+
@motion_accel.approx_equal?(args[5] )
|
20
|
+
end
|
21
|
+
|
22
|
+
def inspect
|
23
|
+
puts "TuioCursor:"
|
24
|
+
puts "session_id >> #{session_id}"
|
25
|
+
puts "x_pos >> #{x_pos}"
|
26
|
+
puts "y_pos >> #{y_pos}"
|
27
|
+
puts "x_speed >> #{x_speed}"
|
28
|
+
puts "y_speed >> #{y_speed}"
|
29
|
+
puts "motion_accel >> #{motion_accel}"
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
private
|
34
|
+
def args_to_container_from_cursor( args )
|
35
|
+
#session_id,
|
36
|
+
[ args[0],
|
37
|
+
|
38
|
+
# x_pos
|
39
|
+
args[1],
|
40
|
+
|
41
|
+
# y_pos
|
42
|
+
args[2],
|
43
|
+
|
44
|
+
# x_speed
|
45
|
+
args[3],
|
46
|
+
|
47
|
+
# y_speed
|
48
|
+
args[4],
|
49
|
+
|
50
|
+
# motion_accel
|
51
|
+
args[5] ]
|
52
|
+
end
|
53
|
+
end
|
data/lib/tuio_object.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'tuio_container'
|
2
|
+
|
3
|
+
class TuioObject
|
4
|
+
attr_reader :angle, :fiducial_id, :rotation_speed, :rotation_accel
|
5
|
+
|
6
|
+
include TuioContainer
|
7
|
+
|
8
|
+
def initialize( session_id, fiducial_id, x_pos, y_pos, angle )
|
9
|
+
super( session_id, x_pos, y_pos )
|
10
|
+
|
11
|
+
@fiducial_id = fiducial_id
|
12
|
+
@angle = angle
|
13
|
+
|
14
|
+
@rotation_speed = 0.0
|
15
|
+
@rotation_accel = 0.0
|
16
|
+
end
|
17
|
+
|
18
|
+
def update( x_pos, y_pos, angle, x_speed, y_speed, rotation_speed, motion_accel, rotation_accel )
|
19
|
+
super( x_pos, y_pos, x_speed, y_speed, motion_accel )
|
20
|
+
|
21
|
+
@angle = angle
|
22
|
+
@rotation_speed = rotation_speed
|
23
|
+
@rotation_accel = rotation_accel
|
24
|
+
end
|
25
|
+
|
26
|
+
def args_equal?( args )
|
27
|
+
fiducial_id == args[1] &&
|
28
|
+
rotation_speed.approx_equal?( args[7] ) &&
|
29
|
+
rotation_accel.approx_equal?( args[9] ) &&
|
30
|
+
super( args_to_container_from_object( args ) )
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_args
|
34
|
+
[ session_id,
|
35
|
+
fiducial_id,
|
36
|
+
x_pos,
|
37
|
+
y_pos,
|
38
|
+
angle,
|
39
|
+
x_speed,
|
40
|
+
y_speed,
|
41
|
+
rotation_speed,
|
42
|
+
motion_accel,
|
43
|
+
rotation_accel]
|
44
|
+
end
|
45
|
+
|
46
|
+
def inspect
|
47
|
+
puts "TuioObject:"
|
48
|
+
puts "session_id >> #{session_id}"
|
49
|
+
puts "fiducial_id >> #{fiducial_id}"
|
50
|
+
puts "x_pos >> #{x_pos}"
|
51
|
+
puts "y_pos >> #{y_pos}"
|
52
|
+
puts "angle >> #{angle}"
|
53
|
+
puts "x_speed >> #{x_speed}"
|
54
|
+
puts "y_speed >> #{y_speed}"
|
55
|
+
puts "rotation_speed >> #{rotation_speed}"
|
56
|
+
puts "motion_accel >> #{motion_accel}"
|
57
|
+
puts "rotation_accel >> #{rotation_accel}"
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
def args_to_container_from_object( args )
|
62
|
+
#session_id,
|
63
|
+
[ args[0],
|
64
|
+
|
65
|
+
# x_pos
|
66
|
+
args[2],
|
67
|
+
|
68
|
+
# y_pos
|
69
|
+
args[3],
|
70
|
+
|
71
|
+
# x_speed
|
72
|
+
args[5],
|
73
|
+
|
74
|
+
# y_speed
|
75
|
+
args[6],
|
76
|
+
|
77
|
+
# motion_accel
|
78
|
+
args[8] ]
|
79
|
+
end
|
80
|
+
end
|
data/lib/tuio_point.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
class TuioPoint
|
2
|
+
attr_accessor :x_pos, :y_pos, :updated_at
|
3
|
+
|
4
|
+
def initialize( x_pos, y_pos )
|
5
|
+
@x_pos, @y_pos = x_pos, y_pos
|
6
|
+
end
|
7
|
+
|
8
|
+
def update( x_pos, y_pos )
|
9
|
+
@x_pos, @y_pos = x_pos, y_pos
|
10
|
+
|
11
|
+
clear_update_time
|
12
|
+
end
|
13
|
+
|
14
|
+
def distance_to( another_point )
|
15
|
+
dx = @x_pos - another_point.x_pos
|
16
|
+
dy = @y_pos - another_point.y_pos
|
17
|
+
|
18
|
+
Math.sqrt( dx*dx + dy*dy )
|
19
|
+
end
|
20
|
+
|
21
|
+
def radians_to( another_point )
|
22
|
+
side = another_point.x_pos - @x_pos
|
23
|
+
height = another_point.y_pos - @y_pos
|
24
|
+
distance = distance_to( another_point )
|
25
|
+
|
26
|
+
angle = Math.asin( side / distance ) + Math::PI / 2
|
27
|
+
angle = 2.0 * Math.PI - angle if height < 0
|
28
|
+
angle
|
29
|
+
end
|
30
|
+
|
31
|
+
def degrees_to( another_point )
|
32
|
+
( radians_to( another_point ) / Math::PI ) * 180.0
|
33
|
+
end
|
34
|
+
|
35
|
+
def eql?( another_point )
|
36
|
+
@x_pos == another_point.x_pos &&
|
37
|
+
@y_pos == another_point.y_pos
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def clear_update_time
|
43
|
+
@updated_at = nil
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
require File.join( File.dirname(__FILE__) , '..', 'spec_helper' )
|
2
|
+
|
3
|
+
describe "tuio object" do
|
4
|
+
before :each do
|
5
|
+
setup_server
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "in general" do
|
9
|
+
it "should call the creation hook" do
|
10
|
+
@server.on_object_creation do | object |
|
11
|
+
raise "creation hook called!" if object.session_id == 49
|
12
|
+
end
|
13
|
+
|
14
|
+
lambda {
|
15
|
+
send_message( '/tuio/2Dobj', "set", 49, 25, 0.38, 0.35, 3.14, 0.0, 0.0, 0.0, 0.0, 0.0 )
|
16
|
+
}.should raise_error
|
17
|
+
|
18
|
+
lambda {
|
19
|
+
send_message( '/tuio/2Dobj', "set", 49, 25, 0.38, 0.35, 3.14, 0.0, 0.0, 0.0, 0.0, 0.0 )
|
20
|
+
}.should_not raise_error
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should call the update hook when session_id is set again with different location" do
|
24
|
+
@server.on_object_update do | object |
|
25
|
+
raise "update hook called!" if object.session_id == 49
|
26
|
+
end
|
27
|
+
|
28
|
+
lambda {
|
29
|
+
# this one calls the create hook
|
30
|
+
send_message( '/tuio/2Dobj', "set", 49, 25, 0.38, 0.35, 3.14, 0.0, 0.0, 0.0, 0.0, 0.0 )
|
31
|
+
send_message( '/tuio/2Dobj', "alive", 49)
|
32
|
+
|
33
|
+
#this one is the same as before, so nothing to update
|
34
|
+
send_message( '/tuio/2Dobj', "set", 49, 25, 0.38, 0.35, 3.14, 0.0, 0.0, 0.0, 0.0, 0.0 )
|
35
|
+
send_message( '/tuio/2Dobj', "alive", 49)
|
36
|
+
}.should_not raise_error
|
37
|
+
|
38
|
+
|
39
|
+
lambda {
|
40
|
+
#this one calls the update hook
|
41
|
+
send_message( '/tuio/2Dobj', "set", 49, 25, 0.12, 0.12, 3.14, 0.0, 0.0, 0.0, 0.0, 0.0 )
|
42
|
+
send_message( '/tuio/2Dobj', "alive", 49)
|
43
|
+
|
44
|
+
}.should raise_error
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should call the removal hook when an object is not on the alive list" do
|
48
|
+
@server.on_object_removal do | object |
|
49
|
+
raise "removal hook called!" if object.session_id == 51
|
50
|
+
end
|
51
|
+
|
52
|
+
send_message( '/tuio/2Dobj', "set", 49, 25, 0.38, 0.35, 3.14, 0.0, 0.0, 0.0, 0.0, 0.0 )
|
53
|
+
send_message( '/tuio/2Dobj', "set", 51, 26, 0.12, 0.50, 3.14, 0.0, 0.0, 0.0, 0.0, 0.0 )
|
54
|
+
|
55
|
+
lambda {
|
56
|
+
send_message( '/tuio/2Dobj', "alive", 49)
|
57
|
+
}.should raise_error
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "receiving message" do
|
63
|
+
before :each do
|
64
|
+
send_message( '/tuio/2Dobj', "set", 49, 25, 0.38, 0.35, 3.14, 0.0, 0.0, 0.0, 0.0, 0.0 )
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "set" do
|
68
|
+
it 'should update tracking' do
|
69
|
+
@server.tuio_objects.size.should == 1
|
70
|
+
@server.tuio_objects[49].fiducial_id.should == 25
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "alive" do
|
75
|
+
it 'should only keep alive the objects the client says are alive' do
|
76
|
+
send_message( '/tuio/2Dobj', "set", 51, 26, 0.12, 0.50, 3.14, 0.0, 0.0, 0.0, 0.0, 0.0 )
|
77
|
+
send_message( '/tuio/2Dobj', "alive", 49)
|
78
|
+
|
79
|
+
@server.tuio_objects.size.should == 1
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "fseq" do
|
84
|
+
it "should probably have a test!"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "tuio_cursors" do
|
90
|
+
before :each do
|
91
|
+
setup_server
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should update tracking' do
|
95
|
+
send_message( '/tuio/2Dcur', "set", 22, 0.38, 0.35, 0.0, 0.0, 0.0 )
|
96
|
+
|
97
|
+
@server.tuio_cursors.size.should == 1
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'should update tracking for multiples' do
|
101
|
+
send_message( '/tuio/2Dcur', "set", 22, 0.38, 0.35, 0.0, 0.0, 0.0 )
|
102
|
+
send_message( '/tuio/2Dcur', "set", 27, 0.12, 0.50, 0.0, 0.0, 0.0 )
|
103
|
+
|
104
|
+
|
105
|
+
@server.tuio_cursors.size.should == 2
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'should only keep alive the cursors the client says are alive' do
|
109
|
+
send_message( '/tuio/2Dcur', "set", 22, 0.38, 0.35, 0.0, 0.0, 0.0 )
|
110
|
+
send_message( '/tuio/2Dcur', "set", 27, 0.12, 0.50, 0.0, 0.0, 0.0 )
|
111
|
+
|
112
|
+
send_message( '/tuio/2Dcur', "alive", 22)
|
113
|
+
|
114
|
+
@server.tuio_cursors.size.should == 1
|
115
|
+
@server.tuio_cursors[22].session_id.should == 22
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should call the creation hooks" do
|
119
|
+
@server.on_cursor_creation do | objects |
|
120
|
+
raise "create! hook called!"
|
121
|
+
end
|
122
|
+
|
123
|
+
lambda {
|
124
|
+
send_message( '/tuio/2Dcur', "set", 27, 0.12, 0.50, 0.0, 0.0, 0.0 )
|
125
|
+
}.should raise_error
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should call the update hooks" do
|
129
|
+
@server.on_cursor_update do | objects |
|
130
|
+
raise "update hook called!"
|
131
|
+
end
|
132
|
+
|
133
|
+
lambda {
|
134
|
+
send_message( '/tuio/2Dcur', "set", 27, 0.12, 0.50, 0.0, 0.0, 0.0 )
|
135
|
+
send_message( '/tuio/2Dcur', "alive", 27)
|
136
|
+
|
137
|
+
send_message( '/tuio/2Dcur', "set", 27, 0.12, 0.50, 0.0, 0.0, 0.0 )
|
138
|
+
send_message( '/tuio/2Dcur', "alive", 27)
|
139
|
+
|
140
|
+
}.should_not raise_error
|
141
|
+
|
142
|
+
lambda {
|
143
|
+
send_message( '/tuio/2Dcur', "set", 27, 0.12, 0.32, 0.0, 0.0, 0.0 )
|
144
|
+
send_message( '/tuio/2Dcur', "alive", 27)
|
145
|
+
|
146
|
+
}.should raise_error
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
it "should call the removal hooks" do
|
151
|
+
@server.on_cursor_removal do | objects |
|
152
|
+
raise "removal hook called!"
|
153
|
+
end
|
154
|
+
|
155
|
+
lambda {
|
156
|
+
send_message( '/tuio/2Dcur', "set", 27, 0.12, 0.50, 0.0, 0.0, 0.0 )
|
157
|
+
send_message( '/tuio/2Dcur', "set", 32, 0.18, 0.98, 0.0, 0.0, 0.0 )
|
158
|
+
}.should_not raise_error
|
159
|
+
|
160
|
+
lambda {
|
161
|
+
send_message( '/tuio/2Dcur', "alive", 27)
|
162
|
+
|
163
|
+
}.should raise_error
|
164
|
+
end
|
165
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,14 +2,15 @@ require 'rubygems'
|
|
2
2
|
require 'spec'
|
3
3
|
require 'rr'
|
4
4
|
require 'osc'
|
5
|
-
|
5
|
+
|
6
|
+
require File.join( File.dirname( __FILE__ ), '..', 'lib', 'tuio_client' )
|
6
7
|
|
7
8
|
Spec::Runner.configure do |config|
|
8
9
|
config.mock_with RR::Adapters::Rspec
|
9
10
|
end
|
10
11
|
|
11
12
|
# monkey patch to get at osc core to send messages
|
12
|
-
class
|
13
|
+
class TuioClient
|
13
14
|
def osc
|
14
15
|
@osc
|
15
16
|
end
|
@@ -29,5 +30,5 @@ def setup_server
|
|
29
30
|
stub(socket).bind("", 3333)
|
30
31
|
stub(UDPSocket).new { socket }
|
31
32
|
|
32
|
-
@server =
|
33
|
+
@server = TuioClient.new
|
33
34
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# require File.join( File.dirname(__FILE__) , '..', 'spec_helper' )
|
2
|
+
#
|
3
|
+
# class TuioContainer
|
4
|
+
# # we want to be able to instantiate this class for testing
|
5
|
+
# def self.abstract?
|
6
|
+
# false
|
7
|
+
# end
|
8
|
+
# end
|
9
|
+
#
|
10
|
+
# describe TuioContainer do
|
11
|
+
# before :each do
|
12
|
+
# @session_id = 42
|
13
|
+
# @x_pos = 0.8
|
14
|
+
# @y_pos = 0.3
|
15
|
+
# @tc = TuioContainer.new( @session_id, @x_pos, @y_pos )
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# describe "in general" do
|
19
|
+
# it "should know it's session id" do
|
20
|
+
# @tc.session_id.should == @session_id
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# it "should know it's x position" do
|
24
|
+
# @tc.x_pos.should == @x_pos
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# it "should know its y position" do
|
28
|
+
# @tc.y_pos.should == @y_pos
|
29
|
+
# end
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# describe "updates" do
|
33
|
+
# before :each do
|
34
|
+
# @x_pos2 = 0.7
|
35
|
+
# @y_pos2 = 0.4
|
36
|
+
# @x_speed = 0.1
|
37
|
+
# @y_speed = 0.1
|
38
|
+
# @motion_accel = 0.1
|
39
|
+
#
|
40
|
+
# @tc.update( @x_pos2, @y_pos2, @x_speed, @y_speed, @motion_accel )
|
41
|
+
# end
|
42
|
+
#
|
43
|
+
# it "should know it's new x position" do
|
44
|
+
# @tc.x_pos.should == @x_pos2
|
45
|
+
# end
|
46
|
+
#
|
47
|
+
# it "should know it's new y position" do
|
48
|
+
# @tc.y_pos.should == @y_pos2
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# it "should know it's x speed" do
|
52
|
+
# @tc.x_speed.should == @x_speed
|
53
|
+
# end
|
54
|
+
#
|
55
|
+
# it "should know it's y speed" do
|
56
|
+
# @tc.y_speed.should == @y_speed
|
57
|
+
# end
|
58
|
+
#
|
59
|
+
# it "should know it's motion acceleration" do
|
60
|
+
# @tc.motion_accel.should == @motion_accel
|
61
|
+
# end
|
62
|
+
#
|
63
|
+
# it "should know the path it's traveled" do
|
64
|
+
# first = @tc.path.first
|
65
|
+
# second = @tc.path.last
|
66
|
+
#
|
67
|
+
# first.x_pos.should == 0.8
|
68
|
+
# first.y_pos.should == 0.3
|
69
|
+
#
|
70
|
+
# second.x_pos.should == 0.7
|
71
|
+
# second.y_pos.should == 0.4
|
72
|
+
# end
|
73
|
+
# end
|
74
|
+
# end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.join( File.dirname(__FILE__) , '..', 'spec_helper' )
|
2
|
+
|
3
|
+
describe TuioCursor do
|
4
|
+
before :each do
|
5
|
+
@args1 = [
|
6
|
+
@session_id = 42,
|
7
|
+
@x_pos = 0.8,
|
8
|
+
@y_pos = 0.4,
|
9
|
+
]
|
10
|
+
@tc = TuioCursor.new( *@args1 )
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "update" do
|
14
|
+
before :each do
|
15
|
+
@args2 = [
|
16
|
+
@x_pos2 = 0.23,
|
17
|
+
@y_pos2 = 0.54,
|
18
|
+
@x_speed = 0.01,
|
19
|
+
@y_speed = 0.03,
|
20
|
+
@motion_accel = 0.02
|
21
|
+
]
|
22
|
+
@tc.update( *@args2 )
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should it is equal to some arguments" do
|
26
|
+
@tc.args_equal?( [@session_id, @x_pos, @y_pos] )
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require File.join( File.dirname(__FILE__) , '..', 'spec_helper' )
|
2
|
+
|
3
|
+
describe TuioObject do
|
4
|
+
before :each do
|
5
|
+
@args1 = [
|
6
|
+
@session_id = 42,
|
7
|
+
@fiducial_id = 1,
|
8
|
+
@x_pos = 0.8,
|
9
|
+
@y_pos = 0.4,
|
10
|
+
@angle = 1
|
11
|
+
]
|
12
|
+
@to = TuioObject.new( *@args1 )
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "in general" do
|
16
|
+
it "should know it's session id" do
|
17
|
+
@to.session_id.should == @session_id
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should know it's fiducial id" do
|
21
|
+
@to.fiducial_id.should == @fiducial_id
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should know it's x position" do
|
25
|
+
@to.x_pos.should == @x_pos
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should know it's y postion" do
|
29
|
+
@to.y_pos.should == @y_pos
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should know it's angle" do
|
33
|
+
@to.angle.should == @angle
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "on update" do
|
38
|
+
before :each do
|
39
|
+
@args2 = [
|
40
|
+
@x_pos2 = 0.7,
|
41
|
+
@y_pos2 = 0.4,
|
42
|
+
@angle2 = 1.1,
|
43
|
+
@x_speed = 0.1,
|
44
|
+
@y_speed = 0.2,
|
45
|
+
@rotation_speed = 0.11,
|
46
|
+
@motion_accel = 0.12,
|
47
|
+
@rotation_accel = 0.13
|
48
|
+
]
|
49
|
+
|
50
|
+
@to.update( *@args2 )
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should be able to compare it's args" do
|
54
|
+
@to.args_equal?( [
|
55
|
+
@session_id,
|
56
|
+
@fiducial_id,
|
57
|
+
@x_pos2,
|
58
|
+
@y_pos2,
|
59
|
+
@angle2,
|
60
|
+
@x_speed,
|
61
|
+
@y_speed,
|
62
|
+
@rotation_speed,
|
63
|
+
@motion_accel,
|
64
|
+
@rotation_accel
|
65
|
+
]).should be_true
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should know it's new x position" do
|
69
|
+
@to.x_pos.should == @x_pos2
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should know it's new y position" do
|
73
|
+
@to.y_pos.should == @y_pos2
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should know it's new angle" do
|
77
|
+
@to.angle.should == @angle2
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should know it's x speed" do
|
81
|
+
@to.x_speed.should == @x_speed
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should know it's y speed" do
|
85
|
+
@to.y_speed.should == @y_speed
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should know it's rotation speed" do
|
89
|
+
@to.rotation_speed.should == @rotation_speed
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should know it's rotation accel" do
|
93
|
+
@to.rotation_accel.should == @rotation_accel
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.join( File.dirname(__FILE__) , '..', 'spec_helper' )
|
2
|
+
|
3
|
+
describe TuioPoint do
|
4
|
+
before :each do
|
5
|
+
@location1 = [0.1, 0.1]
|
6
|
+
@location2 = [0.1, 0.21]
|
7
|
+
|
8
|
+
@point1 = TuioPoint.new( *@location1 )
|
9
|
+
@point2 = TuioPoint.new( *@location2 )
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "in general" do
|
13
|
+
it "should know the distance to another point" do
|
14
|
+
# not a wonderful test, but a sanity check
|
15
|
+
@point1.distance_to( @point2 ).should be_close( 0.11, 0.00001 )
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should know the angle to another point" do
|
19
|
+
# not a wonderful test, but a sanity check
|
20
|
+
@point1.radians_to( @point2 ).should be_close( 1.5707963, 0.00001 )
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should know when it was last updated" do
|
24
|
+
@point1.should respond_to(:updated_at)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should know if it is equal to another point" do
|
28
|
+
@other_point = TuioPoint.new( *@location1 )
|
29
|
+
|
30
|
+
@point1.should be_eql( @other_point )
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "updates" do
|
35
|
+
before :each do
|
36
|
+
@point1.updated_at = Time.now
|
37
|
+
|
38
|
+
@point1.update( *@location2 )
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should clear the updated at time" do
|
42
|
+
@point1.updated_at.should == nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aberant-tuio-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- aberant
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-04-05 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -25,9 +25,23 @@ extra_rdoc_files:
|
|
25
25
|
files:
|
26
26
|
- README.rdoc
|
27
27
|
- VERSION.yml
|
28
|
+
- lib/core_ext
|
29
|
+
- lib/core_ext/float.rb
|
30
|
+
- lib/core_ext/object.rb
|
31
|
+
- lib/my_environment.rb
|
28
32
|
- lib/tuio_client.rb
|
33
|
+
- lib/tuio_container.rb
|
34
|
+
- lib/tuio_cursor.rb
|
35
|
+
- lib/tuio_object.rb
|
36
|
+
- lib/tuio_point.rb
|
37
|
+
- spec/integration
|
38
|
+
- spec/integration/tuio_event_spec.rb
|
29
39
|
- spec/spec_helper.rb
|
30
|
-
- spec/
|
40
|
+
- spec/unit
|
41
|
+
- spec/unit/tuio_container_spec.rb
|
42
|
+
- spec/unit/tuio_cursor_spec.rb
|
43
|
+
- spec/unit/tuio_object_spec.rb
|
44
|
+
- spec/unit/tuio_point_spec.rb
|
31
45
|
- LICENSE
|
32
46
|
has_rdoc: true
|
33
47
|
homepage: http://github.com/aberant/tuio-ruby
|
data/spec/tuio_event_spec.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
-
|
3
|
-
describe "tuio objects" do
|
4
|
-
before :each do
|
5
|
-
setup_server
|
6
|
-
end
|
7
|
-
|
8
|
-
it 'should update tracking' do
|
9
|
-
send_message( '/tuio/2Dobj', "set", 49, 25, 0.38, 0.35, 3.14, 0.0, 0.0, 0.0, 0.0, 0.0 )
|
10
|
-
|
11
|
-
@server.tuio_objects.size.should == 1
|
12
|
-
@server.tuio_objects[49][:class_id].should == 25
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'should only keep alive the objects the client says are alive' do
|
16
|
-
send_message( '/tuio/2Dobj', "set", 49, 25, 0.38, 0.35, 3.14, 0.0, 0.0, 0.0, 0.0, 0.0 )
|
17
|
-
send_message( '/tuio/2Dobj', "set", 51, 26, 0.12, 0.50, 3.14, 0.0, 0.0, 0.0, 0.0, 0.0 )
|
18
|
-
|
19
|
-
send_message( '/tuio/2Dobj', "alive", 49)
|
20
|
-
|
21
|
-
@server.tuio_objects.size.should == 1
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
describe "tuio_cursors" do
|
27
|
-
before :each do
|
28
|
-
setup_server
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'should update tracking' do
|
32
|
-
send_message( '/tuio/2Dcur', "set", 22, 0.38, 0.35, 0.0, 0.0, 0.0 )
|
33
|
-
|
34
|
-
@server.tuio_cursors.size.should == 1
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'should update tracking for multiples' do
|
38
|
-
send_message( '/tuio/2Dcur', "set", 22, 0.38, 0.35, 0.0, 0.0, 0.0 )
|
39
|
-
send_message( '/tuio/2Dcur', "set", 27, 0.12, 0.50, 0.0, 0.0, 0.0 )
|
40
|
-
|
41
|
-
|
42
|
-
@server.tuio_cursors.size.should == 2
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'should only keep alive the cursors the client says are alive' do
|
46
|
-
send_message( '/tuio/2Dcur', "set", 22, 0.38, 0.35, 0.0, 0.0, 0.0 )
|
47
|
-
send_message( '/tuio/2Dcur', "set", 27, 0.12, 0.50, 0.0, 0.0, 0.0 )
|
48
|
-
|
49
|
-
send_message( '/tuio/2Dcur', "alive", 22)
|
50
|
-
|
51
|
-
@server.tuio_cursors.size.should == 1
|
52
|
-
@server.tuio_cursors[22][:session_id].should == 22
|
53
|
-
|
54
|
-
end
|
55
|
-
end
|