phidgets-ffi 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. data/.gitignore +3 -0
  2. data/LICENSE +1 -1
  3. data/README.rdoc +92 -42
  4. data/examples/accelerometer.rb +39 -0
  5. data/examples/advanced_servo.rb +94 -0
  6. data/examples/analog.rb +43 -0
  7. data/examples/bridge.rb +57 -0
  8. data/examples/dictionary.rb +46 -31
  9. data/examples/encoder.rb +59 -0
  10. data/examples/frequency_counter.rb +63 -0
  11. data/examples/gps.rb +91 -0
  12. data/examples/interface_kit_with_block.rb +68 -0
  13. data/examples/interface_kit_without_block.rb +60 -0
  14. data/examples/ir.rb +157 -0
  15. data/examples/led.rb +36 -0
  16. data/examples/manager.rb +16 -10
  17. data/examples/motor_control.rb +108 -0
  18. data/examples/{ffi → raw-ffi}/dictionary.rb +11 -1
  19. data/examples/{ffi → raw-ffi}/interface_kit.rb +19 -2
  20. data/examples/{ffi → raw-ffi}/library_version.rb +0 -0
  21. data/examples/{ffi → raw-ffi}/log.rb +0 -0
  22. data/examples/{ffi → raw-ffi}/manager.rb +6 -3
  23. data/examples/rfid.rb +63 -0
  24. data/examples/servo.rb +45 -30
  25. data/examples/spatial.rb +75 -0
  26. data/examples/stepper.rb +87 -0
  27. data/examples/temperature_sensor.rb +49 -0
  28. data/examples/text_lcd.rb +101 -0
  29. data/lib/phidgets-ffi.rb +34 -3
  30. data/lib/phidgets-ffi/accelerometer.rb +122 -0
  31. data/lib/phidgets-ffi/advanced_servo.rb +304 -0
  32. data/lib/phidgets-ffi/analog.rb +111 -0
  33. data/lib/phidgets-ffi/bridge.rb +167 -0
  34. data/lib/phidgets-ffi/common.rb +506 -103
  35. data/lib/phidgets-ffi/dictionary.rb +136 -23
  36. data/lib/phidgets-ffi/encoder.rb +196 -0
  37. data/lib/phidgets-ffi/error.rb +8 -3
  38. data/lib/phidgets-ffi/ffi/accelerometer.rb +30 -0
  39. data/lib/phidgets-ffi/ffi/advanced_servo.rb +73 -0
  40. data/lib/phidgets-ffi/ffi/analog.rb +29 -0
  41. data/lib/phidgets-ffi/ffi/bridge.rb +44 -0
  42. data/lib/phidgets-ffi/ffi/common.rb +51 -34
  43. data/lib/phidgets-ffi/ffi/constants.rb +3 -1
  44. data/lib/phidgets-ffi/ffi/dictionary.rb +25 -20
  45. data/lib/phidgets-ffi/ffi/encoder.rb +32 -0
  46. data/lib/phidgets-ffi/ffi/frequency_counter.rb +38 -0
  47. data/lib/phidgets-ffi/ffi/gps.rb +32 -0
  48. data/lib/phidgets-ffi/ffi/interface_kit.rb +26 -23
  49. data/lib/phidgets-ffi/ffi/ir.rb +50 -0
  50. data/lib/phidgets-ffi/ffi/led.rb +40 -0
  51. data/lib/phidgets-ffi/ffi/log.rb +7 -6
  52. data/lib/phidgets-ffi/ffi/manager.rb +35 -20
  53. data/lib/phidgets-ffi/ffi/motor_control.rb +66 -0
  54. data/lib/phidgets-ffi/ffi/rfid.rb +36 -0
  55. data/lib/phidgets-ffi/ffi/servo.rb +16 -15
  56. data/lib/phidgets-ffi/ffi/spatial.rb +40 -0
  57. data/lib/phidgets-ffi/ffi/stepper.rb +56 -0
  58. data/lib/phidgets-ffi/ffi/temperature_sensor.rb +42 -0
  59. data/lib/phidgets-ffi/ffi/text_lcd.rb +55 -0
  60. data/lib/phidgets-ffi/frequency_counter.rb +148 -0
  61. data/lib/phidgets-ffi/gps.rb +181 -0
  62. data/lib/phidgets-ffi/interface_kit.rb +205 -92
  63. data/lib/phidgets-ffi/ir.rb +290 -0
  64. data/lib/phidgets-ffi/led.rb +112 -0
  65. data/lib/phidgets-ffi/log.rb +14 -2
  66. data/lib/phidgets-ffi/manager.rb +143 -26
  67. data/lib/phidgets-ffi/motor_control.rb +497 -0
  68. data/lib/phidgets-ffi/phidgets-ffi.rb +15 -2
  69. data/lib/phidgets-ffi/rfid.rb +220 -0
  70. data/lib/phidgets-ffi/servo.rb +103 -61
  71. data/lib/phidgets-ffi/spatial.rb +306 -0
  72. data/lib/phidgets-ffi/stepper.rb +370 -0
  73. data/lib/phidgets-ffi/temperature_sensor.rb +157 -0
  74. data/lib/phidgets-ffi/text_lcd.rb +298 -0
  75. data/lib/phidgets-ffi/version.rb +1 -1
  76. data/phidgets-ffi.gemspec +2 -2
  77. metadata +89 -76
  78. data/examples/ffi/servo.rb +0 -67
  79. data/examples/interface_kit.rb +0 -20
data/examples/led.rb ADDED
@@ -0,0 +1,36 @@
1
+ require 'rubygems'
2
+ require 'phidgets-ffi'
3
+
4
+ puts "Library Version: #{Phidgets::FFI.library_version}"
5
+
6
+ led = Phidgets::LED.new
7
+
8
+ puts "Wait for PhidgetLED to attached..."
9
+
10
+ #The following method runs when the PhidgetLED is attached to the system
11
+ led.on_attach do |device, obj|
12
+
13
+ puts "Device attributes: #{device.attributes} attached"
14
+ puts "Class: #{device.device_class}"
15
+ puts "Id: #{device.id}"
16
+ puts "Serial number: #{device.serial_number}"
17
+ puts "Version: #{device.version}"
18
+ puts "# LEDs: #{device.leds.size}"
19
+
20
+ device.leds.each do |i|
21
+ device.leds[i].brightness = 50
22
+ end
23
+
24
+ end
25
+
26
+ led.on_detach do |device, obj|
27
+ puts "#{device.attributes.inspect} detached"
28
+ end
29
+
30
+ led.on_error do |device, obj, code, description|
31
+ puts "Error #{code}: #{description}"
32
+ end
33
+
34
+ sleep 5
35
+
36
+ led.close
data/examples/manager.rb CHANGED
@@ -2,16 +2,22 @@ require 'rubygems'
2
2
  require 'phidgets-ffi'
3
3
 
4
4
  Phidgets::Manager.new do |manager|
5
- puts manager.devices.inspect
6
5
 
7
- manager.on_attach do |device_ptr|
8
- puts "Attaching #{device_ptr}"
9
- end
6
+ manager.devices.size.times do |i|
7
+ puts "Attached: #{Phidgets::Common.name(manager.devices[i])}, serial number: #{Phidgets::Common.serial_number(manager.devices[i])}"
8
+ end
9
+ puts ''
10
10
 
11
- manager.on_detach do |device_ptr|
12
- puts "Detaching #{device_ptr}"
13
- end
14
-
15
- puts "You have 20 seconds to plug/unplug USB devices and watch the callbacks execute"
16
- sleep 20
11
+ manager.on_attach do |device_ptr, obj|
12
+ puts "Attaching #{Phidgets::Common.name(device_ptr)}, serial number: #{Phidgets::Common.serial_number(device_ptr)}"
13
+
14
+ end
15
+
16
+ manager.on_detach do |device_ptr, obj|
17
+ puts "Detaching #{Phidgets::Common.name(device_ptr)}, serial number: #{Phidgets::Common.serial_number(device_ptr)}"
18
+
19
+ end
20
+
21
+ puts "You have 20 seconds to plug/unplug USB devices and watch the callbacks execute"
22
+ sleep 20
17
23
  end
@@ -0,0 +1,108 @@
1
+ require 'rubygems'
2
+ require 'phidgets-ffi'
3
+
4
+ puts "Library Version: #{Phidgets::FFI.library_version}"
5
+
6
+ mc = Phidgets::MotorControl.new
7
+
8
+ puts "Wait for PhidgetMotorControl to attached..."
9
+
10
+ mc.on_attach do |device, obj|
11
+ puts 'attach event'
12
+ puts "Device attributes: #{device.attributes} attached"
13
+ puts "Class: #{device.device_class}"
14
+ puts "Id: #{device.id}"
15
+ puts "Serial number: #{device.serial_number}"
16
+ puts "Version: #{device.version}"
17
+ puts "# Motors: #{device.motors.size}"
18
+ puts "# Inputs: #{device.inputs.size}"
19
+ puts "# Encoders: #{device.encoders.size}"
20
+ puts "# Sensors: #{device.sensors.size}"
21
+ end
22
+
23
+ mc.on_detach do |device, obj|
24
+ puts "#{device.attributes.inspect} detached"
25
+ end
26
+
27
+ mc.on_error do |device, obj, code, description|
28
+ #puts "Error #{code}: #{description}"
29
+ end
30
+
31
+
32
+ mc.on_input_change do |device, input, state|
33
+ puts "Digital Input #{input.index}'s state changed to #{state}"
34
+ end
35
+
36
+ =begin
37
+ mc.on_sensor_update do |device, sensor, value|
38
+ puts "Analog Sensor #{sensor.index}'s value is #{value}"
39
+ end
40
+ =end
41
+
42
+ mc.on_velocity_change do |device, motor, velocity|
43
+ puts "Motor #{motor.index}'s velocity changed to #{velocity}"
44
+ end
45
+
46
+ mc.on_current_change do |device, motor, current|
47
+ puts "Motor #{motor.index}'s current changed to #{current}"
48
+ end
49
+
50
+ =begin
51
+ mc.on_current_update do |device, motor, current|
52
+ puts "Motor #{motor.index}'s current is #{current}"
53
+ end
54
+ =end
55
+
56
+ =begin
57
+ mc.on_back_emf_update do |device, motor, voltage|
58
+ puts "Motor #{motor.index}'s back EMF is #{voltage}"
59
+ end
60
+ =end
61
+
62
+ mc.on_position_change do |device, encoder, time, position|
63
+ puts "Encoder #{encoder.index}'s position changed to #{position} in #{time}"
64
+ end
65
+
66
+ =begin
67
+ mc.on_position_update do |device, encoder, position|
68
+ puts "Encoder #{encoder.index}'s position is #{position}"
69
+ end
70
+ =end
71
+
72
+ sleep 5
73
+
74
+ if(mc.attached?)
75
+
76
+ if(mc.id.to_s == "motor_control_1motor")
77
+
78
+ mc.ratiometric = true
79
+
80
+ puts "Digital input: #{mc.inputs.inspect}"
81
+
82
+ puts "Encoder: #{mc.encoders.inspect}"
83
+
84
+ puts "Analog sensor: #{mc.sensors[0].inspect}"
85
+ puts "Analog sensor: #{mc.sensors[1].inspect}"
86
+
87
+ puts "Motor current: #{mc.motors[0].current}"
88
+
89
+ mc.motors[0].acceleration = (mc.motors[0].acceleration_max)/2
90
+ mc.motors[0].back_emf_sensing = true
91
+
92
+ end
93
+
94
+ puts "Motor acceleration min: #{mc.motors[0].acceleration_min}"
95
+ puts "Motor acceleration max: #{mc.motors[0].acceleration_max}"
96
+
97
+ sleep 1
98
+ 100.times do |i|
99
+ mc.motors[0].velocity = i
100
+ sleep 0.1
101
+
102
+ end
103
+
104
+ mc.motors[0].velocity = 0
105
+
106
+ sleep 2
107
+ end
108
+
@@ -25,6 +25,7 @@ ServerDisconnectedHandler = Proc.new { |dict, obj_ptr|
25
25
  ptr = FFI::MemoryPointer.new(:pointer)
26
26
  CPhidgetDictionary.create(ptr)
27
27
  dictionary = ptr.get_pointer(0)
28
+
28
29
  CPhidget_set_OnServerConnect_Handler(dictionary, ServerConnectedHandler, nil)
29
30
  CPhidget_set_OnServerDisconnect_Handler(dictionary, ServerDisconnectedHandler, nil)
30
31
  CPhidget_set_OnError_Handler(dictionary, ErrorHandler, nil)
@@ -32,7 +33,7 @@ CPhidget_set_OnError_Handler(dictionary, ErrorHandler, nil)
32
33
  server_status = FFI::MemoryPointer.new(:int)
33
34
  address = FFI::MemoryPointer.new(:string)
34
35
  port = FFI::MemoryPointer.new(:int)
35
- result = CPhidgetDictionary_openRemoteIP(dictionary, "Mactop.local", 5001, nil);
36
+ result = CPhidgetDictionary_openRemoteIP(dictionary, "localhost", 5001, nil);
36
37
  while server_status.get_int(0) != 1
37
38
  CPhidgetDictionary_getServerStatus(dictionary, server_status)
38
39
  end
@@ -42,18 +43,27 @@ CPhidgetDictionary_getServerAddress(dictionary, address, port)
42
43
  printf "Address: %s -- Port: %i \n", address.get_pointer(0).read_string, port.get_int(0)
43
44
 
44
45
  # Set some keys
46
+
45
47
  sleep 1
46
48
  CPhidgetDictionary_addKey(dictionary, "TEST1", "1234", 1)
47
49
  CPhidgetDictionary_addKey(dictionary, "TEST2", "5678", 1);
48
50
  CPhidgetDictionary_addKey(dictionary, "TEST3", "9012", 0);
49
51
  CPhidgetDictionary_addKey(dictionary, "TEST4", "3456", 1);
52
+
50
53
  sleep 2
54
+
51
55
  puts "Delete the 4th key...."
56
+
52
57
  sleep 1
58
+
53
59
  CPhidgetDictionary_removeKey(dictionary, "TEST4")
60
+
54
61
  sleep 2
62
+
55
63
  puts "Press any key to end"
56
64
  $stdin.getc
65
+
57
66
  CPhidgetDictionary_close(dictionary);
58
67
  CPhidgetDictionary_delete(dictionary);
68
+
59
69
  sleep 10
@@ -24,21 +24,38 @@ else
24
24
  ifkit = ifkit.get_pointer(0)
25
25
  end
26
26
 
27
- # Create an attachment and detachment handler
28
27
  AttachHandler = Proc.new { |device, ptr|
29
28
  print "Device attached: #{device_name_for(device)} (#{serial_number_for(device)})\n"
30
29
  }
31
30
  CPhidget_set_OnAttach_Handler(ifkit, AttachHandler, nil)
31
+
32
32
  DetachHandler = Proc.new { |device, ptr|
33
33
  print "Device detached: #{device_name_for(device)} (#{serial_number_for(device)})\n"
34
34
  }
35
35
  CPhidget_set_OnDetach_Handler(ifkit, DetachHandler, nil)
36
36
 
37
+ InputChangeHandler = Proc.new { |device, obj, ind, state|
38
+ print "Digital input #{ind} changed to #{(state == 0) ? false : true}\n"
39
+ }
40
+ CPhidgetInterfaceKit_set_OnInputChange_Handler(ifkit, InputChangeHandler, nil)
41
+
42
+ OutputChangeHandler = Proc.new { |device, obj, ind, state|
43
+ print "Digital output #{ind} changed to #{(state == 0) ? false : true}\n"
44
+ }
45
+ CPhidgetInterfaceKit_set_OnOutputChange_Handler(ifkit, OutputChangeHandler, nil)
46
+
47
+ SensorChangeHandler = Proc.new { |device, obj, ind, val|
48
+ print "Sensor #{ind} changed to #{val}\n"
49
+ }
50
+ CPhidgetInterfaceKit_set_OnSensorChange_Handler(ifkit, SensorChangeHandler, nil)
51
+
37
52
  CPhidget_open(ifkit, -1)
38
53
  CPhidget_waitForAttachment(ifkit, 10000)
39
54
 
55
+ puts Phidgets::Common.serial_number(ifkit)
56
+
40
57
  print "You have 20 seconds to attach/detach the interface kit. It should activate the callback handlers\n"
41
- sleep 20
58
+ sleep 10
42
59
 
43
60
  CPhidget_close(ifkit)
44
61
  CPhidget_delete(ifkit)
File without changes
File without changes
@@ -8,15 +8,18 @@ manager = ptr.get_pointer(0)
8
8
  CPhidgetManager.open(manager)
9
9
 
10
10
  sleep(1)
11
- devices_ptr, count = FFI::MemoryPointer.new(:pointer, 1), FFI::MemoryPointer.new(:int)
11
+ devices_ptr, count = FFI::MemoryPointer.new(:pointer, 70), FFI::MemoryPointer.new(:int)
12
12
  CPhidgetManager.getAttachedDevices(manager, devices_ptr, count)
13
+
13
14
  devices = devices_ptr.get_array_of_pointer(0, count.get_int(0))
14
15
 
15
16
  ptr1 = FFI::MemoryPointer.new(:string)
16
17
  ptr2 = FFI::MemoryPointer.new(:int)
17
- devices.each_with_index do |device, i|
18
- device = device.get_pointer(0)
19
18
 
19
+ count.get_int(0).times do |i|
20
+ device = devices[0].get_pointer(i*4) #On Mac OS X, it is i*4
21
+ # device = devices[0].get_pointer(i*4) #On Linux, it is i*8
22
+
20
23
  Common.getDeviceName(device, ptr1)
21
24
  name = ptr1.get_pointer(0).read_string
22
25
 
data/examples/rfid.rb ADDED
@@ -0,0 +1,63 @@
1
+ require 'rubygems'
2
+ require 'phidgets-ffi'
3
+
4
+ puts "Library Version: #{Phidgets::FFI.library_version}"
5
+
6
+ rfid = Phidgets::RFID.new
7
+
8
+ puts "Wait for PhidgetRFID to attached..."
9
+
10
+ #The following method runs when the PhidgetRFID is attached to the system
11
+ rfid.on_attach do |device, obj|
12
+
13
+ puts "Device attributes: #{device.attributes} attached"
14
+ puts "Class: #{device.device_class}"
15
+ puts "Id: #{device.id}"
16
+ puts "Serial number: #{device.serial_number}"
17
+ puts "# Digital Outputs: #{device.outputs.size}"
18
+
19
+ rfid.outputs[0].state = true
20
+ puts rfid.outputs.inspect
21
+
22
+ rfid.antenna = true
23
+ rfid.led = true
24
+ sleep 1
25
+
26
+ end
27
+
28
+ rfid.on_detach do |device, obj|
29
+ puts "#{device.attributes.inspect} detached"
30
+ end
31
+
32
+ rfid.on_error do |device, obj, code, description|
33
+ puts "Error #{code}: #{description}"
34
+ end
35
+
36
+ rfid.on_output_change do |device, output, state, obj|
37
+ puts "Output #{output.index}'s state has changed to #{state}"
38
+ end
39
+
40
+ rfid.on_tag do |device, tag, obj|
41
+ puts "Tag #{tag} detected"
42
+ end
43
+
44
+ rfid.on_tag_lost do |device, tag, obj|
45
+ puts "Tag #{tag} removed"
46
+ end
47
+
48
+ puts "Please insert a tag to read read ..."
49
+
50
+ sleep 3
51
+
52
+ if(rfid.attached?)
53
+ sleep 1
54
+
55
+ begin
56
+ puts "Tag present: #{rfid.tag_present}"
57
+ puts "Last tag: #{rfid.last_tag}"
58
+ rescue Phidgets::Error::UnknownVal => e
59
+ puts "Exception caught: #{e.message}"
60
+ end
61
+ end
62
+
63
+ rfid.close
data/examples/servo.rb CHANGED
@@ -2,35 +2,50 @@ require 'rubygems'
2
2
  require 'phidgets-ffi'
3
3
 
4
4
  puts "Library Version: #{Phidgets::FFI.library_version}"
5
- Phidgets::ServoController.new(-1) do |controller|
6
- puts "Device Attributes: #{controller.attributes.inspect}"
7
- servo = controller.servos[0]
8
- puts "Current Type: #{servo.type}"
9
- puts "Default Min/Max: #{servo.min}/#{servo.max}"
10
- puts "Device Name: #{controller.name}"
11
- puts "Device Type: #{controller.type}"
12
- puts "Device SN: #{controller.serial_number}"
13
- puts "Device Version: #{controller.version}"
14
-
15
- puts "Device Label: #{controller.label}"
16
- controller.on_change do |servo, position, obj|
17
- print "Moving servo #{servo.index} to #{position}\n"
18
- end
19
-
20
- controller.on_detach do |obj, data|
21
- print "Detached #{obj.type}\n"
22
- end
23
-
24
- controller.on_attach do |obj, data|
25
- print "Attached #{obj.type}\n"
26
- end
27
-
28
- max = servo.max
29
- 10.times do
30
- controller.wait_for_attachment
31
- servo.position = rand(max)
32
- sleep 0.5
33
- end
34
- servo.engaged = false
5
+
6
+ servo = Phidgets::Servo.new
7
+
8
+ puts "Wait for PhidgetServo to attached..."
9
+
10
+ #The following method runs when the PhidgetServo is attached to the system
11
+ servo.on_attach do |device, obj|
12
+
13
+ puts "Device attributes: #{device.attributes} attached"
14
+ puts "Class: #{device.device_class}"
15
+ puts "Id: #{device.id}"
16
+ puts "Serial number: #{device.serial_number}"
17
+ puts "Version: #{device.version}"
18
+ puts "# Servos: #{device.servos.size}"
19
+
20
+ device.servos[0].engaged = true
21
+ device.servos[0].type = Phidgets::FFI::ServoType[:default]
22
+ puts "Setting servo parameters: #{device.servos[0].set_servo_parameters(600, 2000, 120)}"
23
+ sleep 1
24
+
25
+ end
26
+
27
+ servo.on_detach do |device, obj|
28
+ puts "#{device.attributes.inspect} detached"
29
+ end
30
+
31
+ servo.on_error do |device, obj, code, description|
32
+ puts "Error #{code}: #{description}"
33
+ end
34
+
35
+ servo.on_position_change do |device, motor, position|
36
+ puts "Moving servo #{motor.index} to #{position}"
37
+ end
38
+
39
+ sleep 5
40
+
41
+ if servo.attached?
42
+ max = servo.servos[0].position_max
43
+ 3.times do
44
+ servo.servos[0].position = rand(max)
45
+ sleep 1
46
+ end
35
47
  end
36
48
 
49
+ servo.servos[0].engaged = false
50
+ sleep 1
51
+ servo.close
@@ -0,0 +1,75 @@
1
+ require 'rubygems'
2
+ require 'phidgets-ffi'
3
+
4
+ puts "Library Version: #{Phidgets::FFI.library_version}"
5
+
6
+ spatial = Phidgets::Spatial.new
7
+
8
+ puts "Wait for PhidgetSpatial to attached..."
9
+
10
+ #The following method runs when the PhidgetSpatial is attached to the system
11
+ spatial.on_attach do |device, obj|
12
+
13
+ puts "Device attributes: #{device.attributes} attached"
14
+ puts "Class: #{device.device_class}"
15
+ puts "Id: #{device.id}"
16
+ puts "Serial number: #{device.serial_number}"
17
+ puts "Version: #{device.version}"
18
+ puts "# Accelerometer Axes: #{device.accelerometer_axes.size}"
19
+ puts "# Compass Axes: #{device.compass_axes.size}"
20
+ puts "# Gyro Axes: #{device.gyro_axes.size}"
21
+
22
+ device.accelerometer_axes.size.times do |i|
23
+ puts "Acceleration Axis[#{i}]: #{device.accelerometer_axes[i].acceleration}"
24
+ puts "Acceleration Axis[#{i}] Min: #{device.accelerometer_axes[i].acceleration_min}"
25
+ puts "Acceleration Axis[#{i}] Max: #{device.accelerometer_axes[i].acceleration_max}"
26
+ end
27
+
28
+ device.compass_axes.size.times do |i|
29
+ #Even when there is a compass chip, sometimes there won't be valid data in the event.
30
+ begin
31
+ puts "Compass Axis[#{i}]: #{device.compass_axes[i].magnetic_field}"
32
+ rescue Phidgets::Error::UnknownVal => e
33
+ puts "Exception caught: #{e.message}"
34
+ end
35
+ puts "Compass Axis[#{i}] Min: #{device.compass_axes[i].magnetic_field_min}"
36
+ puts "Compass Axis[#{i}] Max: #{device.compass_axes[i].magnetic_field_max}"
37
+ end
38
+
39
+ device.gyro_axes.size.times do |i|
40
+ puts "Gyro Axis[#{i}]: #{device.gyro_axes[i].angular_rate}"
41
+ puts "Gyro Axis[#{i}] Min: #{device.gyro_axes[i].angular_rate_min}"
42
+ puts "Gyro Axis[#{i}] Max: #{device.gyro_axes[i].angular_rate_max}"
43
+ end
44
+
45
+ end
46
+
47
+ spatial.on_detach do |device, obj|
48
+ puts "#{device.attributes.inspect} detached"
49
+ end
50
+
51
+ spatial.on_error do |device, obj, code, description|
52
+ puts "Error #{code}: #{description}"
53
+ end
54
+
55
+ spatial.on_spatial_data do |device, acceleration, magnetic_field, angular_rate|
56
+ if acceleration.size > 0
57
+ puts "Acceleration: #{acceleration[0]}, #{acceleration[1]}, #{acceleration[2]}"
58
+ end
59
+
60
+ if magnetic_field.size > 0
61
+ puts "Magnetic field: #{magnetic_field[0]}, #{magnetic_field[1]}, #{magnetic_field[2]}"
62
+ end
63
+
64
+ if angular_rate.size > 0
65
+ puts "Angular rate: #{angular_rate[0]}, #{angular_rate[1]}, #{angular_rate[2]}"
66
+ end
67
+ end
68
+
69
+ sleep 2
70
+
71
+ if spatial.attached?
72
+ sleep 1
73
+ end
74
+
75
+ sleep 10