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,227 @@
1
+
2
+ #include "phidgets.h"
3
+
4
+ #define RESISTANCE_INPUT_RESISTANCE_CHANGE_CALLBACK 0
5
+
6
+
7
+ VALUE ph_resistance_init(VALUE self) {
8
+ ph_data_t *ph = get_ph_data(self);
9
+ ph_raise(PhidgetResistanceInput_create((PhidgetResistanceInputHandle *)(&(ph->handle))));
10
+ return self;
11
+ }
12
+
13
+ VALUE ph_resistance_get_data_interval(VALUE self) {
14
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetResistanceInput_getDataInterval);
15
+ }
16
+
17
+ VALUE ph_resistance_set_data_interval(VALUE self, VALUE interval) {
18
+ ph_raise(PhidgetResistanceInput_setDataInterval((PhidgetResistanceInputHandle)get_ph_handle(self), NUM2UINT(interval)));
19
+ return Qnil;
20
+ }
21
+
22
+ VALUE ph_resistance_get_min_data_interval(VALUE self) {
23
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetResistanceInput_getMinDataInterval);
24
+ }
25
+
26
+ VALUE ph_resistance_get_max_data_interval(VALUE self) {
27
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetResistanceInput_getMaxDataInterval);
28
+ }
29
+
30
+ VALUE ph_resistance_get_resistance(VALUE self) {
31
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetResistanceInput_getResistance);
32
+ }
33
+
34
+ VALUE ph_resistance_get_min_resistance(VALUE self) {
35
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetResistanceInput_getMinResistance);
36
+ }
37
+
38
+ VALUE ph_resistance_get_max_resistance(VALUE self) {
39
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetResistanceInput_getMaxResistance);
40
+ }
41
+
42
+ VALUE ph_resistance_get_resistance_change_trigger(VALUE self) {
43
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetResistanceInput_getResistanceChangeTrigger);
44
+ }
45
+
46
+ VALUE ph_resistance_set_resistance_change_trigger(VALUE self, VALUE change_trigger) {
47
+ ph_raise(PhidgetResistanceInput_setResistanceChangeTrigger((PhidgetResistanceInputHandle)get_ph_handle(self), NUM2DBL(change_trigger)));
48
+ return Qnil;
49
+ }
50
+
51
+ VALUE ph_resistance_get_min_resistance_change_trigger(VALUE self) {
52
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetResistanceInput_getMinResistanceChangeTrigger);
53
+ }
54
+
55
+ VALUE ph_resistance_get_max_resistance_change_trigger(VALUE self) {
56
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetResistanceInput_getMaxResistanceChangeTrigger);
57
+ }
58
+
59
+ VALUE ph_resistance_get_rtd_wire_setup(VALUE self) {
60
+ return ph_get_int(get_ph_handle(self), (phidget_get_int_func)PhidgetResistanceInput_getRTDWireSetup);
61
+ }
62
+
63
+ VALUE ph_resistance_set_rtd_wire_setup(VALUE self, VALUE wire_setup) {
64
+ ph_raise(PhidgetResistanceInput_setRTDWireSetup((PhidgetResistanceInputHandle)get_ph_handle(self), NUM2INT(wire_setup)));
65
+ return Qnil;
66
+ }
67
+
68
+
69
+ void CCONV ph_resistance_on_resistance_change(PhidgetResistanceInputHandle phid, void *userPtr, double resistance) {
70
+ ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
71
+ while(sem_wait(&callback_data->handler_ready)!=0) {};
72
+ callback_data->arg1 = DBL2NUM(resistance);
73
+ callback_data->arg2 = Qnil;
74
+ callback_data->arg3 = Qnil;
75
+ callback_data->arg4 = Qnil;
76
+ sem_post(&callback_data->callback_called);
77
+ }
78
+
79
+
80
+ VALUE ph_resistance_set_on_resistance_change_handler(VALUE self, VALUE handler) {
81
+ ph_data_t *ph = get_ph_data(self);
82
+ ph_callback_data_t *callback_data = &ph->dev_callbacks[RESISTANCE_INPUT_RESISTANCE_CHANGE_CALLBACK];
83
+ if( TYPE(handler) == T_NIL ) {
84
+ callback_data->callback = T_NIL;
85
+ callback_data->exit = true;
86
+ ph_raise(PhidgetResistanceInput_setOnResistanceChangeHandler((PhidgetResistanceInputHandle)ph->handle, NULL, (void *)NULL));
87
+ sem_post(&callback_data->callback_called);
88
+ } else {
89
+ callback_data->exit = false;
90
+ callback_data->phidget = self;
91
+ callback_data->callback = handler;
92
+ ph_raise(PhidgetResistanceInput_setOnResistanceChangeHandler((PhidgetResistanceInputHandle)ph->handle, ph_resistance_on_resistance_change, (void *)callback_data));
93
+ ph_callback_thread(callback_data);
94
+ }
95
+ return Qnil;
96
+ }
97
+
98
+
99
+ void Init_resistance() {
100
+ VALUE ph_module = rb_const_get(rb_cObject, rb_intern("Phidgets"));
101
+ VALUE ph_common = rb_const_get(ph_module, rb_intern("Common"));
102
+ VALUE ph_resistance = rb_define_class_under(ph_module, "ResistanceInput", ph_common);
103
+
104
+ /* Document-method: new
105
+ * call-seq: new
106
+ *
107
+ * Creates a Phidget ResistanceInput object.
108
+ */
109
+ rb_define_method(ph_resistance, "initialize", ph_resistance_init, 0);
110
+
111
+ /* Document-method: getDataInterval
112
+ * call-seq: getDataInterval -> interval
113
+ *
114
+ * The DataInterval is the time that must elapse before the channel will fire another ResistanceChange event.
115
+ * The data interval is bounded by MinDataInterval and MaxDataInterval.
116
+ * The timing between ResistanceChange events can also affected by the ResistanceChangeTrigger.
117
+ */
118
+ rb_define_method(ph_resistance, "getDataInterval", ph_resistance_get_data_interval, 0);
119
+ rb_define_alias(ph_resistance, "data_interval", "getDataInterval");
120
+
121
+ /* Document-method: setDataInterval
122
+ * call-seq: setDataInterval(interval)
123
+ *
124
+ * The DataInterval is the time that must elapse before the channel will fire another ResistanceChange event.
125
+ * The data interval is bounded by MinDataInterval and MaxDataInterval.
126
+ * The timing between ResistanceChange events can also affected by the ResistanceChangeTrigger.
127
+ */
128
+ rb_define_method(ph_resistance, "setDataInterval", ph_resistance_set_data_interval, 1);
129
+ rb_define_alias(ph_resistance, "data_interval=", "setDataInterval");
130
+
131
+ /* Document-method: getMinDataInterval
132
+ * call-seq: getMinDataInterval -> interval
133
+ *
134
+ * The minimum value that DataInterval can be set to.
135
+ */
136
+ rb_define_method(ph_resistance, "getMinDataInterval", ph_resistance_get_min_data_interval, 0);
137
+ rb_define_alias(ph_resistance, "min_data_interval", "getMinDataInterval");
138
+
139
+ /* Document-method: getMaxDataInterval
140
+ * call-seq: getMaxDataInterval -> interval
141
+ *
142
+ * The maximum value that DataInterval can be set to.
143
+ */
144
+ rb_define_method(ph_resistance, "getMaxDataInterval", ph_resistance_get_max_data_interval, 0);
145
+ rb_define_alias(ph_resistance, "max_data_interval", "getMaxDataInterval");
146
+
147
+ /* Document-method: getResistance
148
+ * call-seq: getResistance -> resistance
149
+ *
150
+ * The most recent resistance value that the channel has reported.
151
+ * This value will always be between MinResistance and MaxResistance.
152
+ */
153
+ rb_define_method(ph_resistance, "getResistance", ph_resistance_get_resistance, 0);
154
+ rb_define_alias(ph_resistance, "resistance", "getResistance");
155
+
156
+ /* Document-method: getMinResistance
157
+ * call-seq: getMinResistance -> resistance
158
+ *
159
+ * The minimum value that the ResistanceChange event will report.
160
+ */
161
+ rb_define_method(ph_resistance, "getMinResistance", ph_resistance_get_min_resistance, 0);
162
+ rb_define_alias(ph_resistance, "min_resistance", "getMinResistance");
163
+
164
+ /* Document-method: getMaxResistance
165
+ * call-seq: getMaxResistance -> resistance
166
+ *
167
+ * The maximum value that the ResistanceChange event will report.
168
+ */
169
+ rb_define_method(ph_resistance, "getMaxResistance", ph_resistance_get_max_resistance, 0);
170
+ rb_define_alias(ph_resistance, "max_resistance", "getMaxResistance");
171
+
172
+ /* Document-method: getResistanceChangeTrigger
173
+ * call-seq: getResistanceChangeTrigger -> change_trigger
174
+ *
175
+ * The channel will not issue a ResistanceChange event until the resistance value has changed by the amount specified by the ResistanceChangeTrigger.
176
+ * Setting the ResistanceChangeTrigger to 0 will result in the channel firing events every DataInterval. This is useful for applications that implement their own data filtering.
177
+ */
178
+ rb_define_method(ph_resistance, "getResistanceChangeTrigger", ph_resistance_get_resistance_change_trigger, 0);
179
+ rb_define_alias(ph_resistance, "resistance_change_trigger", "getResistanceChangeTrigger");
180
+
181
+ /* Document-method: setResistanceChangeTrigger
182
+ * call-seq: setResistanceChangeTrigger(change_trigger)
183
+ *
184
+ * The channel will not issue a ResistanceChange event until the resistance value has changed by the amount specified by the ResistanceChangeTrigger.
185
+ * Setting the ResistanceChangeTrigger to 0 will result in the channel firing events every DataInterval. This is useful for applications that implement their own data filtering.
186
+ */
187
+ rb_define_method(ph_resistance, "setResistanceChangeTrigger", ph_resistance_set_resistance_change_trigger, 1);
188
+ rb_define_alias(ph_resistance, "resistance_change_trigger=", "setResistanceChangeTrigger");
189
+
190
+ /* Document-method: getMinResistanceChangeTrigger
191
+ * call-seq: getMinResistanceChangeTrigger -> change_trigger
192
+ *
193
+ * The minimum value that ResistanceChangeTrigger can be set to.
194
+ */
195
+ rb_define_method(ph_resistance, "getMinResistanceChangeTrigger", ph_resistance_get_min_resistance_change_trigger, 0);
196
+ rb_define_alias(ph_resistance, "min_resistance_change_trigger", "getMinResistanceChangeTrigger");
197
+
198
+ /* Document-method: getMaxResistanceChangeTrigger
199
+ * call-seq: getMaxResistanceChangeTrigger -> change_trigger
200
+ *
201
+ * The maximum value that ResistanceChangeTrigger can be set to.
202
+ */
203
+ rb_define_method(ph_resistance, "getMaxResistanceChangeTrigger", ph_resistance_get_max_resistance_change_trigger, 0);
204
+ rb_define_alias(ph_resistance, "max_resistance_change_trigger", "getMaxResistanceChangeTrigger");
205
+
206
+ /* Document-method: getRTDWireSetup
207
+ * call-seq: getRTDWireSetup -> wire_setup
208
+ *
209
+ * Select the RTD wiring configuration.
210
+ * More information about RTD wiring can be found in the user guide.
211
+ */
212
+ rb_define_method(ph_resistance, "getRTDWireSetup", ph_resistance_get_rtd_wire_setup, 0);
213
+ rb_define_alias(ph_resistance, "rtd_wire_setup", "getRTDWireSetup");
214
+
215
+ /* Document-method: setRTDWireSetup
216
+ * call-seq: setRTDWireSetup(wire_setup)
217
+ *
218
+ * Select the RTD wiring configuration.
219
+ * More information about RTD wiring can be found in the user guide.
220
+ */
221
+ rb_define_method(ph_resistance, "setRTDWireSetup", ph_resistance_set_rtd_wire_setup, 1);
222
+ rb_define_alias(ph_resistance, "rtd_wire_setup=", "setRTDWireSetup");
223
+
224
+
225
+ rb_define_private_method(ph_resistance, "ext_setOnResistanceChangeHandler", ph_resistance_set_on_resistance_change_handler, 1);
226
+ }
227
+
@@ -1,281 +1,167 @@
1
1
 
2
2
  #include "phidgets.h"
3
3
 
4
-
5
- VALUE ph_rfid_init(VALUE self);
6
- VALUE ph_rfid_get_output_count(VALUE self);
7
- VALUE ph_rfid_get_output_state(VALUE self, VALUE index);
8
- VALUE ph_rfid_set_output_state(VALUE self, VALUE index, VALUE state);
9
- VALUE ph_rfid_get_antenna_on(VALUE self);
10
- VALUE ph_rfid_set_antenna_on(VALUE self, VALUE on);
11
- VALUE ph_rfid_get_led_on(VALUE self);
12
- VALUE ph_rfid_set_led_on(VALUE self, VALUE on);
13
- VALUE ph_rfid_get_last_tag(VALUE self);
14
- VALUE ph_rfid_get_tag_status(VALUE self);
15
- VALUE ph_rfid_write(VALUE self, VALUE tag, VALUE protocol, VALUE lock);
16
-
17
- #ifdef PH_CALLBACK
18
- VALUE ph_rfid_set_on_tag_handler(VALUE self, VALUE handler);
19
- VALUE ph_rfid_set_on_tag_lost_handler(VALUE self, VALUE handler);
20
- VALUE ph_rfid_set_on_output_change_handler(VALUE self, VALUE handler);
21
- int ph_rfid_on_tag(CPhidgetRFIDHandle phid, void *userPtr, char *tagString, CPhidgetRFID_Protocol protocol);
22
- int ph_rfid_on_tag_lost(CPhidgetRFIDHandle phid, void *userPtr, char *tagString, CPhidgetRFID_Protocol protocol);
23
- int ph_rfid_on_output_change(CPhidgetRFIDHandle phid, void *userPtr, int index, int state);
24
- #endif
25
-
26
-
27
- void Init_rfid() {
28
- VALUE ph_module = rb_const_get(rb_cObject, rb_intern("Phidgets"));
29
- VALUE ph_common = rb_const_get(ph_module, rb_intern("Common"));
30
- VALUE ph_rfid = rb_define_class_under(ph_module, "RFID", ph_common);
31
-
32
- /* EM4100 (EM4102) 40-bit */
33
- rb_define_const(ph_rfid, "PROTOCOL_EM4100", INT2FIX(PHIDGET_RFID_PROTOCOL_EM4100));
34
- /* ISO11785 FDX-B encoding (Animal ID) */
35
- rb_define_const(ph_rfid, "PROTOCOL_ISO11785_FDX_B", INT2FIX(PHIDGET_RFID_PROTOCOL_ISO11785_FDX_B));
36
- /* PhidgetTAG Protocol 24 character ASCII */
37
- rb_define_const(ph_rfid, "PROTOCOL_PHIDGETS", INT2FIX(PHIDGET_RFID_PROTOCOL_PHIDGETS));
38
-
39
- /* Document-method: new
40
- * call-seq: new
41
- *
42
- * Creates a Phidget RFID object.
43
- */
44
- rb_define_method(ph_rfid, "initialize", ph_rfid_init, 0);
45
-
46
- /* Document-method: getOutputCount
47
- * call-seq: getOutputCount -> count
48
- *
49
- * Gets the number of outputs supported by this board.
50
- */
51
- rb_define_method(ph_rfid, "getOutputCount", ph_rfid_get_output_count, 0);
52
-
53
- /* Document-method: getOutputState
54
- * call-seq: getOutputState(index) -> true or false
55
- *
56
- * Gets the state of an output.
57
- */
58
- rb_define_method(ph_rfid, "getOutputState", ph_rfid_get_output_state, 1);
59
-
60
- /* Document-method: setOutputState
61
- * call-seq: setOutputState(index, state)
62
- *
63
- * Sets the state of an output.
64
- */
65
- rb_define_method(ph_rfid, "setOutputState", ph_rfid_set_output_state, 2);
66
-
67
- /* Document-method: getAntennaOn
68
- * call-seq: getAntennaOn -> true or false
69
- *
70
- * Gets the state of the antenna.
71
- */
72
- rb_define_method(ph_rfid, "getAntennaOn", ph_rfid_get_antenna_on, 0);
73
-
74
- /* Document-method: setAntennaOn
75
- * call-seq: setAntennaOn(state)
76
- *
77
- * Sets the state of the antenna. Note that the antenna must be enabled before tags will be read.
78
- */
79
- rb_define_method(ph_rfid, "setAntennaOn", ph_rfid_set_antenna_on, 1);
80
-
81
- /* Document-method: getLEDOn
82
- * call-seq: getLEDOn -> true or false
83
- *
84
- * Gets the state of the onboard LED.
85
- */
86
- rb_define_method(ph_rfid, "getLEDOn", ph_rfid_get_led_on, 0);
87
-
88
- /* Document-method: setLEDOn
89
- * call-seq: setLEDOn(state)
90
- *
91
- * Sets the state of the onboard LED.
92
- */
93
- rb_define_method(ph_rfid, "setLEDOn", ph_rfid_set_led_on, 1);
94
-
95
- /* Document-method: getLastTag
96
- * call-seq: getLastTag -> tag
97
- *
98
- * Gets the last tag read by the reader. This tag may or may not still be on the reader.
99
- */
100
- rb_define_method(ph_rfid, "getLastTag", ph_rfid_get_last_tag, 0);
101
-
102
- /* Document-method: getTagStatus
103
- * call-seq: getTagStatus -> true or false
104
- *
105
- * Gets the tag present status. This is whether or not a tag is being read by the reader.
106
- */
107
- rb_define_method(ph_rfid, "getTagStatus", ph_rfid_get_tag_status, 0);
108
-
109
- /* Document-method: write
110
- * call-seq: write(tag, protocol, lock)
111
- *
112
- * Program a tag. This requires a T5577 tag.
113
- */
114
- rb_define_method(ph_rfid, "write", ph_rfid_write, 3);
115
-
116
- #ifdef PH_CALLBACK
117
- rb_define_private_method(ph_rfid, "ext_setOnTagHandler", ph_rfid_set_on_tag_handler, 1);
118
- rb_define_private_method(ph_rfid, "ext_setOnTagLostHandler", ph_rfid_set_on_tag_lost_handler, 1);
119
- rb_define_private_method(ph_rfid, "ext_setOnOutputChangeHandler", ph_rfid_set_on_output_change_handler, 1);
120
- #endif
121
-
122
- rb_define_alias(ph_rfid, "output_count", "getOutputCount");
123
- rb_define_alias(ph_rfid, "output_state", "getOutputState");
124
- rb_define_alias(ph_rfid, "set_output_state", "setOutputState");
125
- rb_define_alias(ph_rfid, "antenna_on?", "getAntennaOn");
126
- rb_define_alias(ph_rfid, "antenna_on=", "setAntennaOn");
127
- rb_define_alias(ph_rfid, "led_on?", "getLEDOn");
128
- rb_define_alias(ph_rfid, "led_on=", "setLEDOn");
129
- rb_define_alias(ph_rfid, "last_tag", "getLastTag");
130
- rb_define_alias(ph_rfid, "tag_status", "getTagStatus");
131
- }
4
+ #define RFID_TAG_CALLBACK 0
5
+ #define RFID_TAG_LOST_CALLBACK 1
132
6
 
133
7
 
134
8
 
135
9
  VALUE ph_rfid_init(VALUE self) {
136
10
  ph_data_t *ph = get_ph_data(self);
137
- ph_raise(CPhidgetRFID_create((CPhidgetRFIDHandle *)(&(ph->handle))));
11
+ ph_raise(PhidgetRFID_create((PhidgetRFIDHandle *)(&(ph->handle))));
138
12
  return self;
139
13
  }
140
14
 
141
- VALUE ph_rfid_get_output_count(VALUE self) {
142
- CPhidgetRFIDHandle handle = (CPhidgetRFIDHandle)get_ph_handle(self);
143
- int count;
144
- ph_raise(CPhidgetRFID_getOutputCount(handle, &count));
145
- return INT2FIX(count);
15
+ VALUE ph_rfid_get_antenna_enabled(VALUE self) {
16
+ return ph_get_bool(get_ph_handle(self), (phidget_get_bool_func)PhidgetRFID_getAntennaEnabled);
146
17
  }
147
18
 
148
- VALUE ph_rfid_get_output_state(VALUE self, VALUE index) {
149
- CPhidgetRFIDHandle handle = (CPhidgetRFIDHandle)get_ph_handle(self);
150
- int state;
151
- ph_raise(CPhidgetRFID_getOutputState(handle, FIX2INT(index), &state));
152
- return state == PTRUE ? Qtrue : Qfalse;
153
- }
154
-
155
- VALUE ph_rfid_set_output_state(VALUE self, VALUE index, VALUE state) {
156
- CPhidgetRFIDHandle handle = (CPhidgetRFIDHandle)get_ph_handle(self);
157
- ph_raise(CPhidgetRFID_setOutputState(handle, FIX2INT(index), TYPE(state) == T_TRUE ? PTRUE : PFALSE));
19
+ VALUE ph_rfid_set_antenna_enabled(VALUE self, VALUE on) {
20
+ ph_raise(PhidgetRFID_setAntennaEnabled((PhidgetRFIDHandle)get_ph_handle(self), TYPE(on) == T_TRUE ? PTRUE : PFALSE));
158
21
  return Qnil;
159
22
  }
160
23
 
161
- VALUE ph_rfid_get_antenna_on(VALUE self) {
162
- CPhidgetRFIDHandle handle = (CPhidgetRFIDHandle)get_ph_handle(self);
163
- int on;
164
- ph_raise(CPhidgetRFID_getAntennaOn(handle, &on));
165
- return on == PTRUE ? Qtrue : Qfalse;
166
- }
167
-
168
- VALUE ph_rfid_set_antenna_on(VALUE self, VALUE on) {
169
- CPhidgetRFIDHandle handle = (CPhidgetRFIDHandle)get_ph_handle(self);
170
- ph_raise(CPhidgetRFID_setAntennaOn(handle, TYPE(on) == T_TRUE ? PTRUE : PFALSE));
171
- return Qnil;
24
+ VALUE ph_rfid_get_last_tag(VALUE self) {
25
+ char tag[256];
26
+ PhidgetRFID_Protocol protocol;
27
+ ph_raise(PhidgetRFID_getLastTag((PhidgetRFIDHandle)get_ph_handle(self), tag, 256, &protocol));
28
+ return rb_ary_new3(2, rb_str_new2(tag), INT2NUM(protocol));
172
29
  }
173
30
 
174
- VALUE ph_rfid_get_led_on(VALUE self) {
175
- CPhidgetRFIDHandle handle = (CPhidgetRFIDHandle)get_ph_handle(self);
176
- int on;
177
- ph_raise(CPhidgetRFID_getLEDOn(handle, &on));
178
- return on == PTRUE ? Qtrue : Qfalse;
31
+ VALUE ph_rfid_get_tag_present(VALUE self) {
32
+ return ph_get_bool(get_ph_handle(self), (phidget_get_bool_func)PhidgetRFID_getTagPresent);
179
33
  }
180
34
 
181
- VALUE ph_rfid_set_led_on(VALUE self, VALUE on) {
182
- CPhidgetRFIDHandle handle = (CPhidgetRFIDHandle)get_ph_handle(self);
183
- ph_raise(CPhidgetRFID_setLEDOn(handle, TYPE(on) == T_TRUE ? PTRUE : PFALSE));
35
+ VALUE ph_rfid_write(VALUE self, VALUE tag, VALUE protocol, VALUE lock) {
36
+ ph_raise(PhidgetRFID_write((PhidgetRFIDHandle)get_ph_handle(self), StringValueCStr(tag), NUM2INT(protocol), TYPE(lock) == T_TRUE ? PTRUE : PFALSE));
184
37
  return Qnil;
185
38
  }
186
39
 
187
- VALUE ph_rfid_get_last_tag(VALUE self) {
188
- CPhidgetRFIDHandle handle = (CPhidgetRFIDHandle)get_ph_handle(self);
189
- char *tag;
190
- CPhidgetRFID_Protocol protocol;
191
- ph_raise(CPhidgetRFID_getLastTag2(handle, &tag, &protocol));
192
- return rb_ary_new3(2, rb_str_new2(tag), INT2FIX(protocol));
193
- }
194
40
 
195
- VALUE ph_rfid_get_tag_status(VALUE self) {
196
- CPhidgetRFIDHandle handle = (CPhidgetRFIDHandle)get_ph_handle(self);
197
- int status;
198
- ph_raise(CPhidgetRFID_getTagStatus(handle, &status));
199
- return status == PTRUE ? Qtrue : Qfalse;
200
- }
201
-
202
- VALUE ph_rfid_write(VALUE self, VALUE tag, VALUE protocol, VALUE lock) {
203
- CPhidgetRFIDHandle handle = (CPhidgetRFIDHandle)get_ph_handle(self);
204
- ph_raise(CPhidgetRFID_write(handle, StringValueCStr(tag), FIX2INT(protocol), TYPE(lock) == T_TRUE ? PTRUE : PFALSE));
205
- return Qnil;
41
+ void CCONV ph_rfid_on_tag(PhidgetRFIDHandle phid, void *userPtr, const char *tagString, PhidgetRFID_Protocol protocol) {
42
+ ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
43
+ while(sem_wait(&callback_data->handler_ready)!=0) {};
44
+ callback_data->arg1 = rb_str_new2(tagString);
45
+ callback_data->arg2 = INT2NUM(protocol);
46
+ callback_data->arg3 = Qnil;
47
+ callback_data->arg4 = Qnil;
48
+ sem_post(&callback_data->callback_called);
206
49
  }
207
50
 
208
- #ifdef PH_CALLBACK
209
51
  VALUE ph_rfid_set_on_tag_handler(VALUE self, VALUE handler) {
210
52
  ph_data_t *ph = get_ph_data(self);
211
- ph_callback_data_t *callback_data = &ph->dev_callback_1;
53
+ ph_callback_data_t *callback_data = &ph->dev_callbacks[RFID_TAG_CALLBACK];
212
54
  if( TYPE(handler) == T_NIL ) {
55
+ callback_data->callback = T_NIL;
213
56
  callback_data->exit = true;
214
- ph_raise(CPhidgetRFID_set_OnTag2_Handler((CPhidgetRFIDHandle)ph->handle, NULL, (void *)NULL));
57
+ ph_raise(PhidgetRFID_setOnTagHandler((PhidgetRFIDHandle)ph->handle, NULL, (void *)NULL));
58
+ sem_post(&callback_data->callback_called);
215
59
  } else {
216
- callback_data->called = false;
217
60
  callback_data->exit = false;
218
61
  callback_data->phidget = self;
219
62
  callback_data->callback = handler;
220
- ph_raise(CPhidgetRFID_set_OnTag2_Handler((CPhidgetRFIDHandle)ph->handle, ph_rfid_on_tag, (void *)callback_data));
63
+ ph_raise(PhidgetRFID_setOnTagHandler((PhidgetRFIDHandle)ph->handle, ph_rfid_on_tag, (void *)callback_data));
221
64
  ph_callback_thread(callback_data);
222
65
  }
223
66
  return Qnil;
224
67
  }
225
68
 
226
- VALUE ph_rfid_set_on_tag_lost_handler(VALUE self, VALUE handler) {
227
- ph_data_t *ph = get_ph_data(self);
228
- ph_callback_data_t *callback_data = &ph->dev_callback_2;
229
- if( TYPE(handler) == T_NIL ) {
230
- callback_data->exit = true;
231
- ph_raise(CPhidgetRFID_set_OnTagLost2_Handler((CPhidgetRFIDHandle)ph->handle, NULL, (void *)NULL));
232
- } else {
233
- callback_data->called = false;
234
- callback_data->exit = false;
235
- callback_data->phidget = self;
236
- callback_data->callback = handler;
237
- ph_raise(CPhidgetRFID_set_OnTagLost2_Handler((CPhidgetRFIDHandle)ph->handle, ph_rfid_on_tag_lost, (void *)callback_data));
238
- ph_callback_thread(callback_data);
239
- }
240
- return Qnil;
69
+
70
+ void CCONV ph_rfid_on_tag_lost(PhidgetRFIDHandle phid, void *userPtr, const char *tagString, PhidgetRFID_Protocol protocol) {
71
+ ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
72
+ while(sem_wait(&callback_data->handler_ready)!=0) {};
73
+ callback_data->arg1 = rb_str_new2(tagString);
74
+ callback_data->arg2 = INT2NUM(protocol);
75
+ callback_data->arg3 = Qnil;
76
+ callback_data->arg4 = Qnil;
77
+ sem_post(&callback_data->callback_called);
241
78
  }
242
79
 
243
- VALUE ph_rfid_set_on_output_change_handler(VALUE self, VALUE handler) {
80
+ VALUE ph_rfid_set_on_tag_lost_handler(VALUE self, VALUE handler) {
244
81
  ph_data_t *ph = get_ph_data(self);
245
- ph_callback_data_t *callback_data = &ph->dev_callback_3;
82
+ ph_callback_data_t *callback_data = &ph->dev_callbacks[RFID_TAG_LOST_CALLBACK];
246
83
  if( TYPE(handler) == T_NIL ) {
84
+ callback_data->callback = T_NIL;
247
85
  callback_data->exit = true;
248
- ph_raise(CPhidgetRFID_set_OnOutputChange_Handler((CPhidgetRFIDHandle)ph->handle, NULL, (void *)NULL));
86
+ ph_raise(PhidgetRFID_setOnTagLostHandler((PhidgetRFIDHandle)ph->handle, NULL, (void *)NULL));
87
+ sem_post(&callback_data->callback_called);
249
88
  } else {
250
- callback_data->called = false;
251
89
  callback_data->exit = false;
252
90
  callback_data->phidget = self;
253
91
  callback_data->callback = handler;
254
- ph_raise(CPhidgetRFID_set_OnOutputChange_Handler((CPhidgetRFIDHandle)ph->handle, ph_rfid_on_output_change, (void *)callback_data));
92
+ ph_raise(PhidgetRFID_setOnTagLostHandler((PhidgetRFIDHandle)ph->handle, ph_rfid_on_tag, (void *)callback_data));
255
93
  ph_callback_thread(callback_data);
256
94
  }
257
95
  return Qnil;
258
96
  }
259
97
 
260
98
 
261
- int ph_rfid_on_tag(CPhidgetRFIDHandle phid, void *userPtr, char *tagString, CPhidgetRFID_Protocol protocol) {
262
- ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
263
- callback_data->called = true;
264
- return EPHIDGET_OK;
265
- }
99
+ void Init_rfid() {
100
+ VALUE ph_module = rb_const_get(rb_cObject, rb_intern("Phidgets"));
101
+ VALUE ph_common = rb_const_get(ph_module, rb_intern("Common"));
102
+ VALUE ph_rfid = rb_define_class_under(ph_module, "RFID", ph_common);
266
103
 
104
+ /* EM4100 (EM4102) 40-bit */
105
+ rb_define_const(ph_rfid, "PROTOCOL_EM4100", INT2NUM(PROTOCOL_EM4100));
106
+ /* ISO11785 FDX-B encoding (Animal ID) */
107
+ rb_define_const(ph_rfid, "PROTOCOL_ISO11785_FDX_B", INT2NUM(PROTOCOL_ISO11785_FDX_B));
108
+ /* PhidgetTAG Protocol 24 character ASCII */
109
+ rb_define_const(ph_rfid, "PROTOCOL_PHIDGETS", INT2NUM(PROTOCOL_PHIDGETS));
267
110
 
268
- int ph_rfid_on_tag_lost(CPhidgetRFIDHandle phid, void *userPtr, char *tagString, CPhidgetRFID_Protocol protocol) {
269
- ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
270
- callback_data->called = true;
271
- return EPHIDGET_OK;
272
- }
111
+ /* Document-method: new
112
+ * call-seq: new
113
+ *
114
+ * Creates a Phidget RFID object.
115
+ */
116
+ rb_define_method(ph_rfid, "initialize", ph_rfid_init, 0);
273
117
 
118
+ /* Document-method: getAntennaEnabled
119
+ * call-seq: getAntennaEnabled -> true or false
120
+ *
121
+ * The on/off state of the antenna.
122
+ * You can turn the antenna off to save power.
123
+ * You must turn the antenna on in order to detect and read RFID tags.
124
+ */
125
+ rb_define_method(ph_rfid, "getAntennaEnabled", ph_rfid_get_antenna_enabled, 0);
126
+ rb_define_alias(ph_rfid, "antenna_enabled?", "getAntennaEnabled");
274
127
 
275
- int ph_rfid_on_output_change(CPhidgetRFIDHandle phid, void *userPtr, int index, int state) {
276
- ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
277
- callback_data->called = true;
278
- return EPHIDGET_OK;
128
+ /* Document-method: setAntennaEnabled
129
+ * call-seq: setAntennaEnabled(state)
130
+ *
131
+ * The on/off state of the antenna.
132
+ * You can turn the antenna off to save power.
133
+ * You must turn the antenna on in order to detect and read RFID tags.
134
+ */
135
+ rb_define_method(ph_rfid, "setAntennaEnabled", ph_rfid_set_antenna_enabled, 1);
136
+ rb_define_alias(ph_rfid, "antenna_enabled=", "setAntennaEnabled");
137
+
138
+ /* Document-method: getLastTag
139
+ * call-seq: getLastTag -> tag
140
+ *
141
+ * Gets the most recently read tag's data, even if that tag is no longer within read range.
142
+ * Only valid after at least one tag has been read.
143
+ */
144
+ rb_define_method(ph_rfid, "getLastTag", ph_rfid_get_last_tag, 0);
145
+ rb_define_alias(ph_rfid, "last_tag", "getLastTag");
146
+
147
+ /* Document-method: getTagPresent
148
+ * call-seq: getTagPresent -> true or false
149
+ *
150
+ * This property is true if a compatibile RFID tag is being read by the reader.
151
+ * TagPresent will remain true until the tag is out of range and can no longer be read.
152
+ */
153
+ rb_define_method(ph_rfid, "getTagPresent", ph_rfid_get_tag_present, 0);
154
+ rb_define_alias(ph_rfid, "tag_present?", "getTagPresent");
155
+
156
+ /* Document-method: write
157
+ * call-seq: write(tag, protocol, lock)
158
+ *
159
+ * Writes data to the tag being currently read by the reader.
160
+ * You cannot write to a read-only or locked tag.
161
+ */
162
+ rb_define_method(ph_rfid, "write", ph_rfid_write, 3);
163
+
164
+ rb_define_private_method(ph_rfid, "ext_setOnTagHandler", ph_rfid_set_on_tag_handler, 1);
165
+ rb_define_private_method(ph_rfid, "ext_setOnTagLostHandler", ph_rfid_set_on_tag_lost_handler, 1);
279
166
  }
280
- #endif
281
167