phidgets-ffi 0.0.5 → 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.
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
@@ -0,0 +1,56 @@
1
+ module Phidgets
2
+ module FFI
3
+
4
+ attach_function :CPhidgetStepper_create, [:phid], :int
5
+ attach_function :CPhidgetStepper_getInputCount, [:phid, :pointer], :int
6
+ attach_function :CPhidgetStepper_getInputState, [:phid, :int, :pointer], :int
7
+ attach_function :CPhidgetStepper_getMotorCount, [:phid, :pointer], :int
8
+ attach_function :CPhidgetStepper_getAcceleration, [:phid, :int, :pointer], :int
9
+ attach_function :CPhidgetStepper_setAcceleration, [:phid, :int, :double], :int
10
+ attach_function :CPhidgetStepper_getAccelerationMax, [:phid, :int, :pointer], :int
11
+ attach_function :CPhidgetStepper_getAccelerationMin, [:phid, :int, :pointer], :int
12
+ attach_function :CPhidgetStepper_getVelocityLimit, [:phid, :int, :pointer], :int
13
+ attach_function :CPhidgetStepper_setVelocityLimit, [:phid, :int, :double], :int
14
+ attach_function :CPhidgetStepper_getVelocity, [:phid, :int, :pointer], :int
15
+ attach_function :CPhidgetStepper_getVelocityMax, [:phid, :int, :pointer], :int
16
+ attach_function :CPhidgetStepper_getVelocityMin, [:phid, :int, :pointer], :int
17
+ attach_function :CPhidgetStepper_getTargetPosition, [:phid, :int, :pointer], :int
18
+ attach_function :CPhidgetStepper_setTargetPosition, [:phid, :int, :long_long], :int
19
+ attach_function :CPhidgetStepper_getCurrentPosition, [:phid, :int, :pointer], :int
20
+ attach_function :CPhidgetStepper_setCurrentPosition, [:phid, :int, :long_long], :int
21
+ attach_function :CPhidgetStepper_getPositionMax, [:phid, :int, :long_long], :int
22
+ attach_function :CPhidgetStepper_getPositionMin, [:phid, :int, :long_long], :int
23
+ attach_function :CPhidgetStepper_getCurrentLimit, [:phid, :int, :pointer], :int
24
+ attach_function :CPhidgetStepper_setCurrentLimit, [:phid, :int, :double], :int
25
+ attach_function :CPhidgetStepper_getCurrent, [:phid, :int, :pointer], :int
26
+ attach_function :CPhidgetStepper_getCurrentMax, [:phid, :int, :pointer], :int
27
+ attach_function :CPhidgetStepper_getCurrentMin, [:phid, :int, :pointer], :int
28
+ attach_function :CPhidgetStepper_getEngaged, [:phid, :int, :pointer], :int
29
+ attach_function :CPhidgetStepper_setEngaged, [:phid, :int, :int], :int
30
+ attach_function :CPhidgetStepper_getStopped, [:phid, :int, :pointer], :int
31
+
32
+ callback :CPhidgetStepper_set_OnInputChange_Callback, [:phid, :user_ptr, :int, :int], :int
33
+ attach_function :CPhidgetStepper_set_OnInputChange_Handler, [:phid, :CPhidgetStepper_set_OnInputChange_Callback, :user_ptr], :int
34
+
35
+ callback :CPhidgetStepper_set_OnVelocityChange_Callback, [:phid, :user_ptr, :int, :double], :int
36
+ attach_function :CPhidgetStepper_set_OnVelocityChange_Handler, [:phid, :CPhidgetStepper_set_OnVelocityChange_Callback, :user_ptr], :int
37
+
38
+ callback :CPhidgetStepper_set_OnPositionChange_Callback, [:phid, :user_ptr, :int, :long_long], :int
39
+ attach_function :CPhidgetStepper_set_OnPositionChange_Handler, [:phid, :CPhidgetStepper_set_OnPositionChange_Callback, :user_ptr], :int
40
+
41
+ callback :CPhidgetStepper_set_OnCurrentChange_Callback, [:phid, :user_ptr, :int, :double], :int
42
+ attach_function :CPhidgetStepper_set_OnCurrentChange_Handler, [:phid, :CPhidgetStepper_set_OnCurrentChange_Callback, :user_ptr], :int
43
+
44
+ module CPhidgetStepper
45
+ def self.method_missing(method, *args, &block)
46
+ if ::Phidgets::FFI.respond_to?("CPhidgetStepper_#{method}".to_sym)
47
+ if (rs = ::Phidgets::FFI.send("CPhidgetStepper_#{method}".to_sym, *args, &block)) != 0
48
+ raise Phidgets::Error.exception_for(rs), Phidgets::FFI.error_description(rs)
49
+ end
50
+ else
51
+ super(method, *args, &block)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,42 @@
1
+ module Phidgets
2
+ module FFI
3
+
4
+ TemperatureSensorThermocoupleTypes = enum(
5
+ :thermocouple_type_k_type, 1,
6
+ :thermocouple_type_j_type,
7
+ :thermocouple_type_e_type,
8
+ :thermocouple_type_t_type
9
+ )
10
+
11
+ attach_function :CPhidgetTemperatureSensor_create, [:phid], :int
12
+ attach_function :CPhidgetTemperatureSensor_getTemperatureInputCount, [:phid, :pointer], :int
13
+ attach_function :CPhidgetTemperatureSensor_getTemperature, [:phid, :int, :pointer], :int
14
+ attach_function :CPhidgetTemperatureSensor_getTemperatureMax, [:phid, :int, :pointer], :int
15
+ attach_function :CPhidgetTemperatureSensor_getTemperatureMin, [:phid, :int, :pointer], :int
16
+ attach_function :CPhidgetTemperatureSensor_getTemperatureChangeTrigger, [:phid, :int, :pointer], :int
17
+ attach_function :CPhidgetTemperatureSensor_setTemperatureChangeTrigger, [:phid, :int, :double], :int
18
+ attach_function :CPhidgetTemperatureSensor_getPotential, [:phid, :int, :pointer], :int
19
+ attach_function :CPhidgetTemperatureSensor_getPotentialMax, [:phid, :int, :pointer], :int
20
+ attach_function :CPhidgetTemperatureSensor_getPotentialMin, [:phid, :int, :pointer], :int
21
+ attach_function :CPhidgetTemperatureSensor_getAmbientTemperature, [:phid, :pointer], :int
22
+ attach_function :CPhidgetTemperatureSensor_getAmbientTemperatureMax, [:phid, :pointer], :int
23
+ attach_function :CPhidgetTemperatureSensor_getAmbientTemperatureMin, [:phid, :pointer], :int
24
+ attach_function :CPhidgetTemperatureSensor_getThermocoupleType, [:phid, :int, :pointer], :int
25
+ attach_function :CPhidgetTemperatureSensor_setThermocoupleType, [:phid, :int, TemperatureSensorThermocoupleTypes], :int
26
+
27
+ callback :CPhidgetTemperatureSensor_set_OnTemperatureChange_Callback, [:phid, :user_ptr, :int, :double], :int
28
+ attach_function :CPhidgetTemperatureSensor_set_OnTemperatureChange_Handler, [:phid, :CPhidgetTemperatureSensor_set_OnTemperatureChange_Callback, :user_ptr], :int
29
+
30
+ module CPhidgetTemperatureSensor
31
+ def self.method_missing(method, *args, &block)
32
+ if ::Phidgets::FFI.respond_to?("CPhidgetTemperatureSensor_#{method}".to_sym)
33
+ if (rs = ::Phidgets::FFI.send("CPhidgetTemperatureSensor_#{method}".to_sym, *args, &block)) != 0
34
+ raise Phidgets::Error.exception_for(rs), Phidgets::FFI.error_description(rs)
35
+ end
36
+ else
37
+ super(method, *args, &block)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,55 @@
1
+ module Phidgets
2
+ module FFI
3
+
4
+ TextLCDScreenSizes = enum(
5
+ :screen_size_none, 1,
6
+ :screen_size_1x8,
7
+ :screen_size_2x8,
8
+ :screen_size_1x16,
9
+ :screen_size_2x16,
10
+ :screen_size_4x16,
11
+ :screen_size_2x20,
12
+ :screen_size_4x20,
13
+ :screen_size_2x24,
14
+ :screen_size_1x40,
15
+ :screen_size_2x40,
16
+ :screen_size_4x40,
17
+ :screen_size_unknown
18
+ )
19
+
20
+ attach_function :CPhidgetTextLCD_create, [:phid], :int
21
+ attach_function :CPhidgetTextLCD_getRowCount, [:phid, :pointer], :int
22
+ attach_function :CPhidgetTextLCD_getColumnCount, [:phid, :pointer], :int
23
+ attach_function :CPhidgetTextLCD_getBacklight, [:phid, :pointer], :int
24
+ attach_function :CPhidgetTextLCD_setBacklight, [:phid, :int], :int
25
+ attach_function :CPhidgetTextLCD_getBrightness, [:phid, :pointer], :int
26
+ attach_function :CPhidgetTextLCD_setBrightness, [:phid, :int], :int
27
+ attach_function :CPhidgetTextLCD_getContrast, [:phid, :pointer], :int
28
+ attach_function :CPhidgetTextLCD_setContrast, [:phid, :int], :int
29
+ attach_function :CPhidgetTextLCD_getCursorOn, [:phid, :pointer], :int
30
+ attach_function :CPhidgetTextLCD_setCursorOn, [:phid, :int], :int
31
+ attach_function :CPhidgetTextLCD_getCursorBlink, [:phid, :pointer], :int
32
+ attach_function :CPhidgetTextLCD_setCursorBlink, [:phid, :int], :int
33
+ attach_function :CPhidgetTextLCD_setCustomCharacter, [:phid, :int, :int, :int], :int
34
+ attach_function :CPhidgetTextLCD_setDisplayCharacter, [:phid, :int, :int, :uchar], :int
35
+ attach_function :CPhidgetTextLCD_setDisplayString, [:phid, :int, :pointer], :int
36
+ attach_function :CPhidgetTextLCD_getScreenCount, [:phid, :pointer], :int
37
+ attach_function :CPhidgetTextLCD_getScreen, [:phid, :pointer], :int
38
+ attach_function :CPhidgetTextLCD_setScreen, [:phid, :int], :int
39
+ attach_function :CPhidgetTextLCD_getScreenSize, [:phid, :pointer], :int
40
+ attach_function :CPhidgetTextLCD_setScreenSize, [:phid, TextLCDScreenSizes], :int
41
+ attach_function :CPhidgetTextLCD_initialize, [:phid], :int
42
+
43
+ module CPhidgetTextLCD
44
+ def self.method_missing(method, *args, &block)
45
+ if ::Phidgets::FFI.respond_to?("CPhidgetTextLCD_#{method}".to_sym)
46
+ if (rs = ::Phidgets::FFI.send("CPhidgetTextLCD_#{method}".to_sym, *args, &block)) != 0
47
+ raise Phidgets::Error.exception_for(rs), Phidgets::FFI.error_description(rs)
48
+ end
49
+ else
50
+ super(method, *args, &block)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,148 @@
1
+ module Phidgets
2
+
3
+ # This class represents a PhidgetFrequencyCounter.
4
+ class FrequencyCounter
5
+
6
+ Klass = Phidgets::FFI::CPhidgetFrequencyCounter
7
+ include Phidgets::Common
8
+
9
+ # Collection of frequency counter inputs
10
+ # @return [FrequencyCounterInputs]
11
+ attr_reader :inputs
12
+
13
+ attr_reader :attributes
14
+
15
+ # The attributes of a PhidgetFrequencyCounter
16
+ def attributes
17
+ super.merge({
18
+ :inputs => inputs.size,
19
+ })
20
+ end
21
+
22
+ # Sets an count handler callback function. This is called when ticks are counted on an frequency counter input, or when the timeout expires
23
+ #
24
+ # @param [String] obj Object to pass to the callback function. This is optional.
25
+ # @param [Proc] Block When the callback is executed, the device and object are yielded to this block.
26
+ # @example
27
+ # fc.on_count do |device, input, time, count, obj|
28
+ # puts "Channel #{input.index}: #{count} pulses in #{time} microseconds"
29
+ # end
30
+ # As this runs in it's own thread, be sure that all errors are properly handled or the thread will halt and not fire any more.
31
+ # @return [Boolean] returns true or raises an error
32
+ def on_count(obj=nil, &block)
33
+ @on_count_obj = obj
34
+ @on_count = Proc.new { |device, obj_ptr, index, time, counts|
35
+ yield self, @inputs[index], time, counts, object_for(obj_ptr)
36
+ }
37
+ Klass.set_OnCount_Handler(@handle, @on_count, pointer_for(obj))
38
+ end
39
+
40
+
41
+ # This class represents a frequency counter input for a PhidgetFrequencyCounter. All the properties of a frequency counter input are stored and modified in this class.
42
+ class FrequencyCounterInputs
43
+ Klass = Phidgets::FFI::CPhidgetFrequencyCounter
44
+
45
+ private
46
+ def initialize(handle, index)
47
+ @handle, @index = handle, index.to_i
48
+ end
49
+
50
+ public
51
+
52
+ # @return [Integer] returns index of the frequency counter input, or raises an error.
53
+ def index
54
+ @index
55
+ end
56
+
57
+ # @return [Boolean] returns the enabled state of a frequency counter input, or raises an error.
58
+ def enabled
59
+ ptr = ::FFI::MemoryPointer.new(:int)
60
+ Klass.getEnabled(@handle, @index, ptr)
61
+ (ptr.get_int(0) == 0) ? false : true
62
+ end
63
+
64
+ # Sets the enabled state of a frequency counter input, or raises an error.
65
+ # @param [Boolean] new_state new state
66
+ # @return [Boolean] returns enabled state of a frequency counter input, or raises an error.
67
+ def enabled=(new_state)
68
+ tmp = new_state ? 1 : 0
69
+ Klass.setEnabled(@handle, @index, tmp)
70
+ new_state
71
+ end
72
+
73
+ # @return [Phidgets::FFI::FrequencyCounterFilterTypes] returns the filter type of the frequency counter input, or raises an error.
74
+ def filter_type
75
+ ptr = ::FFI::MemoryPointer.new(:int)
76
+ Klass.getFilter(@handle, @index, ptr)
77
+ Phidgets::FFI::FrequencyCounterFilterTypes[ptr.get_int(0)]
78
+ end
79
+
80
+ # Sets the filter type of the frequency counter input, or raises an error.
81
+ # @param [Phidgets::FFI::FrequencyCounterFilterTypes] new_filter new filter
82
+ # @return [Phidgets::FFI::FrequencyCounterFilterTypes] returns the filter type of the frequency counter input, or raises an error.
83
+ def filter_type=(new_filter)
84
+ ptr = ::FFI::MemoryPointer.new(:int)
85
+ Klass.setFilter(@handle, @index, Phidgets::FFI::FrequencyCounterFilterTypes[new_filter])
86
+ new_filter
87
+ end
88
+
89
+ # @return [Integer] returns the measured frequency of the frequency counter input, in Hz, or raises an error.
90
+ def frequency
91
+ ptr = ::FFI::MemoryPointer.new(:double)
92
+ Klass.getFrequency(@handle, @index, ptr)
93
+ ptr.get_double(0)
94
+ end
95
+
96
+ # @return [Integer] returns the timeout for the frequency counter input, in microseconds, or raises an error.
97
+ def timeout
98
+ ptr = ::FFI::MemoryPointer.new(:int)
99
+ Klass.getTimeout(@handle, @index, ptr)
100
+ ptr.get_int(0)
101
+ end
102
+
103
+ # Sets the timeout for the frequency counter input, in microseconds, or raises an error.
104
+ # @param [Integer] new_timeout new timeout
105
+ # @return [Integer] returns timeout of the frequency counter input, or raises an error.
106
+ def timeout=(new_timeout)
107
+ Klass.setTimeout(@handle, @index, new_timeout.to_i)
108
+ new_timeout.to_i
109
+ end
110
+
111
+ # @return [Integer] returns the number of ticks counted since last reset, or raises an error.
112
+ def total_count
113
+ ptr = ::FFI::MemoryPointer.new(:long)
114
+ Klass.getTotalCount(@handle, @index, ptr)
115
+ ptr.get_long(0)
116
+ end
117
+
118
+ # @return [Integer] returns the total time since last reset, in microseconds, or raises an error.
119
+ def total_time
120
+ ptr = ::FFI::MemoryPointer.new(:long_long)
121
+ Klass.getTotalTime(@handle, @index, ptr)
122
+ ptr.get_long_long(0)
123
+ end
124
+
125
+ end #FrequencyCounterInputs
126
+
127
+ private
128
+
129
+ def load_device_attributes
130
+ load_inputs
131
+ end
132
+
133
+ def load_inputs
134
+ ptr = ::FFI::MemoryPointer.new(:int)
135
+ Klass.getFrequencyInputCount(@handle, ptr)
136
+
137
+ @inputs = []
138
+ ptr.get_int(0).times do |i|
139
+ @inputs << FrequencyCounterInputs.new(@handle, i)
140
+ end
141
+ end
142
+
143
+ def remove_specific_event_handlers
144
+ Klass.set_OnCount_Handler(@handle, nil, nil)
145
+ end
146
+ end
147
+
148
+ end
@@ -0,0 +1,181 @@
1
+ module Phidgets
2
+
3
+ # This class represents a PhidgetGPS.
4
+ class GPS
5
+
6
+ Klass = Phidgets::FFI::CPhidgetGPS
7
+ include Phidgets::Common
8
+
9
+ # This represents the GPS date structure, in UTC
10
+ #
11
+ # Examples:
12
+ #
13
+ # puts gps.date[:year]
14
+ # puts gps.date[:month]
15
+ # puts gps.date[:date]
16
+ class GPS_date < ::FFI::Struct
17
+
18
+ # Day
19
+ # @return [Integer] returns the day
20
+ attr_reader :day
21
+
22
+ # Month
23
+ # @return [Integer] returns the month
24
+ attr_reader :month
25
+
26
+ # Milliseconds
27
+ # @return [Integer] returns the milliseconds
28
+ attr_reader :year
29
+
30
+ layout :day, :short,
31
+ :month, :short,
32
+ :year, :short
33
+ end
34
+
35
+
36
+ # This represents the GPS time structure, in UTC
37
+ #
38
+ # Examples:
39
+ #
40
+ # puts gps.time[:hours]
41
+ # puts gps.time[:minutes]
42
+ # puts gps.time[:seconds]
43
+ # puts gps.time[:milliseconds]
44
+ class GPS_time < ::FFI::Struct
45
+
46
+ # Milliseconds
47
+ # @return [Integer] returns the milliseconds
48
+ attr_reader :milliseconds
49
+
50
+ # Seconds
51
+ # @return [Integer] returns the seconds
52
+ attr_reader :seconds
53
+
54
+ # Minutes
55
+ # @return [Integer] returns the minutes
56
+ attr_reader :minutes
57
+
58
+ # Hours
59
+ # @return [Integer] returns the hours
60
+ attr_reader :hours
61
+
62
+ layout :milliseconds, :short,
63
+ :seconds, :short,
64
+ :minutes, :short,
65
+ :hours, :short
66
+ end
67
+
68
+ attr_reader :attributes
69
+
70
+ # The attributes of a PhidgetGPS
71
+ def attributes
72
+ super.merge({
73
+
74
+ })
75
+ end
76
+
77
+ # Sets an position fix status change handler callback function. This is called when the position fix status changes.
78
+ #
79
+ # @param [String] obj Object to pass to the callback function. This is optional.
80
+ # @param [Proc] Block When the callback is executed, the device and object are yielded to this block.
81
+ # @example
82
+ # gps.on_position_fix_status_change do |device, fix_status, obj|
83
+ # puts "Position fix status changed to: #{fix_status}"
84
+ # end
85
+ # As this runs in it's own thread, be sure that all errors are properly handled or the thread will halt and not fire any more.
86
+ # @return [Boolean] returns true or raises an error
87
+ def on_position_fix_status_change(obj=nil, &block)
88
+ @on_position_fix_status_change_obj = obj
89
+ @on_position_fix_status_change = Proc.new { |device, obj_ptr, fix_status|
90
+ yield self, (fix_status == 0 ? false : true), object_for(obj_ptr)
91
+ }
92
+ Klass.set_OnPositionFixStatusChange_Handler(@handle, @on_position_fix_status_change, pointer_for(obj))
93
+ end
94
+
95
+ # Sets position change handler callback function. This is called when the latitude, longitude, or altitude changes.
96
+ #
97
+ # @param [String] obj Object to pass to the callback function. This is optional.
98
+ # @param [Proc] Block When the callback is executed, the device and object are yielded to this block.
99
+ # @example
100
+ # gps.on_position_change do |device, lat, long, alt, obj|
101
+ # puts "Latitude: #{lat} degrees, longitude: #{long} degrees, altitude: #{alt} m"
102
+ # end
103
+ # As this runs in it's own thread, be sure that all errors are properly handled or the thread will halt and not fire any more.
104
+ # @return [Boolean] returns true or raises an error
105
+ def on_position_change(obj=nil, &block)
106
+ @on_position_change_obj = obj
107
+ @on_position_change = Proc.new { |device, obj_ptr, lat, long, alt|
108
+ yield self, lat, long, alt, object_for(obj_ptr)
109
+ }
110
+ Klass.set_OnPositionChange_Handler(@handle, @on_position_change, pointer_for(obj))
111
+ end
112
+
113
+ # @return [Float] returns the latitude in degrees, or raises an error.
114
+ def latitude
115
+ ptr = ::FFI::MemoryPointer.new(:double)
116
+ Klass.getLatitude(@handle, ptr)
117
+ ptr.get_double(0)
118
+ end
119
+
120
+ # @return [Float] returns the longitude in degrees or raises an error.
121
+ def longitude
122
+ ptr = ::FFI::MemoryPointer.new(:double)
123
+ Klass.getLongitude(@handle, ptr)
124
+ ptr.get_double(0)
125
+ end
126
+
127
+ # @return [Float] returns the altitude in meters, or raises an error.
128
+ def altitude
129
+ ptr = ::FFI::MemoryPointer.new(:double)
130
+ Klass.getAltitude(@handle, ptr)
131
+ ptr.get_double(0)
132
+ end
133
+
134
+ # @return [Float] returns the heading in degrees or raises an error.
135
+ def heading
136
+ ptr = ::FFI::MemoryPointer.new(:double)
137
+ Klass.getHeading(@handle, ptr)
138
+ ptr.get_double(0)
139
+ end
140
+
141
+ # @return [Float] returns the velocity in km/h, in or raises an error.
142
+ def velocity
143
+ ptr = ::FFI::MemoryPointer.new(:double)
144
+ Klass.getVelocity(@handle, ptr)
145
+ ptr.get_double(0)
146
+ end
147
+
148
+ # @return [GPS_date] returns the date in UTC, in or raises an error.
149
+ def date
150
+ ptr = ::FFI::MemoryPointer.new 6 #2 bytes for each short
151
+ Klass.getDate(@handle, ptr)
152
+ obj = GPS_date.new(ptr)
153
+ end
154
+
155
+ # @return [GPS_time] returns the time in UTC, in or raises an error.
156
+ def time
157
+ ptr = ::FFI::MemoryPointer.new 8 #2 bytes for each short
158
+ Klass.getTime(@handle, ptr)
159
+ obj = GPS_time.new(ptr)
160
+ end
161
+
162
+ # @return [Boolean] returns state of the digital input, or raises an error.
163
+ def position_fix_status
164
+ ptr = ::FFI::MemoryPointer.new(:int)
165
+ Klass.getPositionFixStatus(@handle, ptr)
166
+ (ptr.get_int(0) == 0) ? false : true
167
+ end
168
+
169
+ private
170
+
171
+ def load_device_attributes
172
+
173
+ end
174
+
175
+ def remove_specific_event_handlers
176
+ Klass.set_OnPositionChange_Handler(@handle, nil, nil)
177
+ Klass.set_OnPositionFixStatusChange_Handler(@handle, nil, nil)
178
+ end
179
+ end
180
+
181
+ end