phidgets 0.1.3 → 1.0.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 (146) hide show
  1. checksums.yaml +4 -4
  2. data/History.txt +3 -0
  3. data/README.rdoc +32 -43
  4. data/Rakefile +4 -2
  5. data/bin/phidget +18 -72
  6. data/ext/phidgets/extconf.rb +5 -8
  7. data/ext/phidgets/phidgets.c +708 -173
  8. data/ext/phidgets/phidgets.h +54 -35
  9. data/ext/phidgets/phidgets_accelerometer.c +193 -109
  10. data/ext/phidgets/phidgets_bldc_motor.c +529 -0
  11. data/ext/phidgets/phidgets_capacitive_touch.c +302 -0
  12. data/ext/phidgets/phidgets_common.c +570 -315
  13. data/ext/phidgets/phidgets_current_input.c +229 -0
  14. data/ext/phidgets/phidgets_dc_motor.c +562 -0
  15. data/ext/phidgets/phidgets_dictionary.c +154 -213
  16. data/ext/phidgets/phidgets_digital_input.c +127 -0
  17. data/ext/phidgets/phidgets_digital_output.c +288 -0
  18. data/ext/phidgets/phidgets_distance_sensor.c +295 -0
  19. data/ext/phidgets/phidgets_encoder.c +211 -192
  20. data/ext/phidgets/phidgets_frequency_counter.c +310 -177
  21. data/ext/phidgets/phidgets_gps.c +226 -164
  22. data/ext/phidgets/phidgets_gyroscope.c +195 -0
  23. data/ext/phidgets/phidgets_hub.c +39 -0
  24. data/ext/phidgets/phidgets_humidity_sensor.c +200 -0
  25. data/ext/phidgets/phidgets_ir.c +211 -171
  26. data/ext/phidgets/phidgets_lcd.c +512 -0
  27. data/ext/phidgets/phidgets_light_sensor.c +200 -0
  28. data/ext/phidgets/phidgets_log.c +263 -0
  29. data/ext/phidgets/phidgets_magnetometer.c +279 -0
  30. data/ext/phidgets/phidgets_manager.c +86 -297
  31. data/ext/phidgets/phidgets_motor_position_controller.c +787 -0
  32. data/ext/phidgets/phidgets_phsensor.c +200 -152
  33. data/ext/phidgets/phidgets_power_guard.c +144 -0
  34. data/ext/phidgets/phidgets_pressure_sensor.c +200 -0
  35. data/ext/phidgets/phidgets_rc_servo.c +672 -0
  36. data/ext/phidgets/phidgets_resistance_input.c +227 -0
  37. data/ext/phidgets/phidgets_rfid.c +107 -221
  38. data/ext/phidgets/phidgets_sound_sensor.c +284 -0
  39. data/ext/phidgets/phidgets_spatial.c +124 -318
  40. data/ext/phidgets/phidgets_stepper.c +457 -430
  41. data/ext/phidgets/phidgets_temp_sensor.c +223 -228
  42. data/ext/phidgets/phidgets_voltage_input.c +428 -0
  43. data/ext/phidgets/phidgets_voltage_output.c +167 -0
  44. data/ext/phidgets/phidgets_voltage_ratio_input.c +435 -0
  45. data/lib/phidgets.rb +21 -14
  46. data/lib/phidgets/accelerometer.rb +11 -15
  47. data/lib/phidgets/bldc_motor.rb +45 -0
  48. data/lib/phidgets/capacitive_touch.rb +33 -0
  49. data/lib/phidgets/common.rb +40 -69
  50. data/lib/phidgets/current_input.rb +21 -0
  51. data/lib/phidgets/dc_motor.rb +45 -0
  52. data/lib/phidgets/dictionary.rb +30 -39
  53. data/lib/phidgets/digital_input.rb +21 -0
  54. data/lib/phidgets/digital_output.rb +56 -0
  55. data/lib/phidgets/distance_sensor.rb +33 -0
  56. data/lib/phidgets/encoder.rb +1 -29
  57. data/lib/phidgets/frequency_counter.rb +23 -14
  58. data/lib/phidgets/gps.rb +34 -26
  59. data/lib/phidgets/gyroscope.rb +21 -0
  60. data/lib/phidgets/humidity_sensor.rb +21 -0
  61. data/lib/phidgets/ir.rb +34 -39
  62. data/lib/phidgets/light_sensor.rb +21 -0
  63. data/lib/phidgets/magnetometer.rb +21 -0
  64. data/lib/phidgets/manager.rb +18 -66
  65. data/lib/phidgets/motor_position_controller.rb +45 -0
  66. data/lib/phidgets/ph_sensor.rb +2 -6
  67. data/lib/phidgets/pressure_sensor.rb +21 -0
  68. data/lib/phidgets/rc_servo.rb +58 -0
  69. data/lib/phidgets/resistance_input.rb +21 -0
  70. data/lib/phidgets/rfid.rb +22 -38
  71. data/lib/phidgets/sound_sensor.rb +21 -0
  72. data/lib/phidgets/spatial.rb +11 -15
  73. data/lib/phidgets/stepper.rb +48 -50
  74. data/lib/phidgets/temperature_sensor.rb +11 -15
  75. data/lib/phidgets/version.rb +5 -0
  76. data/lib/phidgets/voltage_input.rb +34 -0
  77. data/lib/phidgets/voltage_output.rb +23 -0
  78. data/lib/phidgets/voltage_ratio_input.rb +34 -0
  79. data/phidgets.gemspec +3 -22
  80. data/test/test_accelerometer.rb +42 -23
  81. data/test/test_bldc_motor.rb +134 -0
  82. data/test/test_capacitive_touch.rb +82 -0
  83. data/test/test_common.rb +125 -108
  84. data/test/test_current_input.rb +62 -0
  85. data/test/test_dc_motor.rb +146 -0
  86. data/test/test_dictionary.rb +22 -54
  87. data/test/test_digital_input.rb +30 -0
  88. data/test/test_digital_output.rb +70 -0
  89. data/test/test_distance_sensor.rb +76 -0
  90. data/test/test_encoder.rb +45 -38
  91. data/test/test_frequency_counter.rb +71 -36
  92. data/test/test_gps.rb +29 -38
  93. data/test/test_gyroscope.rb +54 -0
  94. data/test/test_helper.rb +0 -1
  95. data/test/test_hub.rb +14 -0
  96. data/test/test_humidity_sensor.rb +58 -0
  97. data/test/test_ir.rb +34 -34
  98. data/test/test_lcd.rb +146 -0
  99. data/test/test_light_sensor.rb +58 -0
  100. data/test/test_magnetometer.rb +78 -0
  101. data/test/test_manager.rb +10 -79
  102. data/test/test_motor_control.rb +146 -108
  103. data/test/test_phidgets.rb +2 -14
  104. data/test/test_phsensor.rb +46 -34
  105. data/test/test_power_guard.rb +42 -0
  106. data/test/test_pressure_sensor.rb +58 -0
  107. data/test/test_rc_servo.rb +174 -0
  108. data/test/test_resistance_input.rb +66 -0
  109. data/test/test_rfid.rb +15 -54
  110. data/test/test_sound_sensor.rb +78 -0
  111. data/test/test_spatial.rb +19 -85
  112. data/test/test_stepper.rb +89 -98
  113. data/test/test_temp_sensor.rb +42 -47
  114. data/test/test_voltage_input.rb +102 -0
  115. data/test/test_voltage_output.rb +46 -0
  116. data/test/test_voltage_ratio_input.rb +102 -0
  117. metadata +72 -89
  118. data/ext/phidgets/phidgets_advanced_servo.c +0 -567
  119. data/ext/phidgets/phidgets_analog.c +0 -139
  120. data/ext/phidgets/phidgets_bridge.c +0 -263
  121. data/ext/phidgets/phidgets_interface_kit.c +0 -340
  122. data/ext/phidgets/phidgets_led.c +0 -178
  123. data/ext/phidgets/phidgets_motor_control.c +0 -642
  124. data/ext/phidgets/phidgets_servo.c +0 -276
  125. data/ext/phidgets/phidgets_text_lcd.c +0 -381
  126. data/ext/phidgets/phidgets_text_led.c +0 -107
  127. data/ext/phidgets/phidgets_weight_sensor.c +0 -113
  128. data/lib/phidgets/advanced_servo.rb +0 -49
  129. data/lib/phidgets/analog.rb +0 -8
  130. data/lib/phidgets/bridge.rb +0 -25
  131. data/lib/phidgets/interfacekit.rb +0 -49
  132. data/lib/phidgets/led.rb +0 -8
  133. data/lib/phidgets/motor_control.rb +0 -110
  134. data/lib/phidgets/servo.rb +0 -23
  135. data/lib/phidgets/text_lcd.rb +0 -8
  136. data/lib/phidgets/text_led.rb +0 -8
  137. data/lib/phidgets/weight_sensor.rb +0 -25
  138. data/test/test_advanced_servo.rb +0 -152
  139. data/test/test_analog.rb +0 -45
  140. data/test/test_bridge.rb +0 -77
  141. data/test/test_interfacekit.rb +0 -97
  142. data/test/test_led.rb +0 -55
  143. data/test/test_servo.rb +0 -67
  144. data/test/test_text_lcd.rb +0 -115
  145. data/test/test_text_led.rb +0 -35
  146. data/test/test_weight_sensor.rb +0 -32
@@ -0,0 +1,284 @@
1
+
2
+ #include "phidgets.h"
3
+
4
+ #define SOUND_SENSOR_SPL_CHANGE_CALLBACK 0
5
+
6
+
7
+ VALUE ph_sound_init(VALUE self) {
8
+ ph_data_t *ph = get_ph_data(self);
9
+ ph_raise(PhidgetSoundSensor_create((PhidgetSoundSensorHandle *)(&(ph->handle))));
10
+ return self;
11
+ }
12
+
13
+ VALUE ph_sound_get_data_interval(VALUE self) {
14
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetSoundSensor_getDataInterval);
15
+ }
16
+
17
+ VALUE ph_sound_set_data_interval(VALUE self, VALUE interval) {
18
+ ph_raise(PhidgetSoundSensor_setDataInterval((PhidgetSoundSensorHandle)get_ph_handle(self), NUM2UINT(interval)));
19
+ return Qnil;
20
+ }
21
+
22
+ VALUE ph_sound_get_min_data_interval(VALUE self) {
23
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetSoundSensor_getMinDataInterval);
24
+ }
25
+
26
+ VALUE ph_sound_get_max_data_interval(VALUE self) {
27
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetSoundSensor_getMaxDataInterval);
28
+ }
29
+
30
+ VALUE ph_sound_get_db(VALUE self) {
31
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetSoundSensor_getdB);
32
+ }
33
+
34
+ VALUE ph_sound_get_max_db(VALUE self) {
35
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetSoundSensor_getMaxdB);
36
+ }
37
+
38
+ VALUE ph_sound_get_dba(VALUE self) {
39
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetSoundSensor_getdBA);
40
+ }
41
+
42
+ VALUE ph_sound_get_dbc(VALUE self) {
43
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetSoundSensor_getdBC);
44
+ }
45
+
46
+ VALUE ph_sound_get_noise_floor(VALUE self) {
47
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetSoundSensor_getNoiseFloor);
48
+ }
49
+
50
+ VALUE ph_sound_get_octaves(VALUE self) {
51
+ double octaves[10];
52
+ ph_raise(PhidgetSoundSensor_getOctaves((PhidgetSoundSensorHandle)get_ph_handle(self), &octaves));
53
+ return rb_ary_new3(10, DBL2NUM(octaves[0]), DBL2NUM(octaves[1]), DBL2NUM(octaves[2]), DBL2NUM(octaves[3]), DBL2NUM(octaves[4]), DBL2NUM(octaves[5]), DBL2NUM(octaves[6]), DBL2NUM(octaves[7]), DBL2NUM(octaves[8]), DBL2NUM(octaves[9]));
54
+ }
55
+
56
+ VALUE ph_sound_get_spl_change_trigger(VALUE self) {
57
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetSoundSensor_getSPLChangeTrigger);
58
+ }
59
+
60
+ VALUE ph_sound_set_spl_change_trigger(VALUE self, VALUE change_trigger) {
61
+ ph_raise(PhidgetSoundSensor_setSPLChangeTrigger((PhidgetSoundSensorHandle)get_ph_handle(self), NUM2DBL(change_trigger)));
62
+ return Qnil;
63
+ }
64
+
65
+ VALUE ph_sound_get_min_spl_change_trigger(VALUE self) {
66
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetSoundSensor_getMinSPLChangeTrigger);
67
+ }
68
+
69
+ VALUE ph_sound_get_max_spl_change_trigger(VALUE self) {
70
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetSoundSensor_getMaxSPLChangeTrigger);
71
+ }
72
+
73
+ VALUE ph_sound_get_spl_range(VALUE self) {
74
+ return ph_get_int(get_ph_handle(self), (phidget_get_int_func)PhidgetSoundSensor_getSPLRange);
75
+ }
76
+
77
+ VALUE ph_sound_set_spl_range(VALUE self, VALUE spl_range) {
78
+ ph_raise(PhidgetSoundSensor_setSPLRange((PhidgetSoundSensorHandle)get_ph_handle(self), NUM2INT(spl_range)));
79
+ return Qnil;
80
+ }
81
+
82
+
83
+ void CCONV ph_sound_on_spl_change(PhidgetSoundSensorHandle phid, void *userPtr, double db, double dba, double dbc, const double octaves[10]) {
84
+ ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
85
+ while(sem_wait(&callback_data->handler_ready)!=0) {};
86
+ callback_data->arg1 = DBL2NUM(db);
87
+ callback_data->arg2 = DBL2NUM(dba);
88
+ callback_data->arg3 = DBL2NUM(dbc);
89
+ callback_data->arg4 = rb_ary_new3(10, DBL2NUM(octaves[0]), DBL2NUM(octaves[1]), DBL2NUM(octaves[2]), DBL2NUM(octaves[3]), DBL2NUM(octaves[4]), DBL2NUM(octaves[5]), DBL2NUM(octaves[6]), DBL2NUM(octaves[7]), DBL2NUM(octaves[8]), DBL2NUM(octaves[9]));
90
+ sem_post(&callback_data->callback_called);
91
+ }
92
+
93
+
94
+ VALUE ph_sound_set_on_spl_change_handler(VALUE self, VALUE handler) {
95
+ ph_data_t *ph = get_ph_data(self);
96
+ ph_callback_data_t *callback_data = &ph->dev_callbacks[SOUND_SENSOR_SPL_CHANGE_CALLBACK];
97
+ if( TYPE(handler) == T_NIL ) {
98
+ callback_data->callback = T_NIL;
99
+ callback_data->exit = true;
100
+ ph_raise(PhidgetSoundSensor_setOnSPLChangeHandler((PhidgetSoundSensorHandle)ph->handle, NULL, (void *)NULL));
101
+ sem_post(&callback_data->callback_called);
102
+ } else {
103
+ callback_data->exit = false;
104
+ callback_data->phidget = self;
105
+ callback_data->callback = handler;
106
+ ph_raise(PhidgetSoundSensor_setOnSPLChangeHandler((PhidgetSoundSensorHandle)ph->handle, ph_sound_on_spl_change, (void *)callback_data));
107
+ ph_callback_thread(callback_data);
108
+ }
109
+ return Qnil;
110
+ }
111
+
112
+
113
+ void Init_sound() {
114
+ VALUE ph_module = rb_const_get(rb_cObject, rb_intern("Phidgets"));
115
+ VALUE ph_common = rb_const_get(ph_module, rb_intern("Common"));
116
+ VALUE ph_sound = rb_define_class_under(ph_module, "SoundSensor", ph_common);
117
+
118
+
119
+ rb_define_const(ph_sound, "SPL_RANGE_102dB", INT2NUM(SPL_RANGE_102dB));
120
+ rb_define_const(ph_sound, "SPL_RANGE_82dB", INT2NUM(SPL_RANGE_82dB));
121
+
122
+
123
+ /* Document-method: new
124
+ * call-seq: new
125
+ *
126
+ * Creates a Phidget SoundSensor object.
127
+ */
128
+ rb_define_method(ph_sound, "initialize", ph_sound_init, 0);
129
+
130
+ /* Document-method: getDataInterval
131
+ * call-seq: getDataInterval -> interval
132
+ *
133
+ * The DataInterval is the time that must elapse before the channel will fire another SPLChange event.
134
+ * The data interval is bounded by MinDataInterval and MaxDataInterval.
135
+ * The timing between SPLChange events can also affected by the SPLChangeTrigger.
136
+ */
137
+ rb_define_method(ph_sound, "getDataInterval", ph_sound_get_data_interval, 0);
138
+ rb_define_alias(ph_sound, "data_interval", "getDataInterval");
139
+
140
+ /* Document-method: setDataInterval
141
+ * call-seq: setDataInterval(interval)
142
+ *
143
+ * The DataInterval is the time that must elapse before the channel will fire another SPLChange event.
144
+ * The data interval is bounded by MinDataInterval and MaxDataInterval.
145
+ * The timing between SPLChange events can also affected by the SPLChangeTrigger.
146
+ */
147
+ rb_define_method(ph_sound, "setDataInterval", ph_sound_set_data_interval, 1);
148
+ rb_define_alias(ph_sound, "data_interval=", "setDataInterval");
149
+
150
+ /* Document-method: getMinDataInterval
151
+ * call-seq: getMinDataInterval -> interval
152
+ *
153
+ * The minimum value that DataInterval can be set to.
154
+ */
155
+ rb_define_method(ph_sound, "getMinDataInterval", ph_sound_get_min_data_interval, 0);
156
+ rb_define_alias(ph_sound, "min_data_interval", "getMinDataInterval");
157
+
158
+ /* Document-method: getMaxDataInterval
159
+ * call-seq: getMaxDataInterval -> interval
160
+ *
161
+ * The maximum value that DataInterval can be set to.
162
+ */
163
+ rb_define_method(ph_sound, "getMaxDataInterval", ph_sound_get_max_data_interval, 0);
164
+ rb_define_alias(ph_sound, "max_data_interval", "getMaxDataInterval");
165
+
166
+ /* Document-method: getdB
167
+ * call-seq: getdB -> db
168
+ *
169
+ * The most recent dB SPL value that has been calculated.
170
+ * This value is bounded by MaxdB.
171
+ */
172
+ rb_define_method(ph_sound, "getdB", ph_sound_get_db, 0);
173
+ rb_define_alias(ph_sound, "db", "getdB");
174
+
175
+ /* Document-method: getMaxdB
176
+ * call-seq: getMaxdB -> db
177
+ *
178
+ * The maximum value the SPLChange event will report.
179
+ */
180
+ rb_define_method(ph_sound, "getMaxdB", ph_sound_get_max_db, 0);
181
+ rb_define_alias(ph_sound, "max_db", "getMaxdB");
182
+
183
+ /* Document-method: getdBA
184
+ * call-seq: getdBA -> dba
185
+ *
186
+ * The most recent dBA SPL value that has been calculated.
187
+ * The dBA SPL value is calculated by applying a A-weighted filter to the Octaves data.
188
+ */
189
+ rb_define_method(ph_sound, "getdBA", ph_sound_get_dba, 0);
190
+ rb_define_alias(ph_sound, "dba", "getdBA");
191
+
192
+ /* Document-method: getdBC
193
+ * call-seq: getdBC -> dbc
194
+ *
195
+ * The most recent dBC SPL value that has been calculated.
196
+ * The dBC SPL value is calculated by applying a C-weighted filter to the Octaves data.
197
+ */
198
+ rb_define_method(ph_sound, "getdBC", ph_sound_get_dbc, 0);
199
+ rb_define_alias(ph_sound, "dbc", "getdBC");
200
+
201
+ /* Document-method: getNoiseFloor
202
+ * call-seq: getNoiseFloor -> noise_floor
203
+ *
204
+ * The minimum SPL value that the channel can accurately measure.
205
+ * Input SPLs below this level will not produce an output from the microphone.
206
+ */
207
+ rb_define_method(ph_sound, "getNoiseFloor", ph_sound_get_noise_floor, 0);
208
+ rb_define_alias(ph_sound, "noise_floor", "getNoiseFloor");
209
+
210
+ /* Document-method: getOctaves
211
+ * call-seq: getOctaves -> octaves
212
+ *
213
+ * The unweighted value of each frequency band.
214
+ * The following frequency bands are represented:
215
+ * octaves[0] = 31.5 Hz
216
+ * octaves[1] = 63 Hz
217
+ * octaves[2] = 125 Hz
218
+ * octaves[3] = 250 Hz
219
+ * octaves[4] = 500 Hz
220
+ * octaves[5] = 1 kHz
221
+ * octaves[6] = 2 kHz
222
+ * octaves[7] = 4 kHz
223
+ * octaves[8] = 8 kHz
224
+ * octaves[9] = 16 kHz
225
+ */
226
+ rb_define_method(ph_sound, "getOctaves", ph_sound_get_octaves, 0);
227
+ rb_define_alias(ph_sound, "octaves", "getOctaves");
228
+
229
+ /* Document-method: getSPLChangeTrigger
230
+ * call-seq: getSPLChangeTrigger -> change_trigger
231
+ *
232
+ * The channel will not issue a SPLChange event until the dB value has changed by the amount specified by the SPLChangeTrigger.
233
+ * Setting the SPLChangeTrigger to 0 will result in the channel firing events every DataInterval. This is useful for applications that implement their own data filtering.
234
+ */
235
+ rb_define_method(ph_sound, "getSPLChangeTrigger", ph_sound_get_spl_change_trigger, 0);
236
+ rb_define_alias(ph_sound, "spl_change_trigger", "getSPLChangeTrigger");
237
+
238
+ /* Document-method: setSPLChangeTrigger
239
+ * call-seq: setSPLChangeTrigger(change_trigger)
240
+ *
241
+ * The channel will not issue a SPLChange event until the dB value has changed by the amount specified by the SPLChangeTrigger.
242
+ * Setting the SPLChangeTrigger to 0 will result in the channel firing events every DataInterval. This is useful for applications that implement their own data filtering.
243
+ */
244
+ rb_define_method(ph_sound, "setSPLChangeTrigger", ph_sound_set_spl_change_trigger, 1);
245
+ rb_define_alias(ph_sound, "spl_change_trigger=", "setSPLChangeTrigger");
246
+
247
+ /* Document-method: getMinSPLChangeTrigger
248
+ * call-seq: getMinSPLChangeTrigger -> change_trigger
249
+ *
250
+ * The minimum value that SPLChangeTrigger can be set to.
251
+ */
252
+ rb_define_method(ph_sound, "getMinSPLChangeTrigger", ph_sound_get_min_spl_change_trigger, 0);
253
+ rb_define_alias(ph_sound, "min_spl_change_trigger", "getMinSPLChangeTrigger");
254
+
255
+ /* Document-method: getMaxSPLChangeTrigger
256
+ * call-seq: getMaxSPLChangeTrigger -> change_trigger
257
+ *
258
+ * The maximum value that SPLChangeTrigger can be set to.
259
+ */
260
+ rb_define_method(ph_sound, "getMaxSPLChangeTrigger", ph_sound_get_max_spl_change_trigger, 0);
261
+ rb_define_alias(ph_sound, "max_spl_change_trigger", "getMaxSPLChangeTrigger");
262
+
263
+ /* Document-method: getSPLRange
264
+ * call-seq: getSPLRange -> spl_range
265
+ *
266
+ * When selecting a range, first decide how sensitive you want the microphone to be. Select a smaller range when you want more sensitivity from the microphone.
267
+ * If a Saturation event occurrs, increase the range.
268
+ */
269
+ rb_define_method(ph_sound, "getSPLRange", ph_sound_get_spl_range, 0);
270
+ rb_define_alias(ph_sound, "spl_range", "getSPLRange");
271
+
272
+ /* Document-method: setSPLRange
273
+ * call-seq: setSPLRange(spl_range)
274
+ *
275
+ * When selecting a range, first decide how sensitive you want the microphone to be. Select a smaller range when you want more sensitivity from the microphone.
276
+ * If a Saturation event occurrs, increase the range.
277
+ */
278
+ rb_define_method(ph_sound, "setSPLRange", ph_sound_set_spl_range, 1);
279
+ rb_define_alias(ph_sound, "spl_range=", "setSPLRange");
280
+
281
+
282
+ rb_define_private_method(ph_sound, "ext_setOnSPLChangeHandler", ph_sound_set_on_spl_change_handler, 1);
283
+ }
284
+
@@ -1,369 +1,175 @@
1
1
 
2
2
  #include "phidgets.h"
3
3
 
4
+ #define SPATIAL_SPATIAL_DATA_CALLBACK 0
4
5
 
5
- VALUE ph_spatial_init(VALUE self);
6
- VALUE ph_spatial_get_acceleration_axis_count(VALUE self);
7
- VALUE ph_spatial_get_gyro_axis_count(VALUE self);
8
- VALUE ph_spatial_get_compass_axis_count(VALUE self);
9
- VALUE ph_spatial_get_acceleration(VALUE self, VALUE index);
10
- VALUE ph_spatial_get_acceleration_min(VALUE self, VALUE index);
11
- VALUE ph_spatial_get_acceleration_max(VALUE self, VALUE index);
12
- VALUE ph_spatial_get_angular_rate(VALUE self, VALUE index);
13
- VALUE ph_spatial_get_angular_rate_min(VALUE self, VALUE index);
14
- VALUE ph_spatial_get_angular_rate_max(VALUE self, VALUE index);
15
- VALUE ph_spatial_get_magnetic_field(VALUE self, VALUE index);
16
- VALUE ph_spatial_get_magnetic_field_min(VALUE self, VALUE index);
17
- VALUE ph_spatial_get_magnetic_field_max(VALUE self, VALUE index);
18
- VALUE ph_spatial_get_data_rate(VALUE self);
19
- VALUE ph_spatial_get_data_rate_min(VALUE self);
20
- VALUE ph_spatial_get_data_rate_max(VALUE self);
21
- VALUE ph_spatial_set_data_rate(VALUE self, VALUE rate);
22
- VALUE ph_spatial_zero_gyro(VALUE self);
23
- VALUE ph_spatial_set_compass_correction_parameters(VALUE self, VALUE mag_field, VALUE offset0, VALUE offset1, VALUE offset2, VALUE gain0, VALUE gain1, VALUE gain2, VALUE T0, VALUE T1, VALUE T2, VALUE T3, VALUE T4, VALUE T5);
24
- VALUE ph_spatial_reset_compass_correction_parameters(VALUE self);
25
6
 
26
- #ifdef PH_CALLBACK
27
- VALUE ph_spatial_set_on_spatial_data_handler(VALUE self, VALUE handler);
28
- int ph_spatial_on_spatial_data(CPhidgetSpatialHandle phid, void *userPtr, CPhidgetSpatial_SpatialEventDataHandle *data, int data_count);
29
- #endif
7
+ VALUE ph_spatial_init(VALUE self) {
8
+ ph_data_t *ph = get_ph_data(self);
9
+ ph_raise(PhidgetSpatial_create((PhidgetSpatialHandle *)(&(ph->handle))));
10
+ return self;
11
+ }
30
12
 
13
+ VALUE ph_spatial_get_data_interval(VALUE self) {
14
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetSpatial_getDataInterval);
15
+ }
31
16
 
32
- void Init_spatial() {
33
- VALUE ph_module = rb_const_get(rb_cObject, rb_intern("Phidgets"));
34
- VALUE ph_common = rb_const_get(ph_module, rb_intern("Common"));
35
- VALUE ph_spatial = rb_define_class_under(ph_module, "Spatial", ph_common);
17
+ VALUE ph_spatial_set_data_interval(VALUE self, VALUE interval) {
18
+ ph_raise(PhidgetSpatial_setDataInterval((PhidgetSpatialHandle)get_ph_handle(self), NUM2UINT(interval)));
19
+ return Qnil;
20
+ }
36
21
 
37
- /* Document-method: new
38
- * call-seq: new
39
- *
40
- * Creates a Phidget Spatial object.
41
- */
42
- rb_define_method(ph_spatial, "initialize", ph_spatial_init, 0);
22
+ VALUE ph_spatial_get_min_data_interval(VALUE self) {
23
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetSpatial_getMinDataInterval);
24
+ }
43
25
 
44
- /* Document-method: getAccelerationAxisCount
45
- * call-seq: getAccelerationAxisCount -> count
46
- *
47
- * Gets the number of acceleration axes supplied by this board.
48
- */
49
- rb_define_method(ph_spatial, "getAccelerationAxisCount", ph_spatial_get_acceleration_axis_count, 0);
26
+ VALUE ph_spatial_get_max_data_interval(VALUE self) {
27
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetSpatial_getMaxDataInterval);
28
+ }
50
29
 
51
- /* Document-method: getGyroAxisCount
52
- * call-seq: getGyroAxisCount -> count
53
- *
54
- * Gets the number of gyroscope axes supplied by this board.
55
- */
56
- rb_define_method(ph_spatial, "getGyroAxisCount", ph_spatial_get_gyro_axis_count, 0);
30
+ VALUE ph_spatial_set_magnetometer_correction_parameters(VALUE self, VALUE mag_field, VALUE offset0, VALUE offset1, VALUE offset2, VALUE gain0, VALUE gain1, VALUE gain2, VALUE T0, VALUE T1, VALUE T2, VALUE T3, VALUE T4, VALUE T5) {
31
+ ph_raise(PhidgetSpatial_setMagnetometerCorrectionParameters((PhidgetSpatialHandle)get_ph_handle(self), NUM2DBL(mag_field), NUM2DBL(offset0), NUM2DBL(offset1), NUM2DBL(offset2),
32
+ NUM2DBL(gain0), NUM2DBL(gain1), NUM2DBL(gain2), NUM2DBL(T0), NUM2DBL(T1), NUM2DBL(T2), NUM2DBL(T3), NUM2DBL(T4), NUM2DBL(T5)));
33
+ return Qnil;
34
+ }
57
35
 
58
- /* Document-method: getCompassAxisCount
59
- * call-seq: getCompassAxisCount -> count
60
- *
61
- * Gets the number of compass axes supplied by this board.
62
- */
63
- rb_define_method(ph_spatial, "getCompassAxisCount", ph_spatial_get_compass_axis_count, 0);
36
+ VALUE ph_spatial_reset_magnetometer_correction_parameters(VALUE self) {
37
+ ph_raise(PhidgetSpatial_resetMagnetometerCorrectionParameters((PhidgetSpatialHandle)get_ph_handle(self)));
38
+ return Qnil;
39
+ }
64
40
 
65
- /* Document-method: getAcceleration
66
- * call-seq: getAcceleration(index) -> acceleration
67
- *
68
- * Gets the current acceleration of an axis.
69
- */
70
- rb_define_method(ph_spatial, "getAcceleration", ph_spatial_get_acceleration, 1);
41
+ VALUE ph_spatial_save_magnetometer_correction_parameters(VALUE self) {
42
+ ph_raise(PhidgetSpatial_saveMagnetometerCorrectionParameters((PhidgetSpatialHandle)get_ph_handle(self)));
43
+ return Qnil;
44
+ }
71
45
 
72
- /* Document-method: getAccelerationMin
73
- * call-seq: getAccelerationMin(index) -> acceleration
74
- *
75
- * Gets the minimum acceleration supported by an axis.
76
- */
77
- rb_define_method(ph_spatial, "getAccelerationMin", ph_spatial_get_acceleration_min, 1);
46
+ VALUE ph_spatial_zero_gyro(VALUE self) {
47
+ ph_raise(PhidgetSpatial_zeroGyro((PhidgetSpatialHandle)get_ph_handle(self)));
48
+ return Qnil;
49
+ }
78
50
 
79
- /* Document-method: getAccelerationMax
80
- * call-seq: getAccelerationMax(index) -> acceleration
81
- *
82
- * Gets the maximum accleration supported by an axis.
83
- */
84
- rb_define_method(ph_spatial, "getAccelerationMax", ph_spatial_get_acceleration_max, 1);
85
51
 
86
- /* Document-method: getAngularRate
87
- * call-seq: getAngularRate(index) -> rate
88
- *
89
- * Gets the current angular rate of an axis.
90
- */
91
- rb_define_method(ph_spatial, "getAngularRate", ph_spatial_get_angular_rate, 1);
52
+ void CCONV ph_spatial_on_spatial_data(PhidgetSpatialHandle phid, void *userPtr, const double accel[3], const double angularRate[3], const double magneticField[3], double timestamp) {
53
+ ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
54
+ while(sem_wait(&callback_data->handler_ready)!=0) {};
55
+ callback_data->arg1 = rb_ary_new3(3, DBL2NUM(accel[0]), DBL2NUM(accel[1]), DBL2NUM(accel[2]));
56
+ callback_data->arg2 = rb_ary_new3(3, DBL2NUM(angularRate[0]), DBL2NUM(angularRate[1]), DBL2NUM(angularRate[2]));
57
+ callback_data->arg3 = rb_ary_new3(3, DBL2NUM(magneticField[0]), DBL2NUM(magneticField[1]), DBL2NUM(magneticField[2]));
58
+ callback_data->arg4 = DBL2NUM(timestamp);
59
+ sem_post(&callback_data->callback_called);
60
+ }
92
61
 
93
- /* Document-method: getAngularRateMin
94
- * call-seq: getAngularRateMin(index) -> rate
95
- *
96
- * Gets the minimum angular rate supported by an axis.
97
- */
98
- rb_define_method(ph_spatial, "getAngularRateMin", ph_spatial_get_angular_rate_min, 1);
99
62
 
100
- /* Document-method: getAngularRateMax
101
- * call-seq: getAngularRateMax(index) -> rate
63
+ VALUE ph_spatial_set_on_spatial_data_handler(VALUE self, VALUE handler) {
64
+ ph_data_t *ph = get_ph_data(self);
65
+ ph_callback_data_t *callback_data = &ph->dev_callbacks[SPATIAL_SPATIAL_DATA_CALLBACK];
66
+ if( TYPE(handler) == T_NIL ) {
67
+ callback_data->callback = T_NIL;
68
+ callback_data->exit = true;
69
+ ph_raise(PhidgetSpatial_setOnSpatialDataHandler((PhidgetSpatialHandle)ph->handle, NULL, (void *)NULL));
70
+ sem_post(&callback_data->callback_called);
71
+ } else {
72
+ callback_data->exit = false;
73
+ callback_data->phidget = self;
74
+ callback_data->callback = handler;
75
+ ph_raise(PhidgetSpatial_setOnSpatialDataHandler((PhidgetSpatialHandle)ph->handle, ph_spatial_on_spatial_data, (void *)callback_data));
76
+ ph_callback_thread(callback_data);
77
+ }
78
+ return Qnil;
79
+ }
80
+
81
+
82
+ void Init_spatial() {
83
+ VALUE ph_module = rb_const_get(rb_cObject, rb_intern("Phidgets"));
84
+ VALUE ph_common = rb_const_get(ph_module, rb_intern("Common"));
85
+ VALUE ph_spatial = rb_define_class_under(ph_module, "Spatial", ph_common);
86
+
87
+ /* Document-method: new
88
+ * call-seq: new
102
89
  *
103
- * Gets the maximum angular rate supported by an axis.
90
+ * Creates a Phidget Spatial object.
104
91
  */
105
- rb_define_method(ph_spatial, "getAngularRateMax", ph_spatial_get_angular_rate_max, 1);
92
+ rb_define_method(ph_spatial, "initialize", ph_spatial_init, 0);
106
93
 
107
- /* Document-method: getMagneticField
108
- * call-seq: getMagneticField(index) -> field
94
+ /* Document-method: getDataInterval
95
+ * call-seq: getDataInterval -> interval
109
96
  *
110
- * Gets the current magnetic field stregth of an axis.
97
+ * The DataInterval is the time that must elapse before the channel will fire another SpatialData event.
98
+ * The data interval is bounded by MinDataInterval and MaxDataInterval.
111
99
  */
112
- rb_define_method(ph_spatial, "getMagneticField", ph_spatial_get_magnetic_field, 1);
100
+ rb_define_method(ph_spatial, "getDataInterval", ph_spatial_get_data_interval, 0);
101
+ rb_define_alias(ph_spatial, "data_interval", "getDataInterval");
113
102
 
114
- /* Document-method: getMagneticFieldMin
115
- * call-seq: getMagneticFieldMin(index) -> field
103
+ /* Document-method: setDataInterval
104
+ * call-seq: setDataInterval(interval)
116
105
  *
117
- * Gets the minimum magnetic field stregth supported by an axis.
106
+ * The DataInterval is the time that must elapse before the channel will fire another SpatialData event.
107
+ * The data interval is bounded by MinDataInterval and MaxDataInterval.
118
108
  */
119
- rb_define_method(ph_spatial, "getMagneticFieldMin", ph_spatial_get_magnetic_field_min, 1);
109
+ rb_define_method(ph_spatial, "setDataInterval", ph_spatial_set_data_interval, 1);
110
+ rb_define_alias(ph_spatial, "data_interval=", "setDataInterval");
120
111
 
121
- /* Document-method: getMagneticFieldMax
122
- * call-seq: getMagneticFieldMax(index) -> field
112
+ /* Document-method: getMinDataInterval
113
+ * call-seq: getMinDataInterval -> interval
123
114
  *
124
- * Gets the maximum magnetic field stregth supported by an axis.
115
+ * The minimum value that DataInterval can be set to.
125
116
  */
126
- rb_define_method(ph_spatial, "getMagneticFieldMax", ph_spatial_get_magnetic_field_max, 1);
117
+ rb_define_method(ph_spatial, "getMinDataInterval", ph_spatial_get_min_data_interval, 0);
118
+ rb_define_alias(ph_spatial, "min_data_interval", "getMinDataInterval");
127
119
 
128
- /* Document-method: getDataRate
129
- * call-seq: getDataRate -> rate
120
+ /* Document-method: getMaxDataInterval
121
+ * call-seq: getMaxDataInterval -> interval
130
122
  *
131
- * Get the data rate in milliseconds.
123
+ * The maximum value that DataInterval can be set to.
132
124
  */
133
- rb_define_method(ph_spatial, "getDataRate", ph_spatial_get_data_rate, 0);
125
+ rb_define_method(ph_spatial, "getMaxDataInterval", ph_spatial_get_max_data_interval, 0);
126
+ rb_define_alias(ph_spatial, "max_data_interval", "getMaxDataInterval");
134
127
 
135
- /* Document-method: getDataRateMin
136
- * call-seq: getDataRateMin -> rate
128
+ /* Document-method: setMagnetometerCorrectionParameters
129
+ * call-seq: setMagnetometerCorrectionParameters(mag_field, offset0, offset1, offset2, gain0, gain1, gain2, T0, T1, T2, T3, T4, T5)
137
130
  *
138
- * Gets the minimum supported data rate in milliseconds.
131
+ * Calibrate your device for the environment it will be used in.
132
+ * Due to physical location, hard and soft iron offsets, and even bias errors, your device should be calibrated.
133
+ * We have created a calibration program that will provide you with the MagnetometerCorrectionParameters for your specific situation.
134
+ * See your device's User Guide for more information.
139
135
  */
140
- rb_define_method(ph_spatial, "getDataRateMin", ph_spatial_get_data_rate_min, 0);
136
+ rb_define_method(ph_spatial, "setMagnetometerCorrectionParameters", ph_spatial_set_magnetometer_correction_parameters, 13);
137
+ rb_define_alias(ph_spatial, "set_magnetometer_correction_parameters", "setMagnetometerCorrectionParameters");
141
138
 
142
- /* Document-method: getDataRateMax
143
- * call-seq: getDataRateMax -> rate
139
+ /* Document-method: resetMagnetometerCorrectionParameters
140
+ * call-seq: resetMagnetometerCorrectionParameters
144
141
  *
145
- * Gets the maximum supported data rate in milliseconds.
142
+ * Resets the MagnetometerCorrectionParameters to their default values.
143
+ * Due to physical location, hard and soft iron offsets, and even bias errors, your device should be calibrated.
144
+ * We have created a calibration program that will provide you with the MagnetometerCorrectionParameters for your specific situation.
145
+ * See your device's User Guide for more information
146
146
  */
147
- rb_define_method(ph_spatial, "getDataRateMax", ph_spatial_get_data_rate_max, 0);
147
+ rb_define_method(ph_spatial, "resetMagnetometerCorrectionParameters", ph_spatial_reset_magnetometer_correction_parameters, 0);
148
+ rb_define_alias(ph_spatial, "reset_magnetometer_correction_parameters", "resetMagnetometerCorrectionParameters");
148
149
 
149
- /* Document-method: setDataRate
150
- * call-seq: setDataRate(rate)
150
+ /* Document-method: saveMagnetometerCorrectionParameters
151
+ * call-seq: saveMagnetometerCorrectionParameters
151
152
  *
152
- * Sets the data rate in milliseconds.
153
+ * Saves the MagnetometerCorrectionParameters.
154
+ * Due to physical location, hard and soft iron offsets, and even bias errors, your device should be calibrated.
155
+ * We have created a calibration program that will provide you with the MagnetometerCorrectionParameters for your specific situation.
156
+ * See your device's User Guide for more information
153
157
  */
154
- rb_define_method(ph_spatial, "setDataRate", ph_spatial_set_data_rate, 1);
158
+ rb_define_method(ph_spatial, "saveMagnetometerCorrectionParameters", ph_spatial_save_magnetometer_correction_parameters, 0);
159
+ rb_define_alias(ph_spatial, "save_magnetometer_correction_parameters", "saveMagnetometerCorrectionParameters");
155
160
 
156
161
  /* Document-method: zeroGyro
157
162
  * call-seq: zeroGyro
158
163
  *
159
- * Zeroes the gyroscope. This takes about two seconds and the gyro zxes will report 0 during the process.
160
- * This should only be called when the board is not moving.
164
+ * Re-zeros the gyroscope in 1-2 seconds.
165
+ * The device must be stationary when zeroing.
166
+ * The angular rate will be reported as 0.0°/s while zeroing.
167
+ * Zeroing the gyroscope is a method of compensating for the drift that is inherent to all gyroscopes. See your device's User Guide for more information on dealing with drift.
161
168
  */
162
169
  rb_define_method(ph_spatial, "zeroGyro", ph_spatial_zero_gyro, 0);
163
-
164
- /* Document-method: setCompassCorrectionParameters
165
- * call-seq: setCompassCorrectionParameters(mag_field, offset0, offset1, offset2, gain0, gain1, gain2, T0, T1, T2, T3, T4, T5)
166
- *
167
- * Sets the compass correction factors. This can be used to correcting any sensor errors,
168
- * including hard and soft iron offsets and sensor error factors.
169
- */
170
- rb_define_method(ph_spatial, "setCompassCorrectionParameters", ph_spatial_set_compass_correction_parameters, 13);
171
-
172
- /* Document-method: resetCompassCorrectionParameters
173
- * call-seq: resetCompassCorrectionParameters
174
- *
175
- * Resets the compass correction factors. Magnetic field data will be presented directly as reported by the sensor.
176
- */
177
- rb_define_method(ph_spatial, "resetCompassCorrectionParameters", ph_spatial_reset_compass_correction_parameters, 0);
178
-
179
- #ifdef PH_CALLBACK
180
- rb_define_private_method(ph_spatial, "ext_setOnSpatialDataHandler", ph_spatial_set_on_spatial_data_handler, 1);
181
- #endif
182
-
183
- rb_define_alias(ph_spatial, "acceleration_axis_count", "getAccelerationAxisCount");
184
- rb_define_alias(ph_spatial, "gyro_axis_count", "getGyroAxisCount");
185
- rb_define_alias(ph_spatial, "compass_axis_count", "getCompassAxisCount");
186
- rb_define_alias(ph_spatial, "acceleration", "getAcceleration");
187
- rb_define_alias(ph_spatial, "acceleration_min", "getAccelerationMin");
188
- rb_define_alias(ph_spatial, "acceleration_max", "getAccelerationMax");
189
- rb_define_alias(ph_spatial, "angular_rate", "getAngularRate");
190
- rb_define_alias(ph_spatial, "angular_rate_min", "getAngularRateMin");
191
- rb_define_alias(ph_spatial, "angular_rate_max", "getAngularRateMax");
192
- rb_define_alias(ph_spatial, "magnetic_field", "getMagneticField");
193
- rb_define_alias(ph_spatial, "magnetic_field_min", "getMagneticFieldMin");
194
- rb_define_alias(ph_spatial, "magnetic_field_max", "getMagneticFieldMax");
195
- rb_define_alias(ph_spatial, "data_rate", "getDataRate");
196
- rb_define_alias(ph_spatial, "data_rate_min", "getDataRateMin");
197
- rb_define_alias(ph_spatial, "data_rate_max", "getDataRateMax");
198
- rb_define_alias(ph_spatial, "data_rate=", "setDataRate");
199
170
  rb_define_alias(ph_spatial, "zero_gyro", "zeroGyro");
200
- rb_define_alias(ph_spatial, "set_compass_correction_parameters", "setCompassCorrectionParameters");
201
- rb_define_alias(ph_spatial, "reset_compass_correction_parameters", "resetCompassCorrectionParameters");
202
- }
203
-
204
-
205
-
206
- VALUE ph_spatial_init(VALUE self) {
207
- ph_data_t *ph = get_ph_data(self);
208
- ph_raise(CPhidgetSpatial_create((CPhidgetSpatialHandle *)(&(ph->handle))));
209
- return self;
210
- }
211
-
212
- VALUE ph_spatial_get_acceleration_axis_count(VALUE self) {
213
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
214
- int count;
215
- ph_raise(CPhidgetSpatial_getAccelerationAxisCount(handle, &count));
216
- return INT2FIX(count);
217
- }
218
-
219
- VALUE ph_spatial_get_gyro_axis_count(VALUE self) {
220
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
221
- int count;
222
- ph_raise(CPhidgetSpatial_getGyroAxisCount(handle, &count));
223
- return INT2FIX(count);
224
- }
225
-
226
- VALUE ph_spatial_get_compass_axis_count(VALUE self) {
227
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
228
- int count;
229
- ph_raise(CPhidgetSpatial_getCompassAxisCount(handle, &count));
230
- return INT2FIX(count);
231
- }
232
-
233
- VALUE ph_spatial_get_acceleration(VALUE self, VALUE index) {
234
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
235
- double value;
236
- ph_raise(CPhidgetSpatial_getAcceleration(handle, FIX2INT(index), &value));
237
- return rb_float_new(value);
238
- }
239
-
240
- VALUE ph_spatial_get_acceleration_min(VALUE self, VALUE index) {
241
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
242
- double value;
243
- ph_raise(CPhidgetSpatial_getAccelerationMin(handle, FIX2INT(index), &value));
244
- return rb_float_new(value);
245
- }
246
-
247
- VALUE ph_spatial_get_acceleration_max(VALUE self, VALUE index) {
248
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
249
- double value;
250
- ph_raise(CPhidgetSpatial_getAccelerationMax(handle, FIX2INT(index), &value));
251
- return rb_float_new(value);
252
- }
253
-
254
- VALUE ph_spatial_get_angular_rate(VALUE self, VALUE index) {
255
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
256
- double value;
257
- ph_raise(CPhidgetSpatial_getAngularRate(handle, FIX2INT(index), &value));
258
- return rb_float_new(value);
259
- }
260
-
261
- VALUE ph_spatial_get_angular_rate_min(VALUE self, VALUE index) {
262
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
263
- double value;
264
- ph_raise(CPhidgetSpatial_getAngularRateMin(handle, FIX2INT(index), &value));
265
- return rb_float_new(value);
266
- }
267
-
268
- VALUE ph_spatial_get_angular_rate_max(VALUE self, VALUE index) {
269
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
270
- double value;
271
- ph_raise(CPhidgetSpatial_getAngularRateMax(handle, FIX2INT(index), &value));
272
- return rb_float_new(value);
273
- }
274
-
275
- VALUE ph_spatial_get_magnetic_field(VALUE self, VALUE index) {
276
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
277
- double value;
278
- ph_raise(CPhidgetSpatial_getMagneticField(handle, FIX2INT(index), &value));
279
- return rb_float_new(value);
280
- }
281
-
282
- VALUE ph_spatial_get_magnetic_field_min(VALUE self, VALUE index) {
283
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
284
- double value;
285
- ph_raise(CPhidgetSpatial_getMagneticFieldMin(handle, FIX2INT(index), &value));
286
- return rb_float_new(value);
287
- }
288
-
289
- VALUE ph_spatial_get_magnetic_field_max(VALUE self, VALUE index) {
290
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
291
- double value;
292
- ph_raise(CPhidgetSpatial_getMagneticFieldMax(handle, FIX2INT(index), &value));
293
- return rb_float_new(value);
294
- }
295
171
 
296
- VALUE ph_spatial_get_data_rate(VALUE self) {
297
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
298
- int value;
299
- ph_raise(CPhidgetSpatial_getDataRate(handle, &value));
300
- return INT2FIX(value);
301
- }
302
-
303
- VALUE ph_spatial_get_data_rate_min(VALUE self) {
304
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
305
- int value;
306
- ph_raise(CPhidgetSpatial_getDataRateMin(handle, &value));
307
- return INT2FIX(value);
308
- }
309
-
310
- VALUE ph_spatial_get_data_rate_max(VALUE self) {
311
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
312
- int value;
313
- ph_raise(CPhidgetSpatial_getDataRateMax(handle, &value));
314
- return INT2FIX(value);
315
- }
316
-
317
- VALUE ph_spatial_set_data_rate(VALUE self, VALUE milliseconds) {
318
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
319
- ph_raise(CPhidgetSpatial_setDataRate(handle, FIX2INT(milliseconds)));
320
- return Qnil;
321
- }
322
-
323
- VALUE ph_spatial_zero_gyro(VALUE self) {
324
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
325
- ph_raise(CPhidgetSpatial_zeroGyro(handle));
326
- return Qnil;
327
- }
328
-
329
- VALUE ph_spatial_set_compass_correction_parameters(VALUE self, VALUE mag_field, VALUE offset0, VALUE offset1, VALUE offset2, VALUE gain0, VALUE gain1, VALUE gain2, VALUE T0, VALUE T1, VALUE T2, VALUE T3, VALUE T4, VALUE T5) {
330
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
331
- ph_raise(CPhidgetSpatial_setCompassCorrectionParameters(handle, NUM2DBL(mag_field), NUM2DBL(offset0), NUM2DBL(offset1), NUM2DBL(offset2),
332
- NUM2DBL(gain0), NUM2DBL(gain1), NUM2DBL(gain2), NUM2DBL(T0), NUM2DBL(T1), NUM2DBL(T2), NUM2DBL(T3), NUM2DBL(T4), NUM2DBL(T5)));
333
- return Qnil;
334
- }
335
-
336
- VALUE ph_spatial_reset_compass_correction_parameters(VALUE self) {
337
- CPhidgetSpatialHandle handle = (CPhidgetSpatialHandle)get_ph_handle(self);
338
- ph_raise(CPhidgetSpatial_resetCompassCorrectionParameters(handle));
339
- return Qnil;
340
- }
341
172
 
342
-
343
- #ifdef PH_CALLBACK
344
- VALUE ph_spatial_set_on_spatial_data_handler(VALUE self, VALUE handler) {
345
- ph_data_t *ph = get_ph_data(self);
346
- ph_callback_data_t *callback_data = &ph->dev_callback_1;
347
- if( TYPE(handler) == T_NIL ) {
348
- callback_data->exit = true;
349
- ph_raise(CPhidgetSpatial_set_OnSpatialData_Handler((CPhidgetSpatialHandle)ph->handle, NULL, (void *)NULL));
350
- } else {
351
- callback_data->called = false;
352
- callback_data->exit = false;
353
- callback_data->phidget = self;
354
- callback_data->callback = handler;
355
- ph_raise(CPhidgetSpatial_set_OnSpatialData_Handler((CPhidgetSpatialHandle)ph->handle, ph_spatial_on_spatial_data, (void *)callback_data));
356
- ph_callback_thread(callback_data);
357
- }
358
- return Qnil;
359
- }
360
-
361
-
362
- int ph_spatial_on_spatial_data(CPhidgetSpatialHandle phid, void *userPtr, CPhidgetSpatial_SpatialEventDataHandle *data, int data_count) {
363
- ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
364
- callback_data->called = true;
365
- return EPHIDGET_OK;
173
+ rb_define_private_method(ph_spatial, "ext_setOnSpatialDataHandler", ph_spatial_set_on_spatial_data_handler, 1);
366
174
  }
367
175
 
368
- #endif
369
-