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.
- checksums.yaml +4 -4
- data/History.txt +3 -0
- data/README.rdoc +32 -43
- data/Rakefile +4 -2
- data/bin/phidget +18 -72
- data/ext/phidgets/extconf.rb +5 -8
- data/ext/phidgets/phidgets.c +708 -173
- data/ext/phidgets/phidgets.h +54 -35
- data/ext/phidgets/phidgets_accelerometer.c +193 -109
- data/ext/phidgets/phidgets_bldc_motor.c +529 -0
- data/ext/phidgets/phidgets_capacitive_touch.c +302 -0
- data/ext/phidgets/phidgets_common.c +570 -315
- data/ext/phidgets/phidgets_current_input.c +229 -0
- data/ext/phidgets/phidgets_dc_motor.c +562 -0
- data/ext/phidgets/phidgets_dictionary.c +154 -213
- data/ext/phidgets/phidgets_digital_input.c +127 -0
- data/ext/phidgets/phidgets_digital_output.c +288 -0
- data/ext/phidgets/phidgets_distance_sensor.c +295 -0
- data/ext/phidgets/phidgets_encoder.c +211 -192
- data/ext/phidgets/phidgets_frequency_counter.c +310 -177
- data/ext/phidgets/phidgets_gps.c +226 -164
- data/ext/phidgets/phidgets_gyroscope.c +195 -0
- data/ext/phidgets/phidgets_hub.c +39 -0
- data/ext/phidgets/phidgets_humidity_sensor.c +200 -0
- data/ext/phidgets/phidgets_ir.c +211 -171
- data/ext/phidgets/phidgets_lcd.c +512 -0
- data/ext/phidgets/phidgets_light_sensor.c +200 -0
- data/ext/phidgets/phidgets_log.c +263 -0
- data/ext/phidgets/phidgets_magnetometer.c +279 -0
- data/ext/phidgets/phidgets_manager.c +86 -297
- data/ext/phidgets/phidgets_motor_position_controller.c +787 -0
- data/ext/phidgets/phidgets_phsensor.c +200 -152
- data/ext/phidgets/phidgets_power_guard.c +144 -0
- data/ext/phidgets/phidgets_pressure_sensor.c +200 -0
- data/ext/phidgets/phidgets_rc_servo.c +672 -0
- data/ext/phidgets/phidgets_resistance_input.c +227 -0
- data/ext/phidgets/phidgets_rfid.c +107 -221
- data/ext/phidgets/phidgets_sound_sensor.c +284 -0
- data/ext/phidgets/phidgets_spatial.c +124 -318
- data/ext/phidgets/phidgets_stepper.c +457 -430
- data/ext/phidgets/phidgets_temp_sensor.c +223 -228
- data/ext/phidgets/phidgets_voltage_input.c +428 -0
- data/ext/phidgets/phidgets_voltage_output.c +167 -0
- data/ext/phidgets/phidgets_voltage_ratio_input.c +435 -0
- data/lib/phidgets.rb +21 -14
- data/lib/phidgets/accelerometer.rb +11 -15
- data/lib/phidgets/bldc_motor.rb +45 -0
- data/lib/phidgets/capacitive_touch.rb +33 -0
- data/lib/phidgets/common.rb +40 -69
- data/lib/phidgets/current_input.rb +21 -0
- data/lib/phidgets/dc_motor.rb +45 -0
- data/lib/phidgets/dictionary.rb +30 -39
- data/lib/phidgets/digital_input.rb +21 -0
- data/lib/phidgets/digital_output.rb +56 -0
- data/lib/phidgets/distance_sensor.rb +33 -0
- data/lib/phidgets/encoder.rb +1 -29
- data/lib/phidgets/frequency_counter.rb +23 -14
- data/lib/phidgets/gps.rb +34 -26
- data/lib/phidgets/gyroscope.rb +21 -0
- data/lib/phidgets/humidity_sensor.rb +21 -0
- data/lib/phidgets/ir.rb +34 -39
- data/lib/phidgets/light_sensor.rb +21 -0
- data/lib/phidgets/magnetometer.rb +21 -0
- data/lib/phidgets/manager.rb +18 -66
- data/lib/phidgets/motor_position_controller.rb +45 -0
- data/lib/phidgets/ph_sensor.rb +2 -6
- data/lib/phidgets/pressure_sensor.rb +21 -0
- data/lib/phidgets/rc_servo.rb +58 -0
- data/lib/phidgets/resistance_input.rb +21 -0
- data/lib/phidgets/rfid.rb +22 -38
- data/lib/phidgets/sound_sensor.rb +21 -0
- data/lib/phidgets/spatial.rb +11 -15
- data/lib/phidgets/stepper.rb +48 -50
- data/lib/phidgets/temperature_sensor.rb +11 -15
- data/lib/phidgets/version.rb +5 -0
- data/lib/phidgets/voltage_input.rb +34 -0
- data/lib/phidgets/voltage_output.rb +23 -0
- data/lib/phidgets/voltage_ratio_input.rb +34 -0
- data/phidgets.gemspec +3 -22
- data/test/test_accelerometer.rb +42 -23
- data/test/test_bldc_motor.rb +134 -0
- data/test/test_capacitive_touch.rb +82 -0
- data/test/test_common.rb +125 -108
- data/test/test_current_input.rb +62 -0
- data/test/test_dc_motor.rb +146 -0
- data/test/test_dictionary.rb +22 -54
- data/test/test_digital_input.rb +30 -0
- data/test/test_digital_output.rb +70 -0
- data/test/test_distance_sensor.rb +76 -0
- data/test/test_encoder.rb +45 -38
- data/test/test_frequency_counter.rb +71 -36
- data/test/test_gps.rb +29 -38
- data/test/test_gyroscope.rb +54 -0
- data/test/test_helper.rb +0 -1
- data/test/test_hub.rb +14 -0
- data/test/test_humidity_sensor.rb +58 -0
- data/test/test_ir.rb +34 -34
- data/test/test_lcd.rb +146 -0
- data/test/test_light_sensor.rb +58 -0
- data/test/test_magnetometer.rb +78 -0
- data/test/test_manager.rb +10 -79
- data/test/test_motor_control.rb +146 -108
- data/test/test_phidgets.rb +2 -14
- data/test/test_phsensor.rb +46 -34
- data/test/test_power_guard.rb +42 -0
- data/test/test_pressure_sensor.rb +58 -0
- data/test/test_rc_servo.rb +174 -0
- data/test/test_resistance_input.rb +66 -0
- data/test/test_rfid.rb +15 -54
- data/test/test_sound_sensor.rb +78 -0
- data/test/test_spatial.rb +19 -85
- data/test/test_stepper.rb +89 -98
- data/test/test_temp_sensor.rb +42 -47
- data/test/test_voltage_input.rb +102 -0
- data/test/test_voltage_output.rb +46 -0
- data/test/test_voltage_ratio_input.rb +102 -0
- metadata +72 -89
- data/ext/phidgets/phidgets_advanced_servo.c +0 -567
- data/ext/phidgets/phidgets_analog.c +0 -139
- data/ext/phidgets/phidgets_bridge.c +0 -263
- data/ext/phidgets/phidgets_interface_kit.c +0 -340
- data/ext/phidgets/phidgets_led.c +0 -178
- data/ext/phidgets/phidgets_motor_control.c +0 -642
- data/ext/phidgets/phidgets_servo.c +0 -276
- data/ext/phidgets/phidgets_text_lcd.c +0 -381
- data/ext/phidgets/phidgets_text_led.c +0 -107
- data/ext/phidgets/phidgets_weight_sensor.c +0 -113
- data/lib/phidgets/advanced_servo.rb +0 -49
- data/lib/phidgets/analog.rb +0 -8
- data/lib/phidgets/bridge.rb +0 -25
- data/lib/phidgets/interfacekit.rb +0 -49
- data/lib/phidgets/led.rb +0 -8
- data/lib/phidgets/motor_control.rb +0 -110
- data/lib/phidgets/servo.rb +0 -23
- data/lib/phidgets/text_lcd.rb +0 -8
- data/lib/phidgets/text_led.rb +0 -8
- data/lib/phidgets/weight_sensor.rb +0 -25
- data/test/test_advanced_servo.rb +0 -152
- data/test/test_analog.rb +0 -45
- data/test/test_bridge.rb +0 -77
- data/test/test_interfacekit.rb +0 -97
- data/test/test_led.rb +0 -55
- data/test/test_servo.rb +0 -67
- data/test/test_text_lcd.rb +0 -115
- data/test/test_text_led.rb +0 -35
- 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
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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(
|
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
|
-
|
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
|
-
|
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
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
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(
|
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(
|
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
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
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
|
-
|
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->
|
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(
|
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(
|
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
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
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
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
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
|
-
|
360
|
-
|
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
|
|