phidgets 0.1.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,279 @@
1
+
2
+ #include "phidgets.h"
3
+
4
+ #define MAGNETOMETER_MAGNETIC_FIELD_CHANGE_CALLBACK 0
5
+
6
+
7
+ VALUE ph_magnetometer_init(VALUE self) {
8
+ ph_data_t *ph = get_ph_data(self);
9
+ ph_raise(PhidgetMagnetometer_create((PhidgetMagnetometerHandle *)(&(ph->handle))));
10
+ return self;
11
+ }
12
+
13
+ VALUE ph_magnetometer_get_axis_count(VALUE self) {
14
+ return ph_get_int(get_ph_handle(self), (phidget_get_int_func)PhidgetMagnetometer_getAxisCount);
15
+ }
16
+
17
+ VALUE ph_magnetometer_set_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) {
18
+ ph_raise(PhidgetMagnetometer_setCorrectionParameters((PhidgetMagnetometerHandle)get_ph_handle(self), NUM2DBL(mag_field), NUM2DBL(offset0), NUM2DBL(offset1), NUM2DBL(offset2),
19
+ NUM2DBL(gain0), NUM2DBL(gain1), NUM2DBL(gain2), NUM2DBL(T0), NUM2DBL(T1), NUM2DBL(T2), NUM2DBL(T3), NUM2DBL(T4), NUM2DBL(T5)));
20
+ return Qnil;
21
+ }
22
+
23
+ VALUE ph_magnetometer_get_data_interval(VALUE self) {
24
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetMagnetometer_getDataInterval);
25
+ }
26
+
27
+ VALUE ph_magnetometer_set_data_interval(VALUE self, VALUE interval) {
28
+ ph_raise(PhidgetMagnetometer_setDataInterval((PhidgetMagnetometerHandle)get_ph_handle(self), NUM2UINT(interval)));
29
+ return Qnil;
30
+ }
31
+
32
+ VALUE ph_magnetometer_get_min_data_interval(VALUE self) {
33
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetMagnetometer_getMinDataInterval);
34
+ }
35
+
36
+ VALUE ph_magnetometer_get_max_data_interval(VALUE self) {
37
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetMagnetometer_getMaxDataInterval);
38
+ }
39
+
40
+ VALUE ph_magnetometer_get_magnetic_field(VALUE self) {
41
+ double mag_field[3];
42
+ ph_raise(PhidgetMagnetometer_getMagneticField((PhidgetMagnetometerHandle)get_ph_handle(self), &mag_field));
43
+ return rb_ary_new3(3, DBL2NUM(mag_field[0]), DBL2NUM(mag_field[1]), DBL2NUM(mag_field[2]));
44
+ }
45
+
46
+ VALUE ph_magnetometer_get_min_magnetic_field(VALUE self) {
47
+ double mag_field[3];
48
+ ph_raise(PhidgetMagnetometer_getMinMagneticField((PhidgetMagnetometerHandle)get_ph_handle(self), &mag_field));
49
+ return rb_ary_new3(3, DBL2NUM(mag_field[0]), DBL2NUM(mag_field[1]), DBL2NUM(mag_field[2]));
50
+ }
51
+
52
+ VALUE ph_magnetometer_get_max_magnetic_field(VALUE self) {
53
+ double mag_field[3];
54
+ ph_raise(PhidgetMagnetometer_getMaxMagneticField((PhidgetMagnetometerHandle)get_ph_handle(self), &mag_field));
55
+ return rb_ary_new3(3, DBL2NUM(mag_field[0]), DBL2NUM(mag_field[1]), DBL2NUM(mag_field[2]));
56
+ }
57
+
58
+ VALUE ph_magnetometer_get_magnetic_field_change_trigger(VALUE self) {
59
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetMagnetometer_getMagneticFieldChangeTrigger);
60
+ }
61
+
62
+ VALUE ph_magnetometer_set_magnetic_field_change_trigger(VALUE self, VALUE change_trigger) {
63
+ ph_raise(PhidgetMagnetometer_setMagneticFieldChangeTrigger((PhidgetMagnetometerHandle)get_ph_handle(self), NUM2DBL(change_trigger)));
64
+ return Qnil;
65
+ }
66
+
67
+ VALUE ph_magnetometer_get_min_magnetic_field_change_trigger(VALUE self) {
68
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetMagnetometer_getMinMagneticFieldChangeTrigger);
69
+ }
70
+
71
+ VALUE ph_magnetometer_get_max_magnetic_field_change_trigger(VALUE self) {
72
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetMagnetometer_getMaxMagneticFieldChangeTrigger);
73
+ }
74
+
75
+ VALUE ph_magnetometer_reset_correction_parameters(VALUE self) {
76
+ ph_raise(PhidgetMagnetometer_resetCorrectionParameters((PhidgetMagnetometerHandle)get_ph_handle(self)));
77
+ return Qnil;
78
+ }
79
+
80
+ VALUE ph_magnetometer_save_correction_parameters(VALUE self) {
81
+ ph_raise(PhidgetMagnetometer_saveCorrectionParameters((PhidgetMagnetometerHandle)get_ph_handle(self)));
82
+ return Qnil;
83
+ }
84
+
85
+ VALUE ph_magnetometer_get_timestamp(VALUE self) {
86
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetMagnetometer_getTimestamp);
87
+ }
88
+
89
+
90
+ void CCONV ph_magnetometer_on_magnetic_field_change(PhidgetMagnetometerHandle phid, void *userPtr, const double mag_field[3], double timestamp) {
91
+ ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
92
+ while(sem_wait(&callback_data->handler_ready)!=0) {};
93
+ callback_data->arg1 = rb_ary_new3(3, DBL2NUM(mag_field[0]), DBL2NUM(mag_field[1]), DBL2NUM(mag_field[2]));
94
+ callback_data->arg2 = DBL2NUM(timestamp);
95
+ callback_data->arg3 = Qnil;
96
+ callback_data->arg4 = Qnil;
97
+ sem_post(&callback_data->callback_called);
98
+ }
99
+
100
+
101
+ VALUE ph_magnetometer_set_on_magnetic_field_change_handler(VALUE self, VALUE handler) {
102
+ ph_data_t *ph = get_ph_data(self);
103
+ ph_callback_data_t *callback_data = &ph->dev_callbacks[MAGNETOMETER_MAGNETIC_FIELD_CHANGE_CALLBACK];
104
+ if( TYPE(handler) == T_NIL ) {
105
+ callback_data->callback = T_NIL;
106
+ callback_data->exit = true;
107
+ ph_raise(PhidgetMagnetometer_setOnMagneticFieldChangeHandler((PhidgetMagnetometerHandle)ph->handle, NULL, (void *)NULL));
108
+ sem_post(&callback_data->callback_called);
109
+ } else {
110
+ callback_data->exit = false;
111
+ callback_data->phidget = self;
112
+ callback_data->callback = handler;
113
+ ph_raise(PhidgetMagnetometer_setOnMagneticFieldChangeHandler((PhidgetMagnetometerHandle)ph->handle, ph_magnetometer_on_magnetic_field_change, (void *)callback_data));
114
+ ph_callback_thread(callback_data);
115
+ }
116
+ return Qnil;
117
+ }
118
+
119
+
120
+ void Init_magnetometer() {
121
+ VALUE ph_module = rb_const_get(rb_cObject, rb_intern("Phidgets"));
122
+ VALUE ph_common = rb_const_get(ph_module, rb_intern("Common"));
123
+ VALUE ph_magnetometer = rb_define_class_under(ph_module, "Magnetometer", ph_common);
124
+
125
+ /* Document-method: new
126
+ * call-seq: new
127
+ *
128
+ * Creates a Phidget Magnetometer object.
129
+ */
130
+ rb_define_method(ph_magnetometer, "initialize", ph_magnetometer_init, 0);
131
+
132
+ /* Document-method: getAxisCount
133
+ * call-seq: getAxisCount -> axis_count
134
+ *
135
+ * The number of axes the channel can measure field strength on.
136
+ * See your device's User Guide for more information about the number of axes and their orientation.
137
+ */
138
+ rb_define_method(ph_magnetometer, "getAxisCount", ph_magnetometer_get_axis_count, 0);
139
+ rb_define_alias(ph_magnetometer, "axis_count", "getAxisCount");
140
+
141
+ /* Document-method: setCorrectionParameters
142
+ * call-seq: setCorrectionParameters(mag_field, offset0, offset1, offset2, gain0, gain1, gain2, T0, T1, T2, T3, T4, T5)
143
+ *
144
+ * Calibrate your device for the environment it will be used in.
145
+ * Due to physical location, hard and soft iron offsets, and even bias errors, your device should be calibrated.
146
+ * We have created a calibration program that will provide you with the CompassCorrectionParameters for your specific situation.
147
+ * See your device's User Guide for more information.
148
+ */
149
+ rb_define_method(ph_magnetometer, "setCorrectionParameters", ph_magnetometer_set_correction_parameters, 13);
150
+ rb_define_alias(ph_magnetometer, "set_correction_parameters", "setCorrectionParameters");
151
+
152
+ /* Document-method: getDataInterval
153
+ * call-seq: getDataInterval -> interval
154
+ *
155
+ * The DataInterval is the time that must elapse before the channel will fire another IlluminanceChange event.
156
+ * The data interval is bounded by MinDataInterval and MaxDataInterval.
157
+ * The timing between IlluminanceChange events can also affected by the IlluminanceChangeTrigger.
158
+ */
159
+ rb_define_method(ph_magnetometer, "getDataInterval", ph_magnetometer_get_data_interval, 0);
160
+ rb_define_alias(ph_magnetometer, "data_interval", "getDataInterval");
161
+
162
+ /* Document-method: setDataInterval
163
+ * call-seq: setDataInterval(interval)
164
+ *
165
+ * The DataInterval is the time that must elapse before the channel will fire another IlluminanceChange event.
166
+ * The data interval is bounded by MinDataInterval and MaxDataInterval.
167
+ * The timing between IlluminanceChange events can also affected by the IlluminanceChangeTrigger.
168
+ */
169
+ rb_define_method(ph_magnetometer, "setDataInterval", ph_magnetometer_set_data_interval, 1);
170
+ rb_define_alias(ph_magnetometer, "data_interval=", "setDataInterval");
171
+
172
+ /* Document-method: getMinDataInterval
173
+ * call-seq: getMinDataInterval -> interval
174
+ *
175
+ * The minimum value that DataInterval can be set to.
176
+ */
177
+ rb_define_method(ph_magnetometer, "getMinDataInterval", ph_magnetometer_get_min_data_interval, 0);
178
+ rb_define_alias(ph_magnetometer, "min_data_interval", "getMinDataInterval");
179
+
180
+ /* Document-method: getMaxDataInterval
181
+ * call-seq: getMaxDataInterval -> interval
182
+ *
183
+ * The maximum value that DataInterval can be set to.
184
+ */
185
+ rb_define_method(ph_magnetometer, "getMaxDataInterval", ph_magnetometer_get_max_data_interval, 0);
186
+ rb_define_alias(ph_magnetometer, "max_data_interval", "getMaxDataInterval");
187
+
188
+ /* Document-method: getMagneticField
189
+ * call-seq: getMagneticField -> magnetic_field
190
+ *
191
+ * The most recent field strength value that the channel has reported.
192
+ * This value will always be between MinMagneticField and MaxMagneticField.
193
+ */
194
+ rb_define_method(ph_magnetometer, "getMagneticField", ph_magnetometer_get_magnetic_field, 0);
195
+ rb_define_alias(ph_magnetometer, "magnetic_field", "getMagneticField");
196
+
197
+ /* Document-method: getMinMagneticField
198
+ * call-seq: getMinMagneticField -> magnetic_field
199
+ *
200
+ * The minimum value that the MagneticFieldChange event will report.
201
+ */
202
+ rb_define_method(ph_magnetometer, "getMinMagneticField", ph_magnetometer_get_min_magnetic_field, 0);
203
+ rb_define_alias(ph_magnetometer, "min_magnetic_field", "getMinMagneticField");
204
+
205
+ /* Document-method: getMaxMagneticField
206
+ * call-seq: getMaxMagneticField -> magnetic_field
207
+ *
208
+ * The maximum value that the MagneticFieldChange event will report.
209
+ */
210
+ rb_define_method(ph_magnetometer, "getMaxMagneticField", ph_magnetometer_get_max_magnetic_field, 0);
211
+ rb_define_alias(ph_magnetometer, "max_magnetic_field", "getMaxMagneticField");
212
+
213
+ /* Document-method: getMagneticFieldChangeTrigger
214
+ * call-seq: getMagneticFieldChangeTrigger -> change_trigger
215
+ *
216
+ * The channel will not issue a MagneticFieldChange event until the field strength value has changed by the amount specified by the MagneticFieldChangeTrigger.
217
+ * Setting the MagneticFieldChangeTrigger to 0 will result in the channel firing events every DataInterval. This is useful for applications that implement their own data filtering.
218
+ */
219
+ rb_define_method(ph_magnetometer, "getMagneticFieldChangeTrigger", ph_magnetometer_get_magnetic_field_change_trigger, 0);
220
+ rb_define_alias(ph_magnetometer, "magnetic_field_change_trigger", "getMagneticFieldChangeTrigger");
221
+
222
+ /* Document-method: setMagneticFieldChangeTrigger
223
+ * call-seq: setMagneticFieldChangeTrigger(change_trigger)
224
+ *
225
+ * The channel will not issue a MagneticFieldChange event until the field strength value has changed by the amount specified by the MagneticFieldChangeTrigger.
226
+ * Setting the MagneticFieldChangeTrigger to 0 will result in the channel firing events every DataInterval. This is useful for applications that implement their own data filtering.
227
+ */
228
+ rb_define_method(ph_magnetometer, "setMagneticFieldChangeTrigger", ph_magnetometer_set_magnetic_field_change_trigger, 1);
229
+ rb_define_alias(ph_magnetometer, "magnetic_field_change_trigger=", "setMagneticFieldChangeTrigger");
230
+
231
+ /* Document-method: getMinMagneticFieldChangeTrigger
232
+ * call-seq: getMinMagneticFieldChangeTrigger -> change_trigger
233
+ *
234
+ * The minimum value that MagneticFieldChangeTrigger can be set to.
235
+ */
236
+ rb_define_method(ph_magnetometer, "getMinMagneticFieldChangeTrigger", ph_magnetometer_get_min_magnetic_field_change_trigger, 0);
237
+ rb_define_alias(ph_magnetometer, "min_magnetic_field_change_trigger", "getMinMagneticFieldChangeTrigger");
238
+
239
+ /* Document-method: getMaxMagneticFieldChangeTrigger
240
+ * call-seq: getMaxMagneticFieldChangeTrigger -> change_trigger
241
+ *
242
+ * The maximum value that MagneticFieldChangeTrigger can be set to.
243
+ */
244
+ rb_define_method(ph_magnetometer, "getMaxMagneticFieldChangeTrigger", ph_magnetometer_get_max_magnetic_field_change_trigger, 0);
245
+ rb_define_alias(ph_magnetometer, "max_magnetic_field_change_trigger", "getMaxMagneticFieldChangeTrigger");
246
+
247
+ /* Document-method: resetCorrectionParameters
248
+ * call-seq: resetCorrectionParameters
249
+ *
250
+ * Resets the CompassCorrectionParameters to their default values.
251
+ * Due to physical location, hard and soft iron offsets, and even bias errors, your device should be calibrated.
252
+ * We have created a calibration program that will provide you with the CompassCorrectionParameters for your specific situation. See your device's User Guide for more information.
253
+ */
254
+ rb_define_method(ph_magnetometer, "resetCorrectionParameters", ph_magnetometer_reset_correction_parameters, 0);
255
+ rb_define_alias(ph_magnetometer, "reset_correction_parameters", "resetCorrectionParameters");
256
+
257
+ /* Document-method: saveCorrectionParameters
258
+ * call-seq: saveCorrectionParameters
259
+ *
260
+ * Saves the CalibrationParameters.
261
+ * Due to physical location, hard and soft iron offsets, and even bias errors, your device should be calibrated.
262
+ * We have created a calibration program that will provide you with the CompassCorrectionParameters for your specific situation. See your device's User Guide for more information.
263
+ */
264
+ rb_define_method(ph_magnetometer, "saveCorrectionParameters", ph_magnetometer_save_correction_parameters, 0);
265
+ rb_define_alias(ph_magnetometer, "save_correction_parameters", "saveCorrectionParameters");
266
+
267
+ /* Document-method: getTimestamp
268
+ * call-seq: getTimestamp -> timestamp
269
+ *
270
+ * The most recent timestamp value that the channel has reported. This is an extremely accurate time measurement streamed from the device.
271
+ * If your application requires a time measurement, you should use this value over a local software timestamp.
272
+ */
273
+ rb_define_method(ph_magnetometer, "getTimestamp", ph_magnetometer_get_timestamp, 0);
274
+ rb_define_alias(ph_magnetometer, "timestamp", "getTimestamp");
275
+
276
+
277
+ rb_define_private_method(ph_magnetometer, "ext_setOnMagneticFieldChangeHandler", ph_magnetometer_set_on_magnetic_field_change_handler, 1);
278
+ }
279
+
@@ -2,364 +2,153 @@
2
2
  #include "phidgets.h"
3
3
 
4
4
 
5
- VALUE ph_manager_allocate(VALUE klass);
6
- void ph_manager_free(ph_data_t *ph);
7
- VALUE ph_manager_init(VALUE self);
8
- VALUE ph_manager_open(VALUE self);
9
- VALUE ph_manager_open_remote(VALUE self, VALUE server_id, VALUE password);
10
- VALUE ph_manager_open_remote_ip(VALUE self, VALUE address, VALUE port, VALUE password);
11
- VALUE ph_manager_close(VALUE self);
12
- VALUE ph_manager_get_server_id(VALUE self);
13
- VALUE ph_manager_get_server_address(VALUE self);
14
- VALUE ph_manager_get_server_status(VALUE self);
15
- VALUE ph_manager_get_attached_devices(VALUE self);
16
- VALUE ph_manager_instance_from_class(CPhidget_DeviceClass dev_class);
17
-
18
- #ifdef PH_CALLBACK
19
- VALUE ph_manager_set_on_attach_handler(VALUE self, VALUE handler);
20
- VALUE ph_manager_set_on_detach_handler(VALUE self, VALUE handler);
21
- VALUE ph_manager_set_on_server_connect_handler(VALUE self, VALUE handler);
22
- VALUE ph_manager_set_on_server_disconnect_handler(VALUE self, VALUE handler);
23
- int ph_manager_on_attach(CPhidgetHandle phid, void *userPtr);
24
- int ph_manager_on_detach(CPhidgetHandle phid, void *userPtr);
25
- int ph_manager_on_server_connect(CPhidgetManagerHandle phid, void *userPtr);
26
- int ph_manager_on_server_disconnect(CPhidgetManagerHandle phid, void *userPtr);
27
- #endif
28
-
29
-
30
- void Init_manager() {
31
- VALUE ph_module = rb_const_get(rb_cObject, rb_intern("Phidgets"));
32
- VALUE ph_manager = rb_define_class_under(ph_module, "Manager", rb_cObject);
33
- rb_define_alloc_func(ph_manager, ph_manager_allocate);
34
-
35
- /* Document-method: new
36
- * call-seq: new
37
- *
38
- * Creates a Phidget Manager object.
39
- */
40
- rb_define_method(ph_manager, "initialize", ph_manager_init, 0);
41
- rb_define_private_method(ph_manager, "ext_open", ph_manager_open, 0);
42
-
43
- /* Document-method: openRemote
44
- * call-seq: openRemote(server_id, password)
45
- *
46
- * Opens a Phidget manager remotely by ServerID. Note that this requires Bonjour
47
- * (mDNS) to be running on both the host and the server.
48
- */
49
- rb_define_method(ph_manager, "openRemote", ph_manager_open_remote, 2);
50
-
51
- /* Document-method: openRemoteIP
52
- * call-seq: openRemoteIP(address, port, password)
53
- *
54
- * Opens a Phidget manager remotely by address and port.
55
- */
56
- rb_define_method(ph_manager, "openRemoteIP", ph_manager_open_remote_ip, 3);
57
-
58
- /* Document-method: close
59
- * call-seq: close
60
- *
61
- * Closes a Phidget Manager.
62
- */
63
- rb_define_method(ph_manager, "close", ph_manager_close, 0);
64
-
65
- /* Document-method: getServerID
66
- * call-seq: getServerID -> server_id
67
- *
68
- * Gets the server ID of a remotely opened Phidget Manager. This will fail if the manager was opened locally.
69
- */
70
- rb_define_method(ph_manager, "getServerID", ph_manager_get_server_id, 0);
71
-
72
- /* Document-method: getServerAddress
73
- * call-seq: getServerAddress -> [address, port]
74
- *
75
- * Gets the address and port of a remotely opened Phidget Manager. This will fail if the manager was opened locally.
76
- */
77
- rb_define_method(ph_manager, "getServerAddress", ph_manager_get_server_address, 0);
78
-
79
- /* Document-method: getServerStatus
80
- * call-seq: getServerStatus -> status
81
- *
82
- * Gets the connected to server status of a remotely opened Phidget Manager. This will fail if the manager was opened locally.
83
- */
84
- rb_define_method(ph_manager, "getServerStatus", ph_manager_get_server_status, 0);
85
-
86
- /* Document-method: getAttachedDevices
87
- * call-seq: getAttachedDevices -> [devices]
88
- *
89
- * Gets an array of all currently attached Phidgets.
90
- */
91
- rb_define_method(ph_manager, "getAttachedDevices", ph_manager_get_attached_devices, 0);
92
-
93
- #ifdef PH_CALLBACK
94
- rb_define_private_method(ph_manager, "ext_setOnAttachHandler", ph_manager_set_on_attach_handler, 1);
95
- rb_define_private_method(ph_manager, "ext_setOnDetachHandler", ph_manager_set_on_detach_handler, 1);
96
- rb_define_private_method(ph_manager, "ext_setOnServerConnectHandler", ph_manager_set_on_server_connect_handler, 1);
97
- rb_define_private_method(ph_manager, "ext_setOnServerDisconnectHandler", ph_manager_set_on_server_disconnect_handler, 1);
98
- #endif
99
-
100
- rb_define_alias(ph_manager, "open_remote", "openRemote");
101
- rb_define_alias(ph_manager, "open_remote_ip", "openRemoteIP");
102
- rb_define_alias(ph_manager, "server_id", "getServerID");
103
- rb_define_alias(ph_manager, "server_address", "getServerAddress");
104
- rb_define_alias(ph_manager, "server_status", "getServerStatus");
105
- rb_define_alias(ph_manager, "attached_devices", "getAttachedDevices");
5
+ void ph_manager_free(ph_data_t *ph) {
6
+ if (ph && ph->handle) {
7
+ PhidgetManager_close((PhidgetManagerHandle)ph->handle);
8
+ PhidgetManager_delete((PhidgetManagerHandle *)(&(ph->handle)));
9
+ ph->handle = NULL;
10
+ }
11
+ if(ph) {
12
+ sem_destroy(&ph->attach_callback.handler_ready);
13
+ sem_destroy(&ph->attach_callback.callback_called);
14
+ sem_destroy(&ph->detach_callback.handler_ready);
15
+ sem_destroy(&ph->detach_callback.callback_called);
16
+ xfree(ph);
17
+ }
106
18
  }
107
19
 
108
20
 
109
-
110
21
  VALUE ph_manager_allocate(VALUE klass) {
111
22
  ph_data_t *ph;
112
23
  VALUE self = Data_Make_Struct(klass, ph_data_t, 0, ph_manager_free, ph);
113
24
  memset(ph, 0, sizeof(ph_data_t));
25
+ sem_init(&ph->attach_callback.handler_ready, 0, 0);
26
+ sem_init(&ph->attach_callback.callback_called, 0, 0);
27
+ sem_init(&ph->detach_callback.handler_ready, 0, 0);
28
+ sem_init(&ph->detach_callback.callback_called, 0, 0);
114
29
  return self;
115
30
  }
116
31
 
117
- void ph_manager_free(ph_data_t *ph) {
118
- if (ph && ph->handle) {
119
- CPhidgetManager_close((CPhidgetManagerHandle)ph->handle);
120
- CPhidgetManager_delete((CPhidgetManagerHandle)ph->handle);
121
- ph->handle = NULL;
122
- }
123
- if(ph) xfree(ph);
124
- }
125
-
126
32
  VALUE ph_manager_init(VALUE self) {
127
33
  ph_data_t *ph = get_ph_data(self);
128
- ph_raise(CPhidgetManager_create((CPhidgetManagerHandle *)(&(ph->handle))));
34
+ ph_raise(PhidgetManager_create((PhidgetManagerHandle *)(&(ph->handle))));
129
35
  return self;
130
36
  }
131
37
 
132
38
  VALUE ph_manager_open(VALUE self) {
133
- CPhidgetManagerHandle handle = (CPhidgetManagerHandle)get_ph_handle(self);
134
- ph_raise(CPhidgetManager_open(handle));
135
- return Qnil;
136
- }
137
-
138
- VALUE ph_manager_open_remote(VALUE self, VALUE server_id, VALUE password) {
139
- CPhidgetManagerHandle handle = (CPhidgetManagerHandle)get_ph_handle(self);
140
- ph_raise(CPhidgetManager_openRemote(handle, StringValueCStr(server_id), StringValueCStr(password)));
141
- return Qnil;
142
- }
143
-
144
- VALUE ph_manager_open_remote_ip(VALUE self, VALUE address, VALUE port, VALUE password) {
145
- CPhidgetManagerHandle handle = (CPhidgetManagerHandle)get_ph_handle(self);
146
- ph_raise(CPhidgetManager_openRemoteIP(handle, StringValueCStr(address), FIX2INT(port), StringValueCStr(password)));
39
+ ph_raise(PhidgetManager_open((PhidgetManagerHandle)get_ph_handle(self)));
147
40
  return Qnil;
148
41
  }
149
42
 
150
43
  VALUE ph_manager_close(VALUE self) {
151
- CPhidgetManagerHandle handle = (CPhidgetManagerHandle)get_ph_handle(self);
152
- ph_raise(CPhidgetManager_close(handle));
44
+ ph_raise(PhidgetManager_close((PhidgetManagerHandle)get_ph_handle(self)));
153
45
  return Qnil;
154
46
  }
155
47
 
156
- VALUE ph_manager_get_server_id(VALUE self) {
157
- CPhidgetManagerHandle handle = (CPhidgetManagerHandle)get_ph_handle(self);
158
- const char *server_id;
159
- ph_raise(CPhidgetManager_getServerID(handle, &server_id));
160
- return rb_str_new2(server_id);
161
- }
162
-
163
- VALUE ph_manager_get_server_address(VALUE self) {
164
- CPhidgetManagerHandle handle = (CPhidgetManagerHandle)get_ph_handle(self);
165
- const char *address;
166
- int port;
167
- ph_raise(CPhidgetManager_getServerAddress(handle, &address, &port));
168
- return rb_ary_new3(2, rb_str_new2(address), INT2FIX(port));
169
- }
170
48
 
171
- VALUE ph_manager_get_server_status(VALUE self) {
172
- CPhidgetManagerHandle handle = (CPhidgetManagerHandle)get_ph_handle(self);
173
- int server_status;
174
- ph_raise(CPhidgetManager_getServerStatus(handle, &server_status));
175
- return INT2FIX(server_status);
176
- }
177
-
178
- VALUE ph_manager_get_attached_devices(VALUE self) {
179
- CPhidgetManagerHandle handle = (CPhidgetManagerHandle)get_ph_handle(self);
180
- CPhidgetHandle *devices;
181
- int count, i;
182
- VALUE rb_hash = rb_hash_new();
183
- ph_raise(CPhidgetManager_getAttachedDevices(handle, &devices, &count));
184
- for(i=0; i<count; i++) {
185
- int serial;
186
- CPhidget_DeviceClass dev_class;
187
- ph_raise(CPhidget_getSerialNumber(devices[i], &serial));
188
- ph_raise(CPhidget_getDeviceClass(devices[i], &dev_class));
189
- rb_hash_aset(rb_hash, INT2FIX(serial), ph_manager_instance_from_class(dev_class));
190
- }
191
- ph_raise(CPhidgetManager_freeAttachedDevicesArray(devices));
192
- return rb_hash;
49
+ void CCONV ph_manager_on_attach(PhidgetManagerHandle phid, void *userPtr, PhidgetHandle channel) {
50
+ ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
51
+ int32_t device_serial_number;
52
+ int hub_port;
53
+ int channel_index;
54
+ const char *channel_name;
55
+ Phidget_getDeviceSerialNumber(channel, &device_serial_number);
56
+ Phidget_getHubPort(channel, &hub_port);
57
+ Phidget_getChannel(channel, &channel_index);
58
+ Phidget_getChannelName(channel, &channel_name);
59
+ while(sem_wait(&callback_data->handler_ready)!=0) {};
60
+ callback_data->arg1 = INT2NUM(device_serial_number);
61
+ callback_data->arg2 = INT2NUM(hub_port);
62
+ callback_data->arg3 = INT2NUM(channel_index);
63
+ callback_data->arg4 = rb_str_new2(channel_name);
64
+ sem_post(&callback_data->callback_called);
193
65
  }
194
66
 
195
- VALUE ph_manager_instance_from_class(CPhidget_DeviceClass dev_class) {
196
- VALUE ph_module = rb_const_get(rb_cModule, rb_intern("Phidgets"));
197
- VALUE klass;
198
- VALUE argv[0];
199
-
200
- switch( dev_class ) {
201
- case PHIDCLASS_ACCELEROMETER:
202
- klass = rb_const_get(ph_module, rb_intern("Accelerometer"));
203
- break;
204
- case PHIDCLASS_ADVANCEDSERVO:
205
- klass = rb_const_get(ph_module, rb_intern("AdvancedServo"));
206
- break;
207
- case PHIDCLASS_ANALOG:
208
- klass = rb_const_get(ph_module, rb_intern("Analog"));
209
- break;
210
- case PHIDCLASS_BRIDGE:
211
- klass = rb_const_get(ph_module, rb_intern("Bridge"));
212
- break;
213
- case PHIDCLASS_ENCODER:
214
- klass = rb_const_get(ph_module, rb_intern("Encoder"));
215
- break;
216
- case PHIDCLASS_FREQUENCYCOUNTER:
217
- klass = rb_const_get(ph_module, rb_intern("FrequencyCounter"));
218
- break;
219
- case PHIDCLASS_GPS:
220
- klass = rb_const_get(ph_module, rb_intern("GPS"));
221
- break;
222
- case PHIDCLASS_INTERFACEKIT:
223
- klass = rb_const_get(ph_module, rb_intern("InterfaceKit"));
224
- break;
225
- case PHIDCLASS_IR:
226
- klass = rb_const_get(ph_module, rb_intern("IR"));
227
- break;
228
- case PHIDCLASS_LED:
229
- klass = rb_const_get(ph_module, rb_intern("LED"));
230
- break;
231
- case PHIDCLASS_MOTORCONTROL:
232
- klass = rb_const_get(ph_module, rb_intern("MotorControl"));
233
- break;
234
- case PHIDCLASS_PHSENSOR:
235
- klass = rb_const_get(ph_module, rb_intern("PhSensor"));
236
- break;
237
- case PHIDCLASS_RFID:
238
- klass = rb_const_get(ph_module, rb_intern("RFID"));
239
- break;
240
- case PHIDCLASS_SERVO:
241
- klass = rb_const_get(ph_module, rb_intern("Servo"));
242
- break;
243
- case PHIDCLASS_SPATIAL:
244
- klass = rb_const_get(ph_module, rb_intern("Spatial"));
245
- break;
246
- case PHIDCLASS_STEPPER:
247
- klass = rb_const_get(ph_module, rb_intern("Stepper"));
248
- break;
249
- case PHIDCLASS_TEMPERATURESENSOR:
250
- klass = rb_const_get(ph_module, rb_intern("TemperatureSensor"));
251
- break;
252
- case PHIDCLASS_TEXTLCD:
253
- klass = rb_const_get(ph_module, rb_intern("TextLCD"));
254
- break;
255
- case PHIDCLASS_TEXTLED:
256
- klass = rb_const_get(ph_module, rb_intern("TextLED"));
257
- break;
258
- case PHIDCLASS_WEIGHTSENSOR:
259
- klass = rb_const_get(ph_module, rb_intern("WeightSensor"));
260
- break;
261
- default:
262
- klass = Qnil;
263
- }
264
-
265
- return rb_class_new_instance(0, argv, klass);
266
- }
267
67
 
268
- #ifdef PH_CALLBACK
269
68
  VALUE ph_manager_set_on_attach_handler(VALUE self, VALUE handler) {
270
69
  ph_data_t *ph = get_ph_data(self);
271
70
  ph_callback_data_t *callback_data = &ph->attach_callback;
272
71
  if( TYPE(handler) == T_NIL ) {
72
+ callback_data->callback = T_NIL;
273
73
  callback_data->exit = true;
274
- ph_raise(CPhidgetManager_set_OnAttach_Handler((CPhidgetManagerHandle)ph->handle, NULL, (void *)NULL));
74
+ ph_raise(PhidgetManager_setOnAttachHandler((PhidgetManagerHandle)ph->handle, NULL, (void *)NULL));
75
+ sem_post(&callback_data->callback_called);
275
76
  } else {
276
- callback_data->called = false;
277
77
  callback_data->exit = false;
278
78
  callback_data->phidget = self;
279
79
  callback_data->callback = handler;
280
- ph_raise(CPhidgetManager_set_OnAttach_Handler((CPhidgetManagerHandle)ph->handle, ph_manager_on_attach, (void *)callback_data));
80
+ ph_raise(PhidgetManager_setOnAttachHandler((PhidgetManagerHandle)ph->handle, ph_manager_on_attach, (void *)callback_data));
281
81
  ph_callback_thread(callback_data);
282
82
  }
283
83
  return Qnil;
284
84
  }
285
85
 
286
- VALUE ph_manager_set_on_detach_handler(VALUE self, VALUE handler) {
287
- ph_data_t *ph = get_ph_data(self);
288
- ph_callback_data_t *callback_data = &ph->detach_callback;
289
- if( TYPE(handler) == T_NIL ) {
290
- callback_data->exit = true;
291
- ph_raise(CPhidgetManager_set_OnDetach_Handler((CPhidgetManagerHandle)ph->handle, NULL, (void *)NULL));
292
- } else {
293
- callback_data->called = false;
294
- callback_data->exit = false;
295
- callback_data->phidget = self;
296
- callback_data->callback = handler;
297
- ph_raise(CPhidgetManager_set_OnDetach_Handler((CPhidgetManagerHandle)ph->handle, ph_manager_on_detach, (void *)callback_data));
298
- ph_callback_thread(callback_data);
299
- }
300
- return Qnil;
301
- }
302
86
 
303
- VALUE ph_manager_set_on_server_connect_handler(VALUE self, VALUE handler) {
304
- ph_data_t *ph = get_ph_data(self);
305
- ph_callback_data_t *callback_data = &ph->server_connect_callback;
306
- if( TYPE(handler) == T_NIL ) {
307
- callback_data->exit = true;
308
- ph_raise(CPhidgetManager_set_OnServerConnect_Handler((CPhidgetManagerHandle)ph->handle, NULL, (void *)NULL));
309
- } else {
310
- callback_data->called = false;
311
- callback_data->exit = false;
312
- callback_data->phidget = self;
313
- callback_data->callback = handler;
314
- ph_raise(CPhidgetManager_set_OnServerConnect_Handler((CPhidgetManagerHandle)ph->handle, ph_manager_on_server_connect, (void *)callback_data));
315
- ph_callback_thread(callback_data);
316
- }
317
- return Qnil;
87
+ void CCONV ph_manager_on_detach(PhidgetManagerHandle phid, void *userPtr, PhidgetHandle channel) {
88
+ ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
89
+ int32_t device_serial_number;
90
+ Phidget_ChannelClass channel_class;
91
+ int channel_index;
92
+ Phidget_getDeviceSerialNumber(channel, &device_serial_number);
93
+ Phidget_getChannelClass(channel, &channel_class);
94
+ Phidget_getChannel(channel, &channel_index);
95
+ while(sem_wait(&callback_data->handler_ready)!=0) {};
96
+ callback_data->arg1 = INT2NUM(device_serial_number);
97
+ callback_data->arg2 = INT2NUM(channel_class);
98
+ callback_data->arg3 = INT2NUM(channel_index);
99
+ callback_data->arg4 = Qnil;
100
+ sem_post(&callback_data->callback_called);
318
101
  }
319
102
 
320
- VALUE ph_manager_set_on_server_disconnect_handler(VALUE self, VALUE handler) {
103
+
104
+ VALUE ph_manager_set_on_detach_handler(VALUE self, VALUE handler) {
321
105
  ph_data_t *ph = get_ph_data(self);
322
- ph_callback_data_t *callback_data = &ph->server_disconnect_callback;
106
+ ph_callback_data_t *callback_data = &ph->detach_callback;
323
107
  if( TYPE(handler) == T_NIL ) {
108
+ callback_data->callback = T_NIL;
324
109
  callback_data->exit = true;
325
- ph_raise(CPhidgetManager_set_OnServerDisconnect_Handler((CPhidgetManagerHandle)ph->handle, NULL, (void *)NULL));
110
+ ph_raise(PhidgetManager_setOnDetachHandler((PhidgetManagerHandle)ph->handle, NULL, (void *)NULL));
111
+ sem_post(&callback_data->callback_called);
326
112
  } else {
327
- callback_data->called = false;
328
113
  callback_data->exit = false;
329
114
  callback_data->phidget = self;
330
115
  callback_data->callback = handler;
331
- ph_raise(CPhidgetManager_set_OnServerDisconnect_Handler((CPhidgetManagerHandle)ph->handle, ph_manager_on_server_disconnect, (void *)callback_data));
116
+ ph_raise(PhidgetManager_setOnDetachHandler((PhidgetManagerHandle)ph->handle, ph_manager_on_detach, (void *)callback_data));
332
117
  ph_callback_thread(callback_data);
333
118
  }
334
119
  return Qnil;
335
120
  }
336
121
 
337
122
 
338
- int ph_manager_on_attach(CPhidgetHandle phid, void *userPtr) {
339
- ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
340
- callback_data->called = true;
341
- return EPHIDGET_OK;
342
- }
343
123
 
124
+ void Init_manager() {
125
+ VALUE ph_module = rb_const_get(rb_cObject, rb_intern("Phidgets"));
126
+ VALUE ph_manager = rb_define_class_under(ph_module, "Manager", rb_cObject);
127
+ rb_define_alloc_func(ph_manager, ph_manager_allocate);
344
128
 
345
- int ph_manager_on_detach(CPhidgetHandle phid, void *userPtr) {
346
- ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
347
- callback_data->called = true;
348
- return EPHIDGET_OK;
349
- }
350
-
129
+ /* Document-method: new
130
+ * call-seq: new
131
+ *
132
+ * Creates a Phidget Manager object.
133
+ */
134
+ rb_define_method(ph_manager, "initialize", ph_manager_init, 0);
351
135
 
352
- int ph_manager_on_server_connect(CPhidgetManagerHandle phid, void *userPtr) {
353
- ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
354
- callback_data->called = true;
355
- return EPHIDGET_OK;
356
- }
136
+ /* Document-method: open
137
+ * call-seq: open
138
+ *
139
+ * Opens the Phidget Manager.
140
+ * Be sure to register Attach and Detach event handlers for the Manager before opening it, to ensure you program doesn't miss the events reported for devices already connected to your system.
141
+ */
142
+ rb_define_method(ph_manager, "open", ph_manager_open, 0);
357
143
 
144
+ /* Document-method: close
145
+ * call-seq: close
146
+ *
147
+ * Closes a Phidget Manager that has been opened. PhidgetManage#close will release the Phidget Manager, and should be called prior to delete.
148
+ */
149
+ rb_define_method(ph_manager, "close", ph_manager_close, 0);
358
150
 
359
- int ph_manager_on_server_disconnect(CPhidgetManagerHandle phid, void *userPtr) {
360
- ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
361
- callback_data->called = true;
362
- return EPHIDGET_OK;
151
+ rb_define_private_method(ph_manager, "ext_setOnAttachHandler", ph_manager_set_on_attach_handler, 1);
152
+ rb_define_private_method(ph_manager, "ext_setOnDetachHandler", ph_manager_set_on_detach_handler, 1);
363
153
  }
364
- #endif
365
154