tinkerforge 2.1.24 → 2.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. checksums.yaml +5 -5
  2. data/lib/tinkerforge/brick_dc.rb +156 -75
  3. data/lib/tinkerforge/brick_hat.rb +69 -31
  4. data/lib/tinkerforge/brick_hat_zero.rb +55 -23
  5. data/lib/tinkerforge/brick_imu.rb +185 -78
  6. data/lib/tinkerforge/brick_imu_v2.rb +209 -106
  7. data/lib/tinkerforge/brick_master.rb +491 -183
  8. data/lib/tinkerforge/brick_red.rb +197 -74
  9. data/lib/tinkerforge/brick_servo.rb +186 -102
  10. data/lib/tinkerforge/brick_silent_stepper.rb +247 -167
  11. data/lib/tinkerforge/brick_stepper.rb +211 -99
  12. data/lib/tinkerforge/bricklet_accelerometer.rb +57 -23
  13. data/lib/tinkerforge/bricklet_accelerometer_v2.rb +104 -54
  14. data/lib/tinkerforge/bricklet_air_quality.rb +116 -59
  15. data/lib/tinkerforge/bricklet_ambient_light.rb +50 -21
  16. data/lib/tinkerforge/bricklet_ambient_light_v2.rb +44 -24
  17. data/lib/tinkerforge/bricklet_ambient_light_v3.rb +65 -27
  18. data/lib/tinkerforge/bricklet_analog_in.rb +62 -25
  19. data/lib/tinkerforge/bricklet_analog_in_v2.rb +56 -23
  20. data/lib/tinkerforge/bricklet_analog_in_v3.rb +66 -25
  21. data/lib/tinkerforge/bricklet_analog_out.rb +22 -9
  22. data/lib/tinkerforge/bricklet_analog_out_v2.rb +19 -8
  23. data/lib/tinkerforge/bricklet_analog_out_v3.rb +53 -20
  24. data/lib/tinkerforge/bricklet_barometer.rb +100 -27
  25. data/lib/tinkerforge/bricklet_barometer_v2.rb +98 -37
  26. data/lib/tinkerforge/bricklet_can.rb +83 -19
  27. data/lib/tinkerforge/bricklet_can_v2.rb +171 -38
  28. data/lib/tinkerforge/bricklet_co2.rb +33 -14
  29. data/lib/tinkerforge/bricklet_co2_v2.rb +97 -38
  30. data/lib/tinkerforge/bricklet_color.rb +68 -27
  31. data/lib/tinkerforge/bricklet_color_v2.rb +86 -33
  32. data/lib/tinkerforge/bricklet_compass.rb +77 -30
  33. data/lib/tinkerforge/bricklet_current12.rb +57 -24
  34. data/lib/tinkerforge/bricklet_current25.rb +57 -24
  35. data/lib/tinkerforge/bricklet_dc_v2.rb +521 -0
  36. data/lib/tinkerforge/bricklet_distance_ir.rb +56 -23
  37. data/lib/tinkerforge/bricklet_distance_ir_v2.rb +82 -31
  38. data/lib/tinkerforge/bricklet_distance_us.rb +39 -16
  39. data/lib/tinkerforge/bricklet_distance_us_v2.rb +66 -25
  40. data/lib/tinkerforge/bricklet_dmx.rb +87 -34
  41. data/lib/tinkerforge/bricklet_dual_button.rb +23 -10
  42. data/lib/tinkerforge/bricklet_dual_button_v2.rb +63 -24
  43. data/lib/tinkerforge/bricklet_dual_relay.rb +26 -11
  44. data/lib/tinkerforge/bricklet_dust_detector.rb +39 -16
  45. data/lib/tinkerforge/bricklet_e_paper_296x128.rb +87 -32
  46. data/lib/tinkerforge/bricklet_energy_monitor.rb +72 -27
  47. data/lib/tinkerforge/bricklet_gps.rb +63 -26
  48. data/lib/tinkerforge/bricklet_gps_v2.rb +116 -47
  49. data/lib/tinkerforge/bricklet_hall_effect.rb +42 -23
  50. data/lib/tinkerforge/bricklet_hall_effect_v2.rb +70 -27
  51. data/lib/tinkerforge/bricklet_humidity.rb +50 -21
  52. data/lib/tinkerforge/bricklet_humidity_v2.rb +82 -31
  53. data/lib/tinkerforge/bricklet_imu_v3.rb +784 -0
  54. data/lib/tinkerforge/bricklet_industrial_analog_out.rb +37 -14
  55. data/lib/tinkerforge/bricklet_industrial_analog_out_v2.rb +80 -29
  56. data/lib/tinkerforge/bricklet_industrial_counter.rb +100 -39
  57. data/lib/tinkerforge/bricklet_industrial_digital_in_4.rb +44 -17
  58. data/lib/tinkerforge/bricklet_industrial_digital_in_4_v2.rb +76 -29
  59. data/lib/tinkerforge/bricklet_industrial_digital_out_4.rb +35 -14
  60. data/lib/tinkerforge/bricklet_industrial_digital_out_4_v2.rb +72 -27
  61. data/lib/tinkerforge/bricklet_industrial_dual_0_20ma.rb +39 -16
  62. data/lib/tinkerforge/bricklet_industrial_dual_0_20ma_v2.rb +79 -30
  63. data/lib/tinkerforge/bricklet_industrial_dual_ac_relay.rb +325 -0
  64. data/lib/tinkerforge/bricklet_industrial_dual_analog_in.rb +48 -19
  65. data/lib/tinkerforge/bricklet_industrial_dual_analog_in_v2.rb +137 -31
  66. data/lib/tinkerforge/bricklet_industrial_dual_relay.rb +60 -23
  67. data/lib/tinkerforge/bricklet_industrial_ptc.rb +475 -0
  68. data/lib/tinkerforge/bricklet_industrial_quad_relay.rb +35 -14
  69. data/lib/tinkerforge/bricklet_industrial_quad_relay_v2.rb +66 -25
  70. data/lib/tinkerforge/bricklet_io16.rb +54 -21
  71. data/lib/tinkerforge/bricklet_io16_v2.rb +89 -34
  72. data/lib/tinkerforge/bricklet_io4.rb +54 -23
  73. data/lib/tinkerforge/bricklet_io4_v2.rb +95 -36
  74. data/lib/tinkerforge/bricklet_isolator.rb +72 -29
  75. data/lib/tinkerforge/bricklet_joystick.rb +58 -25
  76. data/lib/tinkerforge/bricklet_joystick_v2.rb +67 -26
  77. data/lib/tinkerforge/bricklet_laser_range_finder.rb +81 -32
  78. data/lib/tinkerforge/bricklet_laser_range_finder_v2.rb +95 -36
  79. data/lib/tinkerforge/bricklet_lcd_128x64.rb +191 -70
  80. data/lib/tinkerforge/bricklet_lcd_16x2.rb +44 -18
  81. data/lib/tinkerforge/bricklet_lcd_20x4.rb +57 -23
  82. data/lib/tinkerforge/bricklet_led_strip.rb +59 -22
  83. data/lib/tinkerforge/bricklet_led_strip_v2.rb +90 -46
  84. data/lib/tinkerforge/bricklet_line.rb +33 -14
  85. data/lib/tinkerforge/bricklet_linear_poti.rb +50 -21
  86. data/lib/tinkerforge/bricklet_linear_poti_v2.rb +54 -21
  87. data/lib/tinkerforge/bricklet_load_cell.rb +60 -23
  88. data/lib/tinkerforge/bricklet_load_cell_v2.rb +79 -30
  89. data/lib/tinkerforge/bricklet_moisture.rb +39 -16
  90. data/lib/tinkerforge/bricklet_motion_detector.rb +21 -10
  91. data/lib/tinkerforge/bricklet_motion_detector_v2.rb +61 -27
  92. data/lib/tinkerforge/bricklet_motorized_linear_poti.rb +70 -27
  93. data/lib/tinkerforge/bricklet_multi_touch.rb +30 -13
  94. data/lib/tinkerforge/bricklet_multi_touch_v2.rb +75 -28
  95. data/lib/tinkerforge/bricklet_nfc.rb +126 -62
  96. data/lib/tinkerforge/bricklet_nfc_rfid.rb +32 -13
  97. data/lib/tinkerforge/bricklet_oled_128x64.rb +28 -11
  98. data/lib/tinkerforge/bricklet_oled_128x64_v2.rb +65 -24
  99. data/lib/tinkerforge/bricklet_oled_64x48.rb +28 -11
  100. data/lib/tinkerforge/bricklet_one_wire.rb +65 -24
  101. data/lib/tinkerforge/bricklet_outdoor_weather.rb +71 -28
  102. data/lib/tinkerforge/bricklet_particulate_matter.rb +74 -30
  103. data/lib/tinkerforge/bricklet_performance_dc.rb +682 -0
  104. data/lib/tinkerforge/bricklet_piezo_buzzer.rb +18 -9
  105. data/lib/tinkerforge/bricklet_piezo_speaker.rb +21 -10
  106. data/lib/tinkerforge/bricklet_piezo_speaker_v2.rb +79 -42
  107. data/lib/tinkerforge/bricklet_ptc.rb +73 -42
  108. data/lib/tinkerforge/bricklet_ptc_v2.rb +94 -48
  109. data/lib/tinkerforge/bricklet_real_time_clock.rb +44 -33
  110. data/lib/tinkerforge/bricklet_real_time_clock_v2.rb +77 -44
  111. data/lib/tinkerforge/bricklet_remote_switch.rb +38 -29
  112. data/lib/tinkerforge/bricklet_remote_switch_v2.rb +86 -49
  113. data/lib/tinkerforge/bricklet_rgb_led.rb +17 -8
  114. data/lib/tinkerforge/bricklet_rgb_led_button.rb +61 -30
  115. data/lib/tinkerforge/bricklet_rgb_led_matrix.rb +78 -33
  116. data/lib/tinkerforge/bricklet_rgb_led_v2.rb +51 -20
  117. data/lib/tinkerforge/bricklet_rotary_encoder.rb +38 -19
  118. data/lib/tinkerforge/bricklet_rotary_encoder_v2.rb +59 -24
  119. data/lib/tinkerforge/bricklet_rotary_poti.rb +52 -28
  120. data/lib/tinkerforge/bricklet_rotary_poti_v2.rb +56 -23
  121. data/lib/tinkerforge/bricklet_rs232.rb +89 -28
  122. data/lib/tinkerforge/bricklet_rs232_v2.rb +117 -44
  123. data/lib/tinkerforge/bricklet_rs485.rb +222 -95
  124. data/lib/tinkerforge/bricklet_segment_display_4x7.rb +24 -14
  125. data/lib/tinkerforge/bricklet_segment_display_4x7_v2.rb +74 -35
  126. data/lib/tinkerforge/bricklet_servo_v2.rb +565 -0
  127. data/lib/tinkerforge/bricklet_silent_stepper_v2.rb +1024 -0
  128. data/lib/tinkerforge/bricklet_solid_state_relay.rb +24 -13
  129. data/lib/tinkerforge/bricklet_solid_state_relay_v2.rb +58 -25
  130. data/lib/tinkerforge/bricklet_sound_intensity.rb +34 -18
  131. data/lib/tinkerforge/bricklet_sound_pressure_level.rb +71 -31
  132. data/lib/tinkerforge/bricklet_temperature.rb +39 -16
  133. data/lib/tinkerforge/bricklet_temperature_ir.rb +56 -23
  134. data/lib/tinkerforge/bricklet_temperature_ir_v2.rb +70 -27
  135. data/lib/tinkerforge/bricklet_temperature_v2.rb +60 -25
  136. data/lib/tinkerforge/bricklet_thermal_imaging.rb +104 -44
  137. data/lib/tinkerforge/bricklet_thermocouple.rb +44 -24
  138. data/lib/tinkerforge/bricklet_thermocouple_v2.rb +64 -27
  139. data/lib/tinkerforge/bricklet_tilt.rb +23 -10
  140. data/lib/tinkerforge/bricklet_uv_light.rb +35 -18
  141. data/lib/tinkerforge/bricklet_uv_light_v2.rb +84 -37
  142. data/lib/tinkerforge/bricklet_voltage.rb +51 -28
  143. data/lib/tinkerforge/bricklet_voltage_current.rb +90 -73
  144. data/lib/tinkerforge/bricklet_voltage_current_v2.rb +89 -68
  145. data/lib/tinkerforge/bricklet_xmc1400_breakout.rb +79 -30
  146. data/lib/tinkerforge/device_display_names.rb +170 -0
  147. data/lib/tinkerforge/ip_connection.rb +153 -33
  148. data/lib/tinkerforge/version.rb +1 -1
  149. metadata +11 -3
@@ -1,14 +1,16 @@
1
1
  # -*- ruby encoding: utf-8 -*-
2
2
  #############################################################
3
- # This file was automatically generated on 2019-11-25. #
3
+ # This file was automatically generated on 2021-05-06. #
4
4
  # #
5
- # Ruby Bindings Version 2.1.24 #
5
+ # Ruby Bindings Version 2.1.29 #
6
6
  # #
7
7
  # If you have a bugfix for this file and want to commit it, #
8
8
  # please fix the bug in the generator. You can find a link #
9
9
  # to the generators git repository on tinkerforge.com #
10
10
  #############################################################
11
11
 
12
+ require_relative './ip_connection'
13
+
12
14
  module Tinkerforge
13
15
  # Breakout for Infineon XMC1400 microcontroller
14
16
  class BrickletXMC1400Breakout < Device
@@ -87,7 +89,7 @@ module Tinkerforge
87
89
  # Creates an object with the unique device ID <tt>uid</tt> and adds it to
88
90
  # the IP Connection <tt>ipcon</tt>.
89
91
  def initialize(uid, ipcon)
90
- super uid, ipcon
92
+ super uid, ipcon, DEVICE_IDENTIFIER, DEVICE_DISPLAY_NAME
91
93
 
92
94
  @api_version = [2, 0, 0]
93
95
 
@@ -115,21 +117,26 @@ module Tinkerforge
115
117
  @response_expected[FUNCTION_READ_UID] = RESPONSE_EXPECTED_ALWAYS_TRUE
116
118
  @response_expected[FUNCTION_GET_IDENTITY] = RESPONSE_EXPECTED_ALWAYS_TRUE
117
119
 
118
- @callback_formats[CALLBACK_ADC_VALUES] = 'S8'
119
- @callback_formats[CALLBACK_COUNT] = 'L'
120
+ @callback_formats[CALLBACK_ADC_VALUES] = [24, 'S8']
121
+ @callback_formats[CALLBACK_COUNT] = [12, 'L']
120
122
 
123
+ @ipcon.add_device self
121
124
  end
122
125
 
123
126
  # Example for a setter function. The values are the values that can be given to
124
127
  # the XMC_GPIO_Init function. See communication.c in the firmware.
125
128
  def set_gpio_config(port, pin, mode, input_hysteresis, output_level)
126
- send_request FUNCTION_SET_GPIO_CONFIG, [port, pin, mode, input_hysteresis, output_level], 'C C C C ?', 0, ''
129
+ check_validity
130
+
131
+ send_request FUNCTION_SET_GPIO_CONFIG, [port, pin, mode, input_hysteresis, output_level], 'C C C C ?', 8, ''
127
132
  end
128
133
 
129
134
  # Example for a getter function. Returns the result of a
130
135
  # XMC_GPIO_GetInput call for the given port/pin.
131
136
  def get_gpio_input(port, pin)
132
- send_request FUNCTION_GET_GPIO_INPUT, [port, pin], 'C C', 1, '?'
137
+ check_validity
138
+
139
+ send_request FUNCTION_GET_GPIO_INPUT, [port, pin], 'C C', 9, '?'
133
140
  end
134
141
 
135
142
  # Enables a ADC channel for the ADC driver example (adc.c/adc.h).
@@ -145,17 +152,23 @@ module Tinkerforge
145
152
  # * Channel 6: P2_1
146
153
  # * Channel 7: P2_2
147
154
  def set_adc_channel_config(channel, enable)
148
- send_request FUNCTION_SET_ADC_CHANNEL_CONFIG, [channel, enable], 'C ?', 0, ''
155
+ check_validity
156
+
157
+ send_request FUNCTION_SET_ADC_CHANNEL_CONFIG, [channel, enable], 'C ?', 8, ''
149
158
  end
150
159
 
151
160
  # Returns the config for the given channel as set by BrickletXMC1400Breakout#set_adc_channel_config.
152
161
  def get_adc_channel_config(channel)
153
- send_request FUNCTION_GET_ADC_CHANNEL_CONFIG, [channel], 'C', 1, '?'
162
+ check_validity
163
+
164
+ send_request FUNCTION_GET_ADC_CHANNEL_CONFIG, [channel], 'C', 9, '?'
154
165
  end
155
166
 
156
167
  # Returns the 12-bit value of the given ADC channel of the ADC driver example.
157
168
  def get_adc_channel_value(channel)
158
- send_request FUNCTION_GET_ADC_CHANNEL_VALUE, [channel], 'C', 2, 'S'
169
+ check_validity
170
+
171
+ send_request FUNCTION_GET_ADC_CHANNEL_VALUE, [channel], 'C', 10, 'S'
159
172
  end
160
173
 
161
174
  # Returns the values for all 8 ADC channels of the adc driver example.
@@ -164,7 +177,9 @@ module Tinkerforge
164
177
  #
165
178
  # See BrickletXMC1400Breakout#set_adc_values_callback_configuration and CALLBACK_ADC_VALUES callback.
166
179
  def get_adc_values
167
- send_request FUNCTION_GET_ADC_VALUES, [], '', 16, 'S8'
180
+ check_validity
181
+
182
+ send_request FUNCTION_GET_ADC_VALUES, [], '', 24, 'S8'
168
183
  end
169
184
 
170
185
  # The period is the period with which the CALLBACK_ADC_VALUES
@@ -177,13 +192,17 @@ module Tinkerforge
177
192
  # If it is set to false, the callback is continuously triggered with the period,
178
193
  # independent of the value.
179
194
  def set_adc_values_callback_configuration(period, value_has_to_change)
180
- send_request FUNCTION_SET_ADC_VALUES_CALLBACK_CONFIGURATION, [period, value_has_to_change], 'L ?', 0, ''
195
+ check_validity
196
+
197
+ send_request FUNCTION_SET_ADC_VALUES_CALLBACK_CONFIGURATION, [period, value_has_to_change], 'L ?', 8, ''
181
198
  end
182
199
 
183
200
  # Returns the callback configuration as set by
184
201
  # BrickletXMC1400Breakout#set_adc_values_callback_configuration.
185
202
  def get_adc_values_callback_configuration
186
- send_request FUNCTION_GET_ADC_VALUES_CALLBACK_CONFIGURATION, [], '', 5, 'L ?'
203
+ check_validity
204
+
205
+ send_request FUNCTION_GET_ADC_VALUES_CALLBACK_CONFIGURATION, [], '', 13, 'L ?'
187
206
  end
188
207
 
189
208
  # Returns the value of the example count (see example.c).
@@ -197,7 +216,9 @@ module Tinkerforge
197
216
  # CALLBACK_COUNT callback. You can set the callback configuration
198
217
  # with BrickletXMC1400Breakout#set_count_callback_configuration.
199
218
  def get_count
200
- send_request FUNCTION_GET_COUNT, [], '', 4, 'L'
219
+ check_validity
220
+
221
+ send_request FUNCTION_GET_COUNT, [], '', 12, 'L'
201
222
  end
202
223
 
203
224
  # The period is the period with which the CALLBACK_COUNT callback is triggered
@@ -226,12 +247,16 @@ module Tinkerforge
226
247
  #
227
248
  # If the option is set to 'x' (threshold turned off) the callback is triggered with the fixed period.
228
249
  def set_count_callback_configuration(period, value_has_to_change, option, min, max)
229
- send_request FUNCTION_SET_COUNT_CALLBACK_CONFIGURATION, [period, value_has_to_change, option, min, max], 'L ? k L L', 0, ''
250
+ check_validity
251
+
252
+ send_request FUNCTION_SET_COUNT_CALLBACK_CONFIGURATION, [period, value_has_to_change, option, min, max], 'L ? k L L', 8, ''
230
253
  end
231
254
 
232
255
  # Returns the callback configuration as set by BrickletXMC1400Breakout#set_count_callback_configuration.
233
256
  def get_count_callback_configuration
234
- send_request FUNCTION_GET_COUNT_CALLBACK_CONFIGURATION, [], '', 14, 'L ? k L L'
257
+ check_validity
258
+
259
+ send_request FUNCTION_GET_COUNT_CALLBACK_CONFIGURATION, [], '', 22, 'L ? k L L'
235
260
  end
236
261
 
237
262
  # Returns the error count for the communication between Brick and Bricklet.
@@ -246,7 +271,9 @@ module Tinkerforge
246
271
  # The errors counts are for errors that occur on the Bricklet side. All
247
272
  # Bricks have a similar function that returns the errors on the Brick side.
248
273
  def get_spitfp_error_count
249
- send_request FUNCTION_GET_SPITFP_ERROR_COUNT, [], '', 16, 'L L L L'
274
+ check_validity
275
+
276
+ send_request FUNCTION_GET_SPITFP_ERROR_COUNT, [], '', 24, 'L L L L'
250
277
  end
251
278
 
252
279
  # Sets the bootloader mode and returns the status after the requested
@@ -259,12 +286,16 @@ module Tinkerforge
259
286
  # This function is used by Brick Viewer during flashing. It should not be
260
287
  # necessary to call it in a normal user program.
261
288
  def set_bootloader_mode(mode)
262
- send_request FUNCTION_SET_BOOTLOADER_MODE, [mode], 'C', 1, 'C'
289
+ check_validity
290
+
291
+ send_request FUNCTION_SET_BOOTLOADER_MODE, [mode], 'C', 9, 'C'
263
292
  end
264
293
 
265
294
  # Returns the current bootloader mode, see BrickletXMC1400Breakout#set_bootloader_mode.
266
295
  def get_bootloader_mode
267
- send_request FUNCTION_GET_BOOTLOADER_MODE, [], '', 1, 'C'
296
+ check_validity
297
+
298
+ send_request FUNCTION_GET_BOOTLOADER_MODE, [], '', 9, 'C'
268
299
  end
269
300
 
270
301
  # Sets the firmware pointer for BrickletXMC1400Breakout#write_firmware. The pointer has
@@ -274,7 +305,9 @@ module Tinkerforge
274
305
  # This function is used by Brick Viewer during flashing. It should not be
275
306
  # necessary to call it in a normal user program.
276
307
  def set_write_firmware_pointer(pointer)
277
- send_request FUNCTION_SET_WRITE_FIRMWARE_POINTER, [pointer], 'L', 0, ''
308
+ check_validity
309
+
310
+ send_request FUNCTION_SET_WRITE_FIRMWARE_POINTER, [pointer], 'L', 8, ''
278
311
  end
279
312
 
280
313
  # Writes 64 Bytes of firmware at the position as written by
@@ -286,7 +319,9 @@ module Tinkerforge
286
319
  # This function is used by Brick Viewer during flashing. It should not be
287
320
  # necessary to call it in a normal user program.
288
321
  def write_firmware(data)
289
- send_request FUNCTION_WRITE_FIRMWARE, [data], 'C64', 1, 'C'
322
+ check_validity
323
+
324
+ send_request FUNCTION_WRITE_FIRMWARE, [data], 'C64', 9, 'C'
290
325
  end
291
326
 
292
327
  # Sets the status LED configuration. By default the LED shows
@@ -297,22 +332,28 @@ module Tinkerforge
297
332
  #
298
333
  # If the Bricklet is in bootloader mode, the LED is will show heartbeat by default.
299
334
  def set_status_led_config(config)
300
- send_request FUNCTION_SET_STATUS_LED_CONFIG, [config], 'C', 0, ''
335
+ check_validity
336
+
337
+ send_request FUNCTION_SET_STATUS_LED_CONFIG, [config], 'C', 8, ''
301
338
  end
302
339
 
303
340
  # Returns the configuration as set by BrickletXMC1400Breakout#set_status_led_config
304
341
  def get_status_led_config
305
- send_request FUNCTION_GET_STATUS_LED_CONFIG, [], '', 1, 'C'
342
+ check_validity
343
+
344
+ send_request FUNCTION_GET_STATUS_LED_CONFIG, [], '', 9, 'C'
306
345
  end
307
346
 
308
- # Returns the temperature in °C as measured inside the microcontroller. The
347
+ # Returns the temperature as measured inside the microcontroller. The
309
348
  # value returned is not the ambient temperature!
310
349
  #
311
350
  # The temperature is only proportional to the real temperature and it has bad
312
351
  # accuracy. Practically it is only useful as an indicator for
313
352
  # temperature changes.
314
353
  def get_chip_temperature
315
- send_request FUNCTION_GET_CHIP_TEMPERATURE, [], '', 2, 's'
354
+ check_validity
355
+
356
+ send_request FUNCTION_GET_CHIP_TEMPERATURE, [], '', 10, 's'
316
357
  end
317
358
 
318
359
  # Calling this function will reset the Bricklet. All configurations
@@ -322,7 +363,9 @@ module Tinkerforge
322
363
  # calling functions on the existing ones will result in
323
364
  # undefined behavior!
324
365
  def reset
325
- send_request FUNCTION_RESET, [], '', 0, ''
366
+ check_validity
367
+
368
+ send_request FUNCTION_RESET, [], '', 8, ''
326
369
  end
327
370
 
328
371
  # Writes a new UID into flash. If you want to set a new UID
@@ -331,25 +374,31 @@ module Tinkerforge
331
374
  #
332
375
  # We recommend that you use Brick Viewer to change the UID.
333
376
  def write_uid(uid)
334
- send_request FUNCTION_WRITE_UID, [uid], 'L', 0, ''
377
+ check_validity
378
+
379
+ send_request FUNCTION_WRITE_UID, [uid], 'L', 8, ''
335
380
  end
336
381
 
337
382
  # Returns the current UID as an integer. Encode as
338
383
  # Base58 to get the usual string version.
339
384
  def read_uid
340
- send_request FUNCTION_READ_UID, [], '', 4, 'L'
385
+ check_validity
386
+
387
+ send_request FUNCTION_READ_UID, [], '', 12, 'L'
341
388
  end
342
389
 
343
390
  # Returns the UID, the UID where the Bricklet is connected to,
344
391
  # the position, the hardware and firmware version as well as the
345
392
  # device identifier.
346
393
  #
347
- # The position can be 'a', 'b', 'c' or 'd'.
394
+ # The position can be 'a', 'b', 'c', 'd', 'e', 'f', 'g' or 'h' (Bricklet Port).
395
+ # A Bricklet connected to an :ref:`Isolator Bricklet <isolator_bricklet>` is always at
396
+ # position 'z'.
348
397
  #
349
398
  # The device identifier numbers can be found :ref:`here <device_identifier>`.
350
399
  # |device_identifier_constant|
351
400
  def get_identity
352
- send_request FUNCTION_GET_IDENTITY, [], '', 25, 'Z8 Z8 k C3 C3 S'
401
+ send_request FUNCTION_GET_IDENTITY, [], '', 33, 'Z8 Z8 k C3 C3 S'
353
402
  end
354
403
 
355
404
  # Registers a callback with ID <tt>id</tt> to the block <tt>block</tt>.
@@ -0,0 +1,170 @@
1
+ # -*- ruby encoding: utf-8 -*-
2
+ #############################################################
3
+ # This file was automatically generated on 2021-05-06. #
4
+ # #
5
+ # Ruby Bindings Version 2.1.29 #
6
+ # #
7
+ # If you have a bugfix for this file and want to commit it, #
8
+ # please fix the bug in the generator. You can find a link #
9
+ # to the generators git repository on tinkerforge.com #
10
+ #############################################################
11
+
12
+ module Tinkerforge
13
+ DEVICE_DISPLAY_NAMES = {
14
+ 11 => 'DC Brick',
15
+ 13 => 'Master Brick',
16
+ 14 => 'Servo Brick',
17
+ 15 => 'Stepper Brick',
18
+ 16 => 'IMU Brick',
19
+ 17 => 'RED Brick',
20
+ 18 => 'IMU Brick 2.0',
21
+ 19 => 'Silent Stepper Brick',
22
+ 21 => 'Ambient Light Bricklet',
23
+ 23 => 'Current12 Bricklet',
24
+ 24 => 'Current25 Bricklet',
25
+ 25 => 'Distance IR Bricklet',
26
+ 26 => 'Dual Relay Bricklet',
27
+ 27 => 'Humidity Bricklet',
28
+ 28 => 'IO-16 Bricklet',
29
+ 29 => 'IO-4 Bricklet',
30
+ 111 => 'HAT Brick',
31
+ 112 => 'HAT Zero Brick',
32
+ 210 => 'Joystick Bricklet',
33
+ 211 => 'LCD 16x2 Bricklet',
34
+ 212 => 'LCD 20x4 Bricklet',
35
+ 213 => 'Linear Poti Bricklet',
36
+ 214 => 'Piezo Buzzer Bricklet',
37
+ 215 => 'Rotary Poti Bricklet',
38
+ 216 => 'Temperature Bricklet',
39
+ 217 => 'Temperature IR Bricklet',
40
+ 218 => 'Voltage Bricklet',
41
+ 219 => 'Analog In Bricklet',
42
+ 220 => 'Analog Out Bricklet',
43
+ 221 => 'Barometer Bricklet',
44
+ 222 => 'GPS Bricklet',
45
+ 223 => 'Industrial Digital In 4 Bricklet',
46
+ 224 => 'Industrial Digital Out 4 Bricklet',
47
+ 225 => 'Industrial Quad Relay Bricklet',
48
+ 226 => 'PTC Bricklet',
49
+ 227 => 'Voltage/Current Bricklet',
50
+ 228 => 'Industrial Dual 0-20mA Bricklet',
51
+ 229 => 'Distance US Bricklet',
52
+ 230 => 'Dual Button Bricklet',
53
+ 231 => 'LED Strip Bricklet',
54
+ 232 => 'Moisture Bricklet',
55
+ 233 => 'Motion Detector Bricklet',
56
+ 234 => 'Multi Touch Bricklet',
57
+ 235 => 'Remote Switch Bricklet',
58
+ 236 => 'Rotary Encoder Bricklet',
59
+ 237 => 'Segment Display 4x7 Bricklet',
60
+ 238 => 'Sound Intensity Bricklet',
61
+ 239 => 'Tilt Bricklet',
62
+ 240 => 'Hall Effect Bricklet',
63
+ 241 => 'Line Bricklet',
64
+ 242 => 'Piezo Speaker Bricklet',
65
+ 243 => 'Color Bricklet',
66
+ 244 => 'Solid State Relay Bricklet',
67
+ 246 => 'NFC/RFID Bricklet',
68
+ 249 => 'Industrial Dual Analog In Bricklet',
69
+ 250 => 'Accelerometer Bricklet',
70
+ 251 => 'Analog In Bricklet 2.0',
71
+ 253 => 'Load Cell Bricklet',
72
+ 254 => 'RS232 Bricklet',
73
+ 255 => 'Laser Range Finder Bricklet',
74
+ 256 => 'Analog Out Bricklet 2.0',
75
+ 258 => 'Industrial Analog Out Bricklet',
76
+ 259 => 'Ambient Light Bricklet 2.0',
77
+ 260 => 'Dust Detector Bricklet',
78
+ 262 => 'CO2 Bricklet',
79
+ 263 => 'OLED 128x64 Bricklet',
80
+ 264 => 'OLED 64x48 Bricklet',
81
+ 265 => 'UV Light Bricklet',
82
+ 266 => 'Thermocouple Bricklet',
83
+ 267 => 'Motorized Linear Poti Bricklet',
84
+ 268 => 'Real-Time Clock Bricklet',
85
+ 270 => 'CAN Bricklet',
86
+ 271 => 'RGB LED Bricklet',
87
+ 272 => 'RGB LED Matrix Bricklet',
88
+ 276 => 'GPS Bricklet 2.0',
89
+ 277 => 'RS485 Bricklet',
90
+ 278 => 'Thermal Imaging Bricklet',
91
+ 279 => 'XMC1400 Breakout Bricklet',
92
+ 282 => 'RGB LED Button Bricklet',
93
+ 283 => 'Humidity Bricklet 2.0',
94
+ 284 => 'Industrial Dual Relay Bricklet',
95
+ 285 => 'DMX Bricklet',
96
+ 286 => 'NFC Bricklet',
97
+ 288 => 'Outdoor Weather Bricklet',
98
+ 289 => 'Remote Switch Bricklet 2.0',
99
+ 290 => 'Sound Pressure Level Bricklet',
100
+ 291 => 'Temperature IR Bricklet 2.0',
101
+ 292 => 'Motion Detector Bricklet 2.0',
102
+ 293 => 'Industrial Counter Bricklet',
103
+ 294 => 'Rotary Encoder Bricklet 2.0',
104
+ 295 => 'Analog In Bricklet 3.0',
105
+ 296 => 'Solid State Relay Bricklet 2.0',
106
+ 297 => 'Air Quality Bricklet',
107
+ 298 => 'LCD 128x64 Bricklet',
108
+ 299 => 'Distance US Bricklet 2.0',
109
+ 2100 => 'Industrial Digital In 4 Bricklet 2.0',
110
+ 2101 => 'PTC Bricklet 2.0',
111
+ 2102 => 'Industrial Quad Relay Bricklet 2.0',
112
+ 2103 => 'LED Strip Bricklet 2.0',
113
+ 2104 => 'Load Cell Bricklet 2.0',
114
+ 2105 => 'Voltage/Current Bricklet 2.0',
115
+ 2106 => 'Real-Time Clock Bricklet 2.0',
116
+ 2107 => 'CAN Bricklet 2.0',
117
+ 2108 => 'RS232 Bricklet 2.0',
118
+ 2109 => 'Thermocouple Bricklet 2.0',
119
+ 2110 => 'Particulate Matter Bricklet',
120
+ 2111 => 'IO-4 Bricklet 2.0',
121
+ 2112 => 'OLED 128x64 Bricklet 2.0',
122
+ 2113 => 'Temperature Bricklet 2.0',
123
+ 2114 => 'IO-16 Bricklet 2.0',
124
+ 2115 => 'Analog Out Bricklet 3.0',
125
+ 2116 => 'Industrial Analog Out Bricklet 2.0',
126
+ 2117 => 'Barometer Bricklet 2.0',
127
+ 2118 => 'UV Light Bricklet 2.0',
128
+ 2119 => 'Dual Button Bricklet 2.0',
129
+ 2120 => 'Industrial Dual 0-20mA Bricklet 2.0',
130
+ 2121 => 'Industrial Dual Analog In Bricklet 2.0',
131
+ 2122 => 'Isolator Bricklet',
132
+ 2123 => 'One Wire Bricklet',
133
+ 2124 => 'Industrial Digital Out 4 Bricklet 2.0',
134
+ 2125 => 'Distance IR Bricklet 2.0',
135
+ 2127 => 'RGB LED Bricklet 2.0',
136
+ 2128 => 'Color Bricklet 2.0',
137
+ 2129 => 'Multi Touch Bricklet 2.0',
138
+ 2130 => 'Accelerometer Bricklet 2.0',
139
+ 2131 => 'Ambient Light Bricklet 3.0',
140
+ 2132 => 'Hall Effect Bricklet 2.0',
141
+ 2137 => 'Segment Display 4x7 Bricklet 2.0',
142
+ 2138 => 'Joystick Bricklet 2.0',
143
+ 2139 => 'Linear Poti Bricklet 2.0',
144
+ 2140 => 'Rotary Poti Bricklet 2.0',
145
+ 2144 => 'Laser Range Finder Bricklet 2.0',
146
+ 2145 => 'Piezo Speaker Bricklet 2.0',
147
+ 2146 => 'E-Paper 296x128 Bricklet',
148
+ 2147 => 'CO2 Bricklet 2.0',
149
+ 2152 => 'Energy Monitor Bricklet',
150
+ 2153 => 'Compass Bricklet',
151
+ 2156 => 'Performance DC Bricklet',
152
+ 2157 => 'Servo Bricklet 2.0',
153
+ 2161 => 'IMU Bricklet 3.0',
154
+ 2162 => 'Industrial Dual AC Relay Bricklet',
155
+ 2164 => 'Industrial PTC Bricklet',
156
+ 2165 => 'DC Bricklet 2.0',
157
+ 2166 => 'Silent Stepper Bricklet 2.0'
158
+ }
159
+
160
+ # internal
161
+ def get_device_display_name(device_identifier)
162
+ device_display_name = DEVICE_DISPLAY_NAMES[device_identifier]
163
+
164
+ if device_display_name == nil
165
+ device_display_name = "Unknown Device [#{device_identifier}]"
166
+ end
167
+
168
+ device_display_name
169
+ end
170
+ end
@@ -1,5 +1,5 @@
1
1
  # -*- ruby encoding: utf-8 -*-
2
- # Copyright (C) 2012-2014, 2019 Matthias Bolte <matthias@tinkerforge.com>
2
+ # Copyright (C) 2012-2014, 2019-2020 Matthias Bolte <matthias@tinkerforge.com>
3
3
  #
4
4
  # Redistribution and use in source and binary forms of this file,
5
5
  # with or without modification, are permitted. See the Creative
@@ -10,8 +10,10 @@ require 'thread'
10
10
  require 'timeout'
11
11
  require 'securerandom'
12
12
  require 'openssl'
13
+ require_relative './device_display_names'
13
14
 
14
15
  module Tinkerforge
16
+ # internal
15
17
  class Base58
16
18
  ALPHABET = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
17
19
 
@@ -64,6 +66,16 @@ module Tinkerforge
64
66
  class StreamOutOfSyncException < TinkerforgeException
65
67
  end
66
68
 
69
+ class WrongDeviceTypeException < TinkerforgeException
70
+ end
71
+
72
+ class DeviceReplacedException < TinkerforgeException
73
+ end
74
+
75
+ class WrongResponseLengthException < TinkerforgeException
76
+ end
77
+
78
+ # internal
67
79
  class Packer
68
80
  def self.pack(unpacked, format)
69
81
  data = ''
@@ -131,7 +143,8 @@ module Tinkerforge
131
143
  u = []
132
144
 
133
145
  if f0 == '?'
134
- r = data.unpack "C#{f1}a*"
146
+ n1 = (Integer(f1) / 8.0).ceil()
147
+ r = data.unpack "C#{n1}a*"
135
148
  data = r[-1]
136
149
  r.delete_at(-1)
137
150
 
@@ -207,12 +220,18 @@ module Tinkerforge
207
220
  end
208
221
  end
209
222
 
223
+ # internal
210
224
  class Device
225
+ DEVICE_IDENTIFIER_CHECK_PENDING = 0
226
+ DEVICE_IDENTIFIER_CHECK_MATCH = 1
227
+ DEVICE_IDENTIFIER_CHECK_MISMATCH = 2
228
+
211
229
  RESPONSE_EXPECTED_INVALID_FUNCTION_ID = 0
212
230
  RESPONSE_EXPECTED_ALWAYS_TRUE = 1 # getter
213
231
  RESPONSE_EXPECTED_TRUE = 2 # setter
214
232
  RESPONSE_EXPECTED_FALSE = 3 # setter, default
215
233
 
234
+ attr_accessor :replaced
216
235
  attr_accessor :uid
217
236
  attr_accessor :expected_response_function_id
218
237
  attr_accessor :expected_response_sequence_number
@@ -220,10 +239,11 @@ module Tinkerforge
220
239
  attr_accessor :high_level_callbacks
221
240
  attr_accessor :registered_callbacks
222
241
 
223
- # Creates the device object with the unique device ID <tt>uid</tt> and adds
224
- # it to the IPConnection <tt>ipcon</tt>.
225
- def initialize(uid, ipcon)
242
+ # internal
243
+ def initialize(uid, ipcon, device_identifier, device_display_name)
244
+ @replaced = false
226
245
  @uid = Base58.decode uid
246
+ @uid_string = uid
227
247
 
228
248
  if @uid > (1 << 64) - 1
229
249
  raise ArgumentError, "UID '#{uid}' is too big"
@@ -249,6 +269,12 @@ module Tinkerforge
249
269
 
250
270
  @ipcon = ipcon
251
271
 
272
+ @device_identifier = device_identifier
273
+ @device_display_name = device_display_name
274
+ @device_identifier_lock = Mutex.new
275
+ @device_identifier_check = DEVICE_IDENTIFIER_CHECK_PENDING # protected by device_identifier_lock
276
+ @wrong_device_display_name = '?' # protected by device_identifier_lock
277
+
252
278
  @request_mutex = Mutex.new
253
279
 
254
280
  @response_expected = Array.new(256, RESPONSE_EXPECTED_INVALID_FUNCTION_ID)
@@ -265,8 +291,6 @@ module Tinkerforge
265
291
  @callback_formats = {}
266
292
  @high_level_callbacks = {}
267
293
  @registered_callbacks = {}
268
-
269
- @ipcon.devices[@uid] = self # FIXME: use a weakref here
270
294
  end
271
295
 
272
296
  # Returns the API version (major, minor, revision) of the bindings for
@@ -288,7 +312,7 @@ module Tinkerforge
288
312
  # Enabling the response expected flag for a setter function allows to
289
313
  # detect timeouts and other error conditions calls of this setter as
290
314
  # well. The device will then send a response for this purpose. If this
291
- # flag is disabled for a setter function then no response is send and
315
+ # flag is disabled for a setter function then no response is sent and
292
316
  # errors are silently ignored, because they cannot be detected.
293
317
  def get_response_expected(function_id)
294
318
  if function_id < 0 or function_id > 255
@@ -317,7 +341,7 @@ module Tinkerforge
317
341
  # Enabling the response expected flag for a setter function allows to
318
342
  # detect timeouts and other error conditions calls of this setter as
319
343
  # well. The device will then send a response for this purpose. If this
320
- # flag is disabled for a setter function then no response is send and
344
+ # flag is disabled for a setter function then no response is sent and
321
345
  # errors are silently ignored, because they cannot be detected.
322
346
  def set_response_expected(function_id, response_expected)
323
347
  if function_id < 0 or function_id > 255
@@ -360,7 +384,7 @@ module Tinkerforge
360
384
 
361
385
  # internal
362
386
  def send_request(function_id, request_data, request_format,
363
- response_length, response_format)
387
+ expected_response_length, response_format)
364
388
  response = nil
365
389
 
366
390
  if request_data.length > 0
@@ -402,7 +426,13 @@ module Tinkerforge
402
426
  error_code = Packer.get_error_code_from_data packet
403
427
 
404
428
  if error_code == 0
405
- # no error
429
+ if expected_response_length == 0
430
+ expected_response_length = 8 # setter with response-expected enabled
431
+ end
432
+
433
+ if packet.length != expected_response_length
434
+ raise WrongResponseLengthException, "Expected response of #{expected_response_length} byte for function ID #{function_id}, got #{packet.length} byte instead"
435
+ end
406
436
  elsif error_code == 1
407
437
  raise InvalidParameterException, "Got invalid parameter for function ID #{function_id}"
408
438
  elsif error_code == 2
@@ -411,7 +441,7 @@ module Tinkerforge
411
441
  raise UnknownErrorCodeException, "Function ID #{function_id} returned an unknown error"
412
442
  end
413
443
 
414
- if response_length > 0
444
+ if response_format.length > 0
415
445
  response = Packer.unpack packet[8..-1], response_format
416
446
 
417
447
  if response.length == 1
@@ -449,6 +479,34 @@ module Tinkerforge
449
479
 
450
480
  response
451
481
  end
482
+
483
+ # internal
484
+ def check_validity()
485
+ if @replaced
486
+ raise DeviceReplacedException, 'Device has been replaced'
487
+ end
488
+
489
+ if @device_identifier_check == DEVICE_IDENTIFIER_CHECK_MATCH
490
+ return
491
+ end
492
+
493
+ @device_identifier_lock.synchronize {
494
+ if @device_identifier_check == DEVICE_IDENTIFIER_CHECK_PENDING
495
+ device_identifier = send_request(255, [], '', 33, 'Z8 Z8 k C3 C3 S')[5] # <device>.get_identity
496
+
497
+ if device_identifier == @device_identifier
498
+ @device_identifier_check = DEVICE_IDENTIFIER_CHECK_MATCH
499
+ else
500
+ @device_identifier_check = DEVICE_IDENTIFIER_CHECK_MISMATCH
501
+ @wrong_device_display_name = get_device_display_name device_identifier
502
+ end
503
+ end
504
+
505
+ if @device_identifier_check == DEVICE_IDENTIFIER_CHECK_MISMATCH
506
+ raise WrongDeviceTypeException, "UID #{@uid_string} belongs to a #{@wrong_device_display_name} instead of the expected #{@device_display_name}"
507
+ end
508
+ }
509
+ end
452
510
  end
453
511
 
454
512
  # internal
@@ -474,16 +532,18 @@ module Tinkerforge
474
532
  # Creates an object with the unique device ID <tt>uid</tt> and adds it to
475
533
  # the IP Connection <tt>ipcon</tt>.
476
534
  def initialize(uid, ipcon)
477
- super uid, ipcon
535
+ super uid, ipcon, 0, 'Brick Daemon'
478
536
 
479
537
  @api_version = [2, 0, 0]
480
538
 
481
539
  @response_expected[FUNCTION_GET_AUTHENTICATION_NONCE] = RESPONSE_EXPECTED_ALWAYS_TRUE
482
540
  @response_expected[FUNCTION_AUTHENTICATE] = RESPONSE_EXPECTED_TRUE
541
+
542
+ @ipcon.add_device self
483
543
  end
484
544
 
485
545
  def get_authentication_nonce
486
- send_request FUNCTION_GET_AUTHENTICATION_NONCE, [], '', 4, 'C4'
546
+ send_request FUNCTION_GET_AUTHENTICATION_NONCE, [], '', 12, 'C4'
487
547
  end
488
548
 
489
549
  def authenticate(client_nonce, digest)
@@ -492,7 +552,6 @@ module Tinkerforge
492
552
  end
493
553
 
494
554
  class IPConnection
495
- attr_accessor :devices
496
555
  attr_accessor :timeout
497
556
 
498
557
  CALLBACK_ENUMERATE = 253
@@ -538,6 +597,7 @@ module Tinkerforge
538
597
  @authentication_mutex = Mutex.new # protects authentication handshake
539
598
 
540
599
  @devices = {}
600
+ @replace_mutex = Mutex.new # used to synchronize replacements in the devices dict
541
601
 
542
602
  @registered_callbacks = {}
543
603
 
@@ -731,6 +791,19 @@ module Tinkerforge
731
791
  @registered_callbacks[id] = callback
732
792
  end
733
793
 
794
+ # internal
795
+ def add_device(device)
796
+ @replace_mutex.synchronize {
797
+ replaced_device = @devices.fetch device.uid, nil
798
+
799
+ if replaced_device != nil
800
+ replaced_device.replaced = true
801
+ end
802
+
803
+ @devices[device.uid] = device # FIXME: use a weakref here
804
+ }
805
+ end
806
+
734
807
  # internal
735
808
  def get_next_sequence_number
736
809
  @sequence_number_mutex.synchronize {
@@ -951,8 +1024,10 @@ module Tinkerforge
951
1024
  # internal
952
1025
  def dispatch_meta(function_id, parameter, socket_id)
953
1026
  if function_id == CALLBACK_CONNECTED
954
- if @registered_callbacks.has_key? CALLBACK_CONNECTED
955
- @registered_callbacks[CALLBACK_CONNECTED].call parameter
1027
+ cb = @registered_callbacks[CALLBACK_CONNECTED]
1028
+
1029
+ if cb != nil
1030
+ cb.call parameter
956
1031
  end
957
1032
  elsif function_id == CALLBACK_DISCONNECTED
958
1033
  if parameter != DISCONNECT_REASON_REQUEST
@@ -980,8 +1055,10 @@ module Tinkerforge
980
1055
  # socket. the first receive will then fail directly
981
1056
  sleep 0.1
982
1057
 
983
- if @registered_callbacks.has_key? CALLBACK_DISCONNECTED
984
- @registered_callbacks[CALLBACK_DISCONNECTED].call parameter
1058
+ cb = @registered_callbacks[CALLBACK_DISCONNECTED]
1059
+
1060
+ if cb != nil
1061
+ cb.call parameter
985
1062
  end
986
1063
 
987
1064
  if parameter != DISCONNECT_REASON_REQUEST and @auto_reconnect and @auto_reconnect_allowed
@@ -1018,16 +1095,41 @@ module Tinkerforge
1018
1095
  uid = Packer.get_uid_from_data packet
1019
1096
  function_id = Packer.get_function_id_from_data packet
1020
1097
 
1021
- if function_id == CALLBACK_ENUMERATE and \
1022
- @registered_callbacks.has_key? CALLBACK_ENUMERATE
1098
+ if function_id == CALLBACK_ENUMERATE
1099
+ cb = @registered_callbacks[CALLBACK_ENUMERATE]
1100
+
1101
+ if cb == nil
1102
+ return
1103
+ end
1104
+
1105
+ if packet.length != 34
1106
+ return # silently ignoring callback with wrong length
1107
+ end
1108
+
1023
1109
  payload = Packer.unpack packet[8..-1], 'Z8 Z8 k C3 C3 S C'
1024
- @registered_callbacks[CALLBACK_ENUMERATE].call(*payload)
1025
- elsif @devices.has_key? uid
1026
- device = @devices[uid]
1110
+
1111
+ cb.call(*payload)
1112
+ return
1113
+ end
1114
+
1115
+ device = @devices[uid]
1116
+
1117
+ if device != nil
1118
+ begin
1119
+ device.check_validity
1120
+ rescue TinkerforgeException
1121
+ return # silently ignoring callback for invalid device
1122
+ end
1027
1123
 
1028
1124
  if device.high_level_callbacks.has_key?(-function_id)
1029
1125
  hlcb = device.high_level_callbacks[-function_id] # [roles, options, data]
1030
- payload = Packer.unpack packet[8..-1], device.callback_formats[function_id]
1126
+ format = device.callback_formats[function_id] # FIXME: currently assuming that low-level callback has more than one element
1127
+
1128
+ if packet.length != format[0]
1129
+ return # silently ignoring callback with wrong length
1130
+ end
1131
+
1132
+ payload = Packer.unpack packet[8..-1], format[1]
1031
1133
  has_data = false
1032
1134
  data = nil
1033
1135
 
@@ -1071,7 +1173,9 @@ module Tinkerforge
1071
1173
  end
1072
1174
  end
1073
1175
 
1074
- if has_data and device.registered_callbacks.has_key?(-function_id)
1176
+ cb = device.registered_callbacks[-function_id]
1177
+
1178
+ if has_data and cb != nil
1075
1179
  result = []
1076
1180
 
1077
1181
  hlcb[0].zip(payload).each do |role, value|
@@ -1082,14 +1186,27 @@ module Tinkerforge
1082
1186
  end
1083
1187
  end
1084
1188
 
1085
- device.registered_callbacks[-function_id].call(*result)
1189
+ cb.call(*result)
1086
1190
  end
1087
1191
  end
1088
1192
  end
1089
1193
 
1090
- if device.registered_callbacks.has_key? function_id
1091
- payload = Packer.unpack packet[8..-1], device.callback_formats[function_id]
1092
- device.registered_callbacks[function_id].call(*payload)
1194
+ cb = device.registered_callbacks[function_id]
1195
+
1196
+ if cb != nil
1197
+ format = device.callback_formats[function_id]
1198
+
1199
+ if format == nil
1200
+ return # silently ignore registered but unknown callback
1201
+ end
1202
+
1203
+ if packet.length != format[0]
1204
+ return # silently ignoring callback with wrong length
1205
+ end
1206
+
1207
+ payload = Packer.unpack packet[8..-1], format[1]
1208
+
1209
+ cb.call(*payload)
1093
1210
  end
1094
1211
  end
1095
1212
  end
@@ -1172,7 +1289,6 @@ module Tinkerforge
1172
1289
  def handle_response(packet)
1173
1290
  @disconnect_probe_flag = false
1174
1291
 
1175
- uid = Packer.get_uid_from_data packet
1176
1292
  function_id = Packer.get_function_id_from_data packet
1177
1293
  sequence_number = Packer.get_sequence_number_from_data packet
1178
1294
 
@@ -1180,9 +1296,13 @@ module Tinkerforge
1180
1296
  if @registered_callbacks.has_key? CALLBACK_ENUMERATE
1181
1297
  @callback.queue.push [QUEUE_KIND_PACKET, packet]
1182
1298
  end
1183
- elsif @devices.has_key? uid
1184
- device = @devices[uid]
1299
+ return
1300
+ end
1301
+
1302
+ uid = Packer.get_uid_from_data packet
1303
+ device = @devices[uid]
1185
1304
 
1305
+ if device != nil
1186
1306
  if sequence_number == 0
1187
1307
  if device.registered_callbacks.has_key? function_id or \
1188
1308
  device.high_level_callbacks.has_key?(-function_id)