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,200 @@
1
+
2
+ #include "phidgets.h"
3
+
4
+ #define PRESSURE_SENSOR_PRESSURE_CHANGE_CALLBACK 0
5
+
6
+
7
+ VALUE ph_pressure_init(VALUE self) {
8
+ ph_data_t *ph = get_ph_data(self);
9
+ ph_raise(PhidgetPressureSensor_create((PhidgetPressureSensorHandle *)(&(ph->handle))));
10
+ return self;
11
+ }
12
+
13
+ VALUE ph_pressure_get_data_interval(VALUE self) {
14
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetPressureSensor_getDataInterval);
15
+ }
16
+
17
+ VALUE ph_pressure_set_data_interval(VALUE self, VALUE interval) {
18
+ ph_raise(PhidgetPressureSensor_setDataInterval((PhidgetPressureSensorHandle)get_ph_handle(self), NUM2UINT(interval)));
19
+ return Qnil;
20
+ }
21
+
22
+ VALUE ph_pressure_get_min_data_interval(VALUE self) {
23
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetPressureSensor_getMinDataInterval);
24
+ }
25
+
26
+ VALUE ph_pressure_get_max_data_interval(VALUE self) {
27
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetPressureSensor_getMaxDataInterval);
28
+ }
29
+
30
+ VALUE ph_pressure_get_pressure(VALUE self) {
31
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetPressureSensor_getPressure);
32
+ }
33
+
34
+ VALUE ph_pressure_get_min_pressure(VALUE self) {
35
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetPressureSensor_getMinPressure);
36
+ }
37
+
38
+ VALUE ph_pressure_get_max_pressure(VALUE self) {
39
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetPressureSensor_getMaxPressure);
40
+ }
41
+
42
+ VALUE ph_pressure_get_pressure_change_trigger(VALUE self) {
43
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetPressureSensor_getPressureChangeTrigger);
44
+ }
45
+
46
+ VALUE ph_pressure_set_pressure_change_trigger(VALUE self, VALUE change_trigger) {
47
+ ph_raise(PhidgetPressureSensor_setPressureChangeTrigger((PhidgetPressureSensorHandle)get_ph_handle(self), NUM2DBL(change_trigger)));
48
+ return Qnil;
49
+ }
50
+
51
+ VALUE ph_pressure_get_min_pressure_change_trigger(VALUE self) {
52
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetPressureSensor_getMinPressureChangeTrigger);
53
+ }
54
+
55
+ VALUE ph_pressure_get_max_pressure_change_trigger(VALUE self) {
56
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetPressureSensor_getMaxPressureChangeTrigger);
57
+ }
58
+
59
+
60
+ void CCONV ph_pressure_on_pressure_change(PhidgetPressureSensorHandle phid, void *userPtr, double pressure) {
61
+ ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
62
+ while(sem_wait(&callback_data->handler_ready)!=0) {};
63
+ callback_data->arg1 = DBL2NUM(pressure);
64
+ callback_data->arg2 = Qnil;
65
+ callback_data->arg3 = Qnil;
66
+ callback_data->arg4 = Qnil;
67
+ sem_post(&callback_data->callback_called);
68
+ }
69
+
70
+
71
+ VALUE ph_pressure_set_on_pressure_change_handler(VALUE self, VALUE handler) {
72
+ ph_data_t *ph = get_ph_data(self);
73
+ ph_callback_data_t *callback_data = &ph->dev_callbacks[PRESSURE_SENSOR_PRESSURE_CHANGE_CALLBACK];
74
+ if( TYPE(handler) == T_NIL ) {
75
+ callback_data->callback = T_NIL;
76
+ callback_data->exit = true;
77
+ ph_raise(PhidgetPressureSensor_setOnPressureChangeHandler((PhidgetPressureSensorHandle)ph->handle, NULL, (void *)NULL));
78
+ sem_post(&callback_data->callback_called);
79
+ } else {
80
+ callback_data->exit = false;
81
+ callback_data->phidget = self;
82
+ callback_data->callback = handler;
83
+ ph_raise(PhidgetPressureSensor_setOnPressureChangeHandler((PhidgetPressureSensorHandle)ph->handle, ph_pressure_on_pressure_change, (void *)callback_data));
84
+ ph_callback_thread(callback_data);
85
+ }
86
+ return Qnil;
87
+ }
88
+
89
+
90
+ void Init_pressure() {
91
+ VALUE ph_module = rb_const_get(rb_cObject, rb_intern("Phidgets"));
92
+ VALUE ph_common = rb_const_get(ph_module, rb_intern("Common"));
93
+ VALUE ph_pressure = rb_define_class_under(ph_module, "PressureSensor", ph_common);
94
+
95
+ /* Document-method: new
96
+ * call-seq: new
97
+ *
98
+ * Creates a Phidget PressureSensor object.
99
+ */
100
+ rb_define_method(ph_pressure, "initialize", ph_pressure_init, 0);
101
+
102
+ /* Document-method: getDataInterval
103
+ * call-seq: getDataInterval -> interval
104
+ *
105
+ * The DataInterval is the time that must elapse before the channel will fire another PressureChange event.
106
+ * The data interval is bounded by MinDataInterval and MaxDataInterval.
107
+ * The timing between PressureChange events can also affected by the PressureChangeTrigger.
108
+ */
109
+ rb_define_method(ph_pressure, "getDataInterval", ph_pressure_get_data_interval, 0);
110
+ rb_define_alias(ph_pressure, "data_interval", "getDataInterval");
111
+
112
+ /* Document-method: setDataInterval
113
+ * call-seq: setDataInterval(interval)
114
+ *
115
+ * The DataInterval is the time that must elapse before the channel will fire another PressureChange event.
116
+ * The data interval is bounded by MinDataInterval and MaxDataInterval.
117
+ * The timing between PressureChange events can also affected by the PressureChangeTrigger.
118
+ */
119
+ rb_define_method(ph_pressure, "setDataInterval", ph_pressure_set_data_interval, 1);
120
+ rb_define_alias(ph_pressure, "data_interval=", "setDataInterval");
121
+
122
+ /* Document-method: getMinDataInterval
123
+ * call-seq: getMinDataInterval -> interval
124
+ *
125
+ * The minimum value that DataInterval can be set to.
126
+ */
127
+ rb_define_method(ph_pressure, "getMinDataInterval", ph_pressure_get_min_data_interval, 0);
128
+ rb_define_alias(ph_pressure, "min_data_interval", "getMinDataInterval");
129
+
130
+ /* Document-method: getMaxDataInterval
131
+ * call-seq: getMaxDataInterval -> interval
132
+ *
133
+ * The maximum value that DataInterval can be set to.
134
+ */
135
+ rb_define_method(ph_pressure, "getMaxDataInterval", ph_pressure_get_max_data_interval, 0);
136
+ rb_define_alias(ph_pressure, "max_data_interval", "getMaxDataInterval");
137
+
138
+ /* Document-method: getPressure
139
+ * call-seq: getPressure -> pressure
140
+ *
141
+ * The most recent pressure value that the channel has reported.
142
+ * This value will always be between MinPressure and MaxPressure.
143
+ */
144
+ rb_define_method(ph_pressure, "getPressure", ph_pressure_get_pressure, 0);
145
+ rb_define_alias(ph_pressure, "pressure", "getPressure");
146
+
147
+ /* Document-method: getMinPressure
148
+ * call-seq: getMinPressure -> pressure
149
+ *
150
+ * The minimum value that the PressureChange event will report.
151
+ */
152
+ rb_define_method(ph_pressure, "getMinPressure", ph_pressure_get_min_pressure, 0);
153
+ rb_define_alias(ph_pressure, "min_pressure", "getMinPressure");
154
+
155
+ /* Document-method: getMaxPressure
156
+ * call-seq: getMaxPressure -> pressure
157
+ *
158
+ * The maximum value that the PressureChange event will report.
159
+ */
160
+ rb_define_method(ph_pressure, "getMaxPressure", ph_pressure_get_max_pressure, 0);
161
+ rb_define_alias(ph_pressure, "max_pressure", "getMaxPressure");
162
+
163
+ /* Document-method: getPressureChangeTrigger
164
+ * call-seq: getPressureChangeTrigger -> change_trigger
165
+ *
166
+ * The channel will not issue a PressureChange event until the pressure value has changed by the amount specified by the PressureChangeTrigger.
167
+ * Setting the PressureChangeTrigger to 0 will result in the channel firing events every DataInterval. This is useful for applications that implement their own data filtering.
168
+ */
169
+ rb_define_method(ph_pressure, "getPressureChangeTrigger", ph_pressure_get_pressure_change_trigger, 0);
170
+ rb_define_alias(ph_pressure, "pressure_change_trigger", "getPressureChangeTrigger");
171
+
172
+ /* Document-method: setPressureChangeTrigger
173
+ * call-seq: setPressureChangeTrigger(change_trigger)
174
+ *
175
+ * The channel will not issue a PressureChange event until the pressure value has changed by the amount specified by the PressureChangeTrigger.
176
+ * Setting the PressureChangeTrigger 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_pressure, "setPressureChangeTrigger", ph_pressure_set_pressure_change_trigger, 1);
179
+ rb_define_alias(ph_pressure, "pressure_change_trigger=", "setPressureChangeTrigger");
180
+
181
+ /* Document-method: getMinPressureChangeTrigger
182
+ * call-seq: getMinPressureChangeTrigger -> change_trigger
183
+ *
184
+ * The minimum value that PressureChangeTrigger can be set to.
185
+ */
186
+ rb_define_method(ph_pressure, "getMinPressureChangeTrigger", ph_pressure_get_min_pressure_change_trigger, 0);
187
+ rb_define_alias(ph_pressure, "min_pressure_change_trigger", "getMinPressureChangeTrigger");
188
+
189
+ /* Document-method: getMaxPressureChangeTrigger
190
+ * call-seq: getMaxPressureChangeTrigger -> change_trigger
191
+ *
192
+ * The maximum value that PressureChangeTrigger can be set to.
193
+ */
194
+ rb_define_method(ph_pressure, "getMaxPressureChangeTrigger", ph_pressure_get_max_pressure_change_trigger, 0);
195
+ rb_define_alias(ph_pressure, "max_pressure_change_trigger", "getMaxPressureChangeTrigger");
196
+
197
+
198
+ rb_define_private_method(ph_pressure, "ext_setOnPressureChangeHandler", ph_pressure_set_on_pressure_change_handler, 1);
199
+ }
200
+
@@ -0,0 +1,672 @@
1
+
2
+ #include "phidgets.h"
3
+
4
+ #define RC_SERVO_POSITION_CHANGE_CALLBACK 0
5
+ #define RC_SERVO_TARGET_POSITION_REACHED_CALLBACK 1
6
+ #define RC_SERVO_VELOCITY_CHANGE_CALLBACK 2
7
+ #define RC_SERVO_TARGET_POSITION_ASYNC_CALLBACK 3
8
+
9
+
10
+
11
+ VALUE ph_rc_servo_init(VALUE self) {
12
+ ph_data_t *ph = get_ph_data(self);
13
+ ph_raise(PhidgetRCServo_create((PhidgetRCServoHandle *)(&(ph->handle))));
14
+ return self;
15
+ }
16
+
17
+ VALUE ph_rc_servo_get_acceleration(VALUE self) {
18
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getAcceleration);
19
+ }
20
+
21
+ VALUE ph_rc_servo_set_acceleration(VALUE self, VALUE acceleration) {
22
+ ph_raise(PhidgetRCServo_setAcceleration((PhidgetRCServoHandle)get_ph_handle(self), NUM2DBL(acceleration)));
23
+ return Qnil;
24
+ }
25
+
26
+ VALUE ph_rc_servo_get_min_acceleration(VALUE self) {
27
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getMinAcceleration);
28
+ }
29
+
30
+ VALUE ph_rc_servo_get_max_acceleration(VALUE self) {
31
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getMaxAcceleration);
32
+ }
33
+
34
+ VALUE ph_rc_servo_get_data_interval(VALUE self) {
35
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetRCServo_getDataInterval);
36
+ }
37
+
38
+ VALUE ph_rc_servo_set_data_interval(VALUE self, VALUE interval) {
39
+ ph_raise(PhidgetRCServo_setDataInterval((PhidgetRCServoHandle)get_ph_handle(self), NUM2UINT(interval)));
40
+ return Qnil;
41
+ }
42
+
43
+ VALUE ph_rc_servo_get_min_data_interval(VALUE self) {
44
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetRCServo_getMinDataInterval);
45
+ }
46
+
47
+ VALUE ph_rc_servo_get_max_data_interval(VALUE self) {
48
+ return ph_get_uint(get_ph_handle(self), (phidget_get_uint_func)PhidgetRCServo_getMaxDataInterval);
49
+ }
50
+
51
+ VALUE ph_rc_servo_get_engaged(VALUE self) {
52
+ return ph_get_bool(get_ph_handle(self), (phidget_get_bool_func)PhidgetRCServo_getEngaged);
53
+ }
54
+
55
+ VALUE ph_rc_servo_set_engaged(VALUE self, VALUE engaged) {
56
+ ph_raise(PhidgetRCServo_setEngaged((PhidgetRCServoHandle)get_ph_handle(self), TYPE(engaged) == T_TRUE ? PTRUE : PFALSE));
57
+ return Qnil;
58
+ }
59
+
60
+ VALUE ph_rc_servo_get_is_moving(VALUE self) {
61
+ return ph_get_bool(get_ph_handle(self), (phidget_get_bool_func)PhidgetRCServo_getIsMoving);
62
+ }
63
+
64
+ VALUE ph_rc_servo_get_position(VALUE self) {
65
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getPosition);
66
+ }
67
+
68
+ VALUE ph_rc_servo_get_min_position(VALUE self) {
69
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getMinPosition);
70
+ }
71
+
72
+ VALUE ph_rc_servo_set_min_position(VALUE self, VALUE position) {
73
+ ph_raise(PhidgetRCServo_setMinPosition((PhidgetRCServoHandle)get_ph_handle(self), NUM2DBL(position)));
74
+ return Qnil;
75
+ }
76
+
77
+ VALUE ph_rc_servo_get_max_position(VALUE self) {
78
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getMaxPosition);
79
+ }
80
+
81
+ VALUE ph_rc_servo_set_max_position(VALUE self, VALUE position) {
82
+ ph_raise(PhidgetRCServo_setMaxPosition((PhidgetRCServoHandle)get_ph_handle(self), NUM2DBL(position)));
83
+ return Qnil;
84
+ }
85
+
86
+ VALUE ph_rc_servo_get_min_pulse_width(VALUE self) {
87
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getMinPulseWidth);
88
+ }
89
+
90
+ VALUE ph_rc_servo_set_min_pulse_width(VALUE self, VALUE pulse_width) {
91
+ ph_raise(PhidgetRCServo_setMinPulseWidth((PhidgetRCServoHandle)get_ph_handle(self), NUM2DBL(pulse_width)));
92
+ return Qnil;
93
+ }
94
+
95
+ VALUE ph_rc_servo_get_max_pulse_width(VALUE self) {
96
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getMaxPulseWidth);
97
+ }
98
+
99
+ VALUE ph_rc_servo_set_max_pulse_width(VALUE self, VALUE pulse_width) {
100
+ ph_raise(PhidgetRCServo_setMaxPulseWidth((PhidgetRCServoHandle)get_ph_handle(self), NUM2DBL(pulse_width)));
101
+ return Qnil;
102
+ }
103
+
104
+ VALUE ph_rc_servo_get_min_pulse_width_limit(VALUE self) {
105
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getMinPulseWidthLimit);
106
+ }
107
+
108
+ VALUE ph_rc_servo_get_max_pulse_width_limit(VALUE self) {
109
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getMaxPulseWidthLimit);
110
+ }
111
+
112
+ VALUE ph_rc_servo_get_speed_ramping_state(VALUE self) {
113
+ return ph_get_bool(get_ph_handle(self), (phidget_get_bool_func)PhidgetRCServo_getSpeedRampingState);
114
+ }
115
+
116
+ VALUE ph_rc_servo_set_speed_ramping_state(VALUE self, VALUE speed_ramping_state) {
117
+ ph_raise(PhidgetRCServo_setSpeedRampingState((PhidgetRCServoHandle)get_ph_handle(self), TYPE(speed_ramping_state) == T_TRUE ? PTRUE : PFALSE));
118
+ return Qnil;
119
+ }
120
+
121
+ VALUE ph_rc_servo_get_target_position(VALUE self) {
122
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getTargetPosition);
123
+ }
124
+
125
+ VALUE ph_rc_servo_set_target_position(VALUE self, VALUE position) {
126
+ ph_raise(PhidgetRCServo_setTargetPosition((PhidgetRCServoHandle)get_ph_handle(self), NUM2DBL(position)));
127
+ return Qnil;
128
+ }
129
+
130
+ VALUE ph_rc_servo_get_torque(VALUE self) {
131
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getTorque);
132
+ }
133
+
134
+ VALUE ph_rc_servo_set_torque(VALUE self, VALUE torque) {
135
+ ph_raise(PhidgetRCServo_setTorque((PhidgetRCServoHandle)get_ph_handle(self), NUM2DBL(torque)));
136
+ return Qnil;
137
+ }
138
+
139
+ VALUE ph_rc_servo_get_min_torque(VALUE self) {
140
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getMinTorque);
141
+ }
142
+
143
+ VALUE ph_rc_servo_get_max_torque(VALUE self) {
144
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getMaxTorque);
145
+ }
146
+
147
+ VALUE ph_rc_servo_get_velocity(VALUE self) {
148
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getVelocity);
149
+ }
150
+
151
+ VALUE ph_rc_servo_get_velocity_limit(VALUE self) {
152
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getVelocityLimit);
153
+ }
154
+
155
+ VALUE ph_rc_servo_set_velocity_limit(VALUE self, VALUE velocity_limit) {
156
+ ph_raise(PhidgetRCServo_setVelocityLimit((PhidgetRCServoHandle)get_ph_handle(self), NUM2DBL(velocity_limit)));
157
+ return Qnil;
158
+ }
159
+
160
+ VALUE ph_rc_servo_get_min_velocity_limit(VALUE self) {
161
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getMinVelocityLimit);
162
+ }
163
+
164
+ VALUE ph_rc_servo_get_max_velocity_limit(VALUE self) {
165
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getMaxVelocityLimit);
166
+ }
167
+
168
+ VALUE ph_rc_servo_get_voltage(VALUE self) {
169
+ return ph_get_double(get_ph_handle(self), (phidget_get_double_func)PhidgetRCServo_getVoltage);
170
+ }
171
+
172
+ VALUE ph_rc_servo_set_voltage(VALUE self, VALUE voltage) {
173
+ ph_raise(PhidgetRCServo_setVoltage((PhidgetRCServoHandle)get_ph_handle(self), NUM2DBL(voltage)));
174
+ return Qnil;
175
+ }
176
+
177
+
178
+ void CCONV ph_rc_servo_on_position_change(PhidgetRCServoHandle phid, void *userPtr, double position) {
179
+ ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
180
+ while(sem_wait(&callback_data->handler_ready)!=0) {};
181
+ callback_data->arg1 = DBL2NUM(position);
182
+ callback_data->arg2 = Qnil;
183
+ callback_data->arg3 = Qnil;
184
+ callback_data->arg4 = Qnil;
185
+ sem_post(&callback_data->callback_called);
186
+ }
187
+
188
+
189
+ VALUE ph_rc_servo_set_on_position_change_handler(VALUE self, VALUE handler) {
190
+ ph_data_t *ph = get_ph_data(self);
191
+ ph_callback_data_t *callback_data = &ph->dev_callbacks[RC_SERVO_POSITION_CHANGE_CALLBACK];
192
+ if( TYPE(handler) == T_NIL ) {
193
+ callback_data->callback = T_NIL;
194
+ callback_data->exit = true;
195
+ ph_raise(PhidgetRCServo_setOnPositionChangeHandler((PhidgetRCServoHandle)ph->handle, NULL, (void *)NULL));
196
+ sem_post(&callback_data->callback_called);
197
+ } else {
198
+ callback_data->exit = false;
199
+ callback_data->phidget = self;
200
+ callback_data->callback = handler;
201
+ ph_raise(PhidgetRCServo_setOnPositionChangeHandler((PhidgetRCServoHandle)ph->handle, ph_rc_servo_on_position_change, (void *)callback_data));
202
+ ph_callback_thread(callback_data);
203
+ }
204
+ return Qnil;
205
+ }
206
+
207
+
208
+ void CCONV ph_rc_servo_on_target_position_reached(PhidgetRCServoHandle phid, void *userPtr, double position) {
209
+ ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
210
+ while(sem_wait(&callback_data->handler_ready)!=0) {};
211
+ callback_data->arg1 = DBL2NUM(position);
212
+ callback_data->arg2 = Qnil;
213
+ callback_data->arg3 = Qnil;
214
+ callback_data->arg4 = Qnil;
215
+ sem_post(&callback_data->callback_called);
216
+ }
217
+
218
+
219
+ VALUE ph_rc_servo_set_on_target_position_reached_handler(VALUE self, VALUE handler) {
220
+ ph_data_t *ph = get_ph_data(self);
221
+ ph_callback_data_t *callback_data = &ph->dev_callbacks[RC_SERVO_TARGET_POSITION_REACHED_CALLBACK];
222
+ if( TYPE(handler) == T_NIL ) {
223
+ callback_data->callback = T_NIL;
224
+ callback_data->exit = true;
225
+ ph_raise(PhidgetRCServo_setOnTargetPositionReachedHandler((PhidgetRCServoHandle)ph->handle, NULL, (void *)NULL));
226
+ sem_post(&callback_data->callback_called);
227
+ } else {
228
+ callback_data->exit = false;
229
+ callback_data->phidget = self;
230
+ callback_data->callback = handler;
231
+ ph_raise(PhidgetRCServo_setOnTargetPositionReachedHandler((PhidgetRCServoHandle)ph->handle, ph_rc_servo_on_target_position_reached, (void *)callback_data));
232
+ ph_callback_thread(callback_data);
233
+ }
234
+ return Qnil;
235
+ }
236
+
237
+
238
+ void CCONV ph_rc_servo_on_velocity_change(PhidgetRCServoHandle phid, void *userPtr, double velocity) {
239
+ ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
240
+ while(sem_wait(&callback_data->handler_ready)!=0) {};
241
+ callback_data->arg1 = DBL2NUM(velocity);
242
+ callback_data->arg2 = Qnil;
243
+ callback_data->arg3 = Qnil;
244
+ callback_data->arg4 = Qnil;
245
+ sem_post(&callback_data->callback_called);
246
+ }
247
+
248
+
249
+ VALUE ph_rc_servo_set_on_velocity_change_handler(VALUE self, VALUE handler) {
250
+ ph_data_t *ph = get_ph_data(self);
251
+ ph_callback_data_t *callback_data = &ph->dev_callbacks[RC_SERVO_VELOCITY_CHANGE_CALLBACK];
252
+ if( TYPE(handler) == T_NIL ) {
253
+ callback_data->callback = T_NIL;
254
+ callback_data->exit = true;
255
+ ph_raise(PhidgetRCServo_setOnVelocityChangeHandler((PhidgetRCServoHandle)ph->handle, NULL, (void *)NULL));
256
+ sem_post(&callback_data->callback_called);
257
+ } else {
258
+ callback_data->exit = false;
259
+ callback_data->phidget = self;
260
+ callback_data->callback = handler;
261
+ ph_raise(PhidgetRCServo_setOnVelocityChangeHandler((PhidgetRCServoHandle)ph->handle, ph_rc_servo_on_velocity_change, (void *)callback_data));
262
+ ph_callback_thread(callback_data);
263
+ }
264
+ return Qnil;
265
+ }
266
+
267
+
268
+ void CCONV ph_rc_servo_target_position_async(PhidgetHandle phid, void *userPtr, PhidgetReturnCode res) {
269
+ ph_callback_data_t *callback_data = ((ph_callback_data_t *)userPtr);
270
+ callback_data->exit = true;
271
+ callback_data->arg1 = INT2NUM(res);
272
+ callback_data->arg2 = Qnil;
273
+ callback_data->arg3 = Qnil;
274
+ callback_data->arg4 = Qnil;
275
+ sem_post(&callback_data->callback_called);
276
+ }
277
+
278
+
279
+ VALUE ph_rc_servo_set_target_position_async(VALUE self, VALUE position, VALUE handler) {
280
+ ph_data_t *ph = get_ph_data(self);
281
+ ph_callback_data_t *callback_data = &ph->dev_callbacks[RC_SERVO_TARGET_POSITION_ASYNC_CALLBACK];
282
+ if( TYPE(handler) == T_NIL ) {
283
+ PhidgetRCServo_setTargetPosition_async((PhidgetRCServoHandle)ph->handle, NUM2DBL(position), NULL, (void *)NULL);
284
+ } else {
285
+ callback_data->exit = false;
286
+ callback_data->phidget = self;
287
+ callback_data->callback = handler;
288
+ PhidgetRCServo_setTargetPosition_async((PhidgetRCServoHandle)ph->handle, NUM2DBL(position), ph_rc_servo_target_position_async, (void *)callback_data);
289
+ ph_callback_thread(callback_data);
290
+ }
291
+ return Qnil;
292
+ }
293
+
294
+
295
+ void Init_rc_servo() {
296
+ VALUE ph_module = rb_const_get(rb_cObject, rb_intern("Phidgets"));
297
+ VALUE ph_common = rb_const_get(ph_module, rb_intern("Common"));
298
+ VALUE ph_rc_servo = rb_define_class_under(ph_module, "RCServo", ph_common);
299
+
300
+ /* Document-method: new
301
+ * call-seq: new
302
+ *
303
+ * Creates a Phidget RCServo object.
304
+ */
305
+ rb_define_method(ph_rc_servo, "initialize", ph_rc_servo_init, 0);
306
+
307
+ /* Document-method: getAcceleration
308
+ * call-seq: getAcceleration -> acceleration
309
+ *
310
+ * When changing velocity, the RC servo motor will accelerate/decelerate at this rate.
311
+ * The acceleration is bounded by MaxAcceleration and MinAcceleration.
312
+ * SpeedRampingState controls whether or not the acceleration value is actually applied when trying to reach a target position.
313
+ * There is a practical limit on how fast your RC servo motor can accelerate. This is based on the load and physical design of the motor.
314
+ * The units for Position,Velocity, and Acceleration are configured by scaling the internal timing (set with MinPulseWidth and MaxPulseWidth) to a user specified range with MinPosition and MaxPosition.
315
+ */
316
+ rb_define_method(ph_rc_servo, "getAcceleration", ph_rc_servo_get_acceleration, 0);
317
+ rb_define_alias(ph_rc_servo, "acceleration", "getAcceleration");
318
+
319
+ /* Document-method: setAcceleration
320
+ * call-seq: setAcceleration(acceleration)
321
+ *
322
+ * When changing velocity, the RC servo motor will accelerate/decelerate at this rate.
323
+ * The acceleration is bounded by MaxAcceleration and MinAcceleration.
324
+ * SpeedRampingState controls whether or not the acceleration value is actually applied when trying to reach a target position.
325
+ * There is a practical limit on how fast your RC servo motor can accelerate. This is based on the load and physical design of the motor.
326
+ * The units for Position,Velocity, and Acceleration are configured by scaling the internal timing (set with MinPulseWidth and MaxPulseWidth) to a user specified range with MinPosition and MaxPosition.
327
+ */
328
+ rb_define_method(ph_rc_servo, "setAcceleration", ph_rc_servo_set_acceleration, 1);
329
+ rb_define_alias(ph_rc_servo, "acceleration=", "setAcceleration");
330
+
331
+ /* Document-method: getMinAcceleration
332
+ * call-seq: getMinAcceleration -> acceleration
333
+ *
334
+ * The minimum value that Acceleration can be set to
335
+ * This value depends on MinPosition/MaxPosition and MinPulseWidth/MaxPulseWidth.
336
+ */
337
+ rb_define_method(ph_rc_servo, "getMinAcceleration", ph_rc_servo_get_min_acceleration, 0);
338
+ rb_define_alias(ph_rc_servo, "min_acceleration", "getMinAcceleration");
339
+
340
+ /* Document-method: getMaxAcceleration
341
+ * call-seq: getMaxAcceleration -> acceleration
342
+ *
343
+ * The maximum acceleration that Acceleration can be set to.
344
+ * This value depends on MinPosition/MaxPosition and MinPulseWidth/MaxPulseWidth.
345
+ */
346
+ rb_define_method(ph_rc_servo, "getMaxAcceleration", ph_rc_servo_get_max_acceleration, 0);
347
+ rb_define_alias(ph_rc_servo, "max_acceleration", "getMaxAcceleration");
348
+
349
+ /* Document-method: getDataInterval
350
+ * call-seq: getDataInterval -> data_interval
351
+ *
352
+ * The DataInterval is the time that must elapse before the controller will fire another PositionChange event.
353
+ * The data interval is bounded by MinDataInterval and MaxDataInterval.
354
+ */
355
+ rb_define_method(ph_rc_servo, "getDataInterval", ph_rc_servo_get_data_interval, 0);
356
+ rb_define_alias(ph_rc_servo, "data_interval", "getDataInterval");
357
+
358
+ /* Document-method: setDataInterval
359
+ * call-seq: setDataInterval(data_interval)
360
+ *
361
+ * The DataInterval is the time that must elapse before the controller will fire another PositionChange event.
362
+ * The data interval is bounded by MinDataInterval and MaxDataInterval.
363
+ */
364
+ rb_define_method(ph_rc_servo, "setDataInterval", ph_rc_servo_set_data_interval, 1);
365
+ rb_define_alias(ph_rc_servo, "data_interval=", "setDataInterval");
366
+
367
+ /* Document-method: getMinDataInterval
368
+ * call-seq: getMinDataInterval -> data_interval
369
+ *
370
+ * The DataInterval is the time that must elapse before the controller will fire another PositionChange event.
371
+ * The data interval is bounded by MinDataInterval and MaxDataInterval.
372
+ */
373
+ rb_define_method(ph_rc_servo, "getMinDataInterval", ph_rc_servo_get_min_data_interval, 0);
374
+ rb_define_alias(ph_rc_servo, "min_data_interval", "getMinDataInterval");
375
+
376
+ /* Document-method: getMaxDataInterval
377
+ * call-seq: getMaxDataInterval -> data_interval
378
+ *
379
+ * The DataInterval is the time that must elapse before the controller will fire another PositionChange event.
380
+ * The data interval is bounded by MinDataInterval and MaxDataInterval.
381
+ */
382
+ rb_define_method(ph_rc_servo, "getMaxDataInterval", ph_rc_servo_get_max_data_interval, 0);
383
+ rb_define_alias(ph_rc_servo, "max_data_interval", "getMaxDataInterval");
384
+
385
+ /* Document-method: getEngaged
386
+ * call-seq: getEngaged -> true or false
387
+ *
388
+ * When engaged, a RC servo motor has the ability to be positioned. When disengaged, no commands are sent to the RC servo motor.
389
+ * There is no position feedback to the controller, so the RC servo motor will immediately snap to the TargetPosition after being engaged from a disengaged state.
390
+ * This property is useful for relaxing a servo once it has reached a given position.
391
+ * If you are concerned about tracking position accurately, you should not disengage the motor while IsMoving is true.
392
+ */
393
+ rb_define_method(ph_rc_servo, "getEngaged", ph_rc_servo_get_engaged, 0);
394
+ rb_define_alias(ph_rc_servo, "engaged?", "getEngaged");
395
+
396
+ /* Document-method: setEngaged
397
+ * call-seq: setEngaged(state)
398
+ *
399
+ * When engaged, a RC servo motor has the ability to be positioned. When disengaged, no commands are sent to the RC servo motor.
400
+ * There is no position feedback to the controller, so the RC servo motor will immediately snap to the TargetPosition after being engaged from a disengaged state.
401
+ * This property is useful for relaxing a servo once it has reached a given position.
402
+ * If you are concerned about tracking position accurately, you should not disengage the motor while IsMoving is true.
403
+ */
404
+ rb_define_method(ph_rc_servo, "setEngaged", ph_rc_servo_set_engaged, 1);
405
+ rb_define_alias(ph_rc_servo, "engaged=", "setEngaged");
406
+
407
+ /* Document-method: getIsMoving
408
+ * call-seq: getIsMoving -> true or false
409
+ *
410
+ * IsMoving returns true if the RC servo motor is currently in motion.
411
+ * The controller cannot know if the RC servo motor is physically moving. When < code > IsMoving is false, it simply means there are no commands in the pipeline to the RC servo motor.
412
+ */
413
+ rb_define_method(ph_rc_servo, "getIsMoving", ph_rc_servo_get_is_moving, 0);
414
+ rb_define_alias(ph_rc_servo, "is_moving?", "getIsMoving");
415
+
416
+ /* Document-method: getPosition
417
+ * call-seq: getPosition -> position
418
+ *
419
+ * The most recent position of the RC servo motor that the controller has reported.
420
+ * This value will always be between MinPosition and MaxPosition.
421
+ */
422
+ rb_define_method(ph_rc_servo, "getPosition", ph_rc_servo_get_position, 0);
423
+ rb_define_alias(ph_rc_servo, "position", "getPosition");
424
+
425
+ /* Document-method: getMinPosition
426
+ * call-seq: getMinPosition -> position
427
+ *
428
+ * The minimum position that TargetPosition can be set to.
429
+ * The units for Position,Velocity, and Acceleration are configured by scaling the internal timing (set with MinPulseWidth and MaxPulseWidth) to a user specified range with MinPosition and MaxPosition.
430
+ */
431
+ rb_define_method(ph_rc_servo, "getMinPosition", ph_rc_servo_get_min_position, 0);
432
+ rb_define_alias(ph_rc_servo, "min_position", "getMinPosition");
433
+
434
+ /* Document-method: setMinPosition
435
+ * call-seq: setMinPosition(position)
436
+ *
437
+ * The minimum position that TargetPosition can be set to.
438
+ * The units for Position,Velocity, and Acceleration are configured by scaling the internal timing (set with MinPulseWidth and MaxPulseWidth) to a user specified range with MinPosition and MaxPosition.
439
+ */
440
+ rb_define_method(ph_rc_servo, "setMinPosition", ph_rc_servo_set_min_position, 1);
441
+ rb_define_alias(ph_rc_servo, "min_position=", "setMinPosition");
442
+
443
+ /* Document-method: getMaxPosition
444
+ * call-seq: getMaxPosition -> position
445
+ *
446
+ * The maximum position TargetPosition can be set to.
447
+ * The units for Position,Velocity, and Acceleration are configured by scaling the internal timing (set with MinPulseWidth and MaxPulseWidth) to a user specified range with MinPosition and MaxPosition.
448
+ */
449
+ rb_define_method(ph_rc_servo, "getMaxPosition", ph_rc_servo_get_max_position, 0);
450
+ rb_define_alias(ph_rc_servo, "max_position", "getMaxPosition");
451
+
452
+ /* Document-method: setMaxPosition
453
+ * call-seq: setMaxPosition(position)
454
+ *
455
+ * The maximum position that TargetPosition can be set to.
456
+ * The units for Position,Velocity, and Acceleration are configured by scaling the internal timing (set with MinPulseWidth and MaxPulseWidth) to a user specified range with MinPosition and MaxPosition.
457
+ */
458
+ rb_define_method(ph_rc_servo, "setMaxPosition", ph_rc_servo_set_max_position, 1);
459
+ rb_define_alias(ph_rc_servo, "max_position=", "setMaxPosition");
460
+
461
+ /* Document-method: getMinPulseWidth
462
+ * call-seq: getMinPulseWidth -> pulse_width
463
+ *
464
+ * The MinPulseWidth represents the minimum pulse width that your RC servo motor specifies.
465
+ * This value can be found in the data sheet of most RC servo motors.
466
+ * The units for Position,Velocity, and Acceleration are configured by scaling the internal timing (set with MinPulseWidth and MaxPulseWidth) to a user specified range with MinPosition and MaxPosition.
467
+ */
468
+ rb_define_method(ph_rc_servo, "getMinPulseWidth", ph_rc_servo_get_min_pulse_width, 0);
469
+ rb_define_alias(ph_rc_servo, "min_pulse_width", "getMinPulseWidth");
470
+
471
+ /* Document-method: setMinPulseWidth
472
+ * call-seq: setMinPulseWidth(pulse_width)
473
+ *
474
+ * The MinPulseWidth represents the minimum pulse width that your RC servo motor specifies.
475
+ * This value can be found in the data sheet of most RC servo motors.
476
+ * The units for Position,Velocity, and Acceleration are configured by scaling the internal timing (set with MinPulseWidth and MaxPulseWidth) to a user specified range with MinPosition and MaxPosition.
477
+ */
478
+ rb_define_method(ph_rc_servo, "setMinPulseWidth", ph_rc_servo_set_min_pulse_width, 1);
479
+ rb_define_alias(ph_rc_servo, "min_pulse_width=", "setMinPulseWidth");
480
+
481
+ /* Document-method: getMaxPulseWidth
482
+ * call-seq: getMaxPulseWidth -> pulse_width
483
+ *
484
+ * The MaxPulseWidth represents the maximum pulse width that your RC servo motor specifies.
485
+ * This value can be found in the data sheet of most RC servo motors.
486
+ * The units for Position,Velocity, and Acceleration are configured by scaling the internal timing (set with MinPulseWidth and MaxPulseWidth) to a user specified range with MinPosition and MaxPosition.
487
+ */
488
+ rb_define_method(ph_rc_servo, "getMaxPulseWidth", ph_rc_servo_get_max_pulse_width, 0);
489
+ rb_define_alias(ph_rc_servo, "max_pulse_width", "getMaxPulseWidth");
490
+
491
+ /* Document-method: setMaxPulseWidth
492
+ * call-seq: setMaxPulseWidth(pulse_width)
493
+ *
494
+ * The MaxPulseWidth represents the maximum pulse width that your RC servo motor specifies.
495
+ * This value can be found in the data sheet of most RC servo motors.
496
+ * The units for Position,Velocity, and Acceleration are configured by scaling the internal timing (set with MinPulseWidth and MaxPulseWidth) to a user specified range with MinPosition and MaxPosition.
497
+ */
498
+ rb_define_method(ph_rc_servo, "setMaxPulseWidth", ph_rc_servo_set_max_pulse_width, 1);
499
+ rb_define_alias(ph_rc_servo, "max_pulse_width=", "setMaxPulseWidth");
500
+
501
+ /* Document-method: getMinPulseWidthLimit
502
+ * call-seq: getMinPulseWidthLimit -> pulse_width
503
+ *
504
+ * The minimum pulse width that MinPulseWidth can be set to.
505
+ */
506
+ rb_define_method(ph_rc_servo, "getMinPulseWidthLimit", ph_rc_servo_get_min_pulse_width_limit, 0);
507
+ rb_define_alias(ph_rc_servo, "min_pulse_width_limit", "getMinPulseWidthLimit");
508
+
509
+ /* Document-method: getMaxPulseWidthLimit
510
+ * call-seq: getMaxPulseWidthLimit -> pulse_width
511
+ *
512
+ * The maximum pulse width that MaxPulseWidth can be set to.
513
+ */
514
+ rb_define_method(ph_rc_servo, "getMaxPulseWidthLimit", ph_rc_servo_get_max_pulse_width_limit, 0);
515
+ rb_define_alias(ph_rc_servo, "max_pulse_width_limit", "getMaxPulseWidthLimit");
516
+
517
+ /* Document-method: getSpeedRampingState
518
+ * call-seq: getSpeedRampingState -> ramping_state
519
+ *
520
+ * When speed ramping state is enabled, the controller will take the Acceleration and Velocity properties into account when moving the
521
+ * RC servo motor, usually resulting in smooth motion. If speed ramping state is not enabled, the controller will simply set the RC servo motor to the requested position.
522
+ */
523
+ rb_define_method(ph_rc_servo, "getSpeedRampingState", ph_rc_servo_get_speed_ramping_state, 0);
524
+ rb_define_alias(ph_rc_servo, "speed_ramping_state", "getSpeedRampingState");
525
+
526
+ /* Document-method: setSpeedRampingState
527
+ * call-seq: setSpeedRampingState(ramping_state)
528
+ *
529
+ * When speed ramping state is enabled, the controller will take the Acceleration and Velocity properties into account when moving the
530
+ * RC servo motor, usually resulting in smooth motion. If speed ramping state is not enabled, the controller will simply set the RC servo motor to the requested position.
531
+ */
532
+ rb_define_method(ph_rc_servo, "setSpeedRampingState", ph_rc_servo_set_speed_ramping_state, 1);
533
+ rb_define_alias(ph_rc_servo, "speed_ramping_state=", "setSpeedRampingState");
534
+
535
+ /* Document-method: getTargetPosition
536
+ * call-seq: getTargetPosition -> position
537
+ *
538
+ * If the RC servo motor is configured and TargetPosition is set, the controller will continuously try to reach targeted position.
539
+ * The target position is bounded by MinPosition and MaxPosition.
540
+ * If the RC servo motor is not engaged, then the position cannot be read.
541
+ * The position can still be set while the RC servo motor is not engaged. Once engaged, the RC servo motor will snap to position, assuming it is not there already.
542
+ * The units for Position,Velocity, and Acceleration are configured by scaling the internal timing (set with MinPulseWidth and MaxPulseWidth) to a user specified range with MinPosition and MaxPosition.
543
+ */
544
+ rb_define_method(ph_rc_servo, "getTargetPosition", ph_rc_servo_get_target_position, 0);
545
+ rb_define_alias(ph_rc_servo, "target_position", "getTargetPosition");
546
+
547
+ /* Document-method: setTargetPosition
548
+ * call-seq: setTargetPosition(position)
549
+ *
550
+ * If the RC servo motor is configured and TargetPosition is set, the controller will continuously try to reach targeted position.
551
+ * The target position is bounded by MinPosition and MaxPosition.
552
+ * If the RC servo motor is not engaged, then the position cannot be read.
553
+ * The position can still be set while the RC servo motor is not engaged. Once engaged, the RC servo motor will snap to position, assuming it is not there already.
554
+ * The units for Position,Velocity, and Acceleration are configured by scaling the internal timing (set with MinPulseWidth and MaxPulseWidth) to a user specified range with MinPosition and MaxPosition.
555
+ */
556
+ rb_define_method(ph_rc_servo, "setTargetPosition", ph_rc_servo_set_target_position, 1);
557
+ rb_define_alias(ph_rc_servo, "target_position=", "setTargetPosition");
558
+
559
+ /* Document-method: getTorque
560
+ * call-seq: getTorque -> torque
561
+ *
562
+ * The Torque is a ratio of the maximum available torque.
563
+ * The torque is bounded by MinTorque and MaxTorque
564
+ * Increasing the torque will increase the speed and power consumption of the RC servo motor.
565
+ */
566
+ rb_define_method(ph_rc_servo, "getTorque", ph_rc_servo_get_torque, 0);
567
+ rb_define_alias(ph_rc_servo, "torque", "getTorque");
568
+
569
+ /* Document-method: setTorque
570
+ * call-seq: setTorque(torque)
571
+ *
572
+ * The Torque is a ratio of the maximum available torque.
573
+ * The torque is bounded by MinTorque and MaxTorque
574
+ * Increasing the torque will increase the speed and power consumption of the RC servo motor.
575
+ */
576
+ rb_define_method(ph_rc_servo, "setTorque", ph_rc_servo_set_torque, 1);
577
+ rb_define_alias(ph_rc_servo, "torque=", "setTorque");
578
+
579
+ /* Document-method: getMinTorque
580
+ * call-seq: getMinTorque -> torque
581
+ *
582
+ * The minimum value that Torque can be set to.
583
+ * Torque is a ratio of the maximum available torque, therefore the minimum torque is a unitless constant.
584
+ */
585
+ rb_define_method(ph_rc_servo, "getMinTorque", ph_rc_servo_get_min_torque, 0);
586
+ rb_define_alias(ph_rc_servo, "min_torque", "getMinTorque");
587
+
588
+ /* Document-method: getMaxTorque
589
+ * call-seq: getMaxTorque -> torque
590
+ *
591
+ * The maximum value that Torque can be set to.
592
+ * Torque is a ratio of the maximum available torque, therefore the minimum torque is a unitless constant.
593
+ */
594
+ rb_define_method(ph_rc_servo, "getMaxTorque", ph_rc_servo_get_max_torque, 0);
595
+ rb_define_alias(ph_rc_servo, "max_torque", "getMaxTorque");
596
+
597
+ /* Document-method: getVelocity
598
+ * call-seq: getVelocity -> velocity
599
+ *
600
+ * The velocity that the RC servo motor is being driven at.
601
+ * A negative value means the RC servo motor is moving towards a lower position.
602
+ * The velocity range of the RC servo motor will be from -VelocityLimit to VelocityLimit, depending on direction.
603
+ * This is not the actual physical velocity of the RC servo motor.
604
+ */
605
+ rb_define_method(ph_rc_servo, "getVelocity", ph_rc_servo_get_velocity, 0);
606
+ rb_define_alias(ph_rc_servo, "velocity", "getVelocity");
607
+
608
+ /* Document-method: getVelocityLimit
609
+ * call-seq: getVelocityLimit -> velocity
610
+ *
611
+ * When moving, the RC servo motor velocity will be limited by this value.
612
+ * The velocity limit is bounded by MinVelocityLimit and MaxVelocityLimit.
613
+ * SpeedRampingState controls whether or not the velocity limit value is actually applied when trying to reach a target position.
614
+ * The velocity range of the RC servo motor will be from -VelocityLimit to VelocityLimit, depending on direction.
615
+ * Note that when this value is set to 0, the RC servo motor will not move.
616
+ * There is a practical limit on how fast your servo can rotate, based on the physical design of the motor.
617
+ * The units for Position,Velocity, and Acceleration are configured by scaling the internal timing (set with MinPulseWidth and MaxPulseWidth) to a user specified range with MinPosition and MaxPosition.
618
+ */
619
+ rb_define_method(ph_rc_servo, "getVelocityLimit", ph_rc_servo_get_velocity_limit, 0);
620
+ rb_define_alias(ph_rc_servo, "velocity_limit", "getVelocityLimit");
621
+
622
+ /* Document-method: setVelocityLimit
623
+ * call-seq: setVelocityLimit(velocity)
624
+ *
625
+ * When moving, the RC servo motor velocity will be limited by this value.
626
+ * The velocity limit is bounded by MinVelocityLimit and MaxVelocityLimit.
627
+ * SpeedRampingState controls whether or not the velocity limit value is actually applied when trying to reach a target position.
628
+ * The velocity range of the RC servo motor will be from -VelocityLimit to VelocityLimit, depending on direction.
629
+ * Note that when this value is set to 0, the RC servo motor will not move.
630
+ * There is a practical limit on how fast your servo can rotate, based on the physical design of the motor.
631
+ * The units for Position,Velocity, and Acceleration are configured by scaling the internal timing (set with MinPulseWidth and MaxPulseWidth) to a user specified range with MinPosition and MaxPosition.
632
+ */
633
+ rb_define_method(ph_rc_servo, "setVelocityLimit", ph_rc_servo_set_velocity_limit, 1);
634
+ rb_define_alias(ph_rc_servo, "velocity_limit=", "setVelocityLimit");
635
+
636
+ /* Document-method: getMinVelocityLimit
637
+ * call-seq: getMinVelocityLimit -> velocity
638
+ *
639
+ * The minimum velocity VelocityLimit can be set to.
640
+ */
641
+ rb_define_method(ph_rc_servo, "getMinVelocityLimit", ph_rc_servo_get_min_velocity_limit, 0);
642
+ rb_define_alias(ph_rc_servo, "min_velocity_limit", "getMinVelocityLimit");
643
+
644
+ /* Document-method: getMaxVelocityLimit
645
+ * call-seq: getMaxVelocityLimit -> velocity
646
+ *
647
+ * The maximum velocity VelocityLimit can be set to. This value depends on MinPosition/MaxPosition and MinPulseWidth/MaxPulseWidth.
648
+ */
649
+ rb_define_method(ph_rc_servo, "getMaxVelocityLimit", ph_rc_servo_get_max_velocity_limit, 0);
650
+ rb_define_alias(ph_rc_servo, "max_velocity_limit", "getMaxVelocityLimit");
651
+
652
+ /* Document-method: getVoltage
653
+ * call-seq: getVoltage -> voltage
654
+ *
655
+ * The supply voltage for the RC servo motor.
656
+ * If your controller supports multiple RC servo motors, every motor will have the same supply voltage. It is not possible to set individual supply voltages.
657
+ */
658
+ rb_define_method(ph_rc_servo, "getVoltage", ph_rc_servo_get_voltage, 0);
659
+ rb_define_alias(ph_rc_servo, "voltage", "getVoltage");
660
+
661
+ /* Document-method: setVoltage
662
+ * call-seq: setVoltage(voltage)
663
+ *
664
+ * The supply voltage for the RC servo motor.
665
+ * If your controller supports multiple RC servo motors, every motor will have the same supply voltage. It is not possible to set individual supply voltages.
666
+ */
667
+ rb_define_method(ph_rc_servo, "setVoltage", ph_rc_servo_set_voltage, 1);
668
+ rb_define_alias(ph_rc_servo, "voltage=", "setVoltage");
669
+
670
+ rb_define_private_method(ph_rc_servo, "ext_setOnPositionChangeHandler", ph_rc_servo_set_on_position_change_handler, 1);
671
+ }
672
+