xarm-python-sdk 1.15.2__py3-none-any.whl

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 (63) hide show
  1. xarm/__init__.py +2 -0
  2. xarm/build_backend.py +17 -0
  3. xarm/core/__init__.py +2 -0
  4. xarm/core/comm/__init__.py +5 -0
  5. xarm/core/comm/base.py +303 -0
  6. xarm/core/comm/serial_port.py +44 -0
  7. xarm/core/comm/socket_port.py +150 -0
  8. xarm/core/comm/uxbus_cmd_protocol.py +100 -0
  9. xarm/core/config/__init__.py +0 -0
  10. xarm/core/config/x_code.py +1427 -0
  11. xarm/core/config/x_config.py +553 -0
  12. xarm/core/utils/__init__.py +3 -0
  13. xarm/core/utils/convert.py +124 -0
  14. xarm/core/utils/crc16.py +76 -0
  15. xarm/core/utils/debug_print.py +21 -0
  16. xarm/core/utils/log.py +98 -0
  17. xarm/core/version.py +1 -0
  18. xarm/core/wrapper/__init__.py +11 -0
  19. xarm/core/wrapper/uxbus_cmd.py +1457 -0
  20. xarm/core/wrapper/uxbus_cmd_ser.py +94 -0
  21. xarm/core/wrapper/uxbus_cmd_tcp.py +305 -0
  22. xarm/tools/__init__.py +0 -0
  23. xarm/tools/blockly/__init__.py +1 -0
  24. xarm/tools/blockly/_blockly_base.py +416 -0
  25. xarm/tools/blockly/_blockly_handler.py +1338 -0
  26. xarm/tools/blockly/_blockly_highlight.py +94 -0
  27. xarm/tools/blockly/_blockly_node.py +61 -0
  28. xarm/tools/blockly/_blockly_tool.py +480 -0
  29. xarm/tools/blockly_tool.py +1864 -0
  30. xarm/tools/gcode.py +90 -0
  31. xarm/tools/list_ports.py +39 -0
  32. xarm/tools/modbus_tcp.py +205 -0
  33. xarm/tools/threads.py +30 -0
  34. xarm/tools/utils.py +36 -0
  35. xarm/version.py +1 -0
  36. xarm/wrapper/__init__.py +1 -0
  37. xarm/wrapper/studio_api.py +34 -0
  38. xarm/wrapper/xarm_api.py +4416 -0
  39. xarm/x3/__init__.py +2 -0
  40. xarm/x3/base.py +2638 -0
  41. xarm/x3/base_board.py +198 -0
  42. xarm/x3/code.py +62 -0
  43. xarm/x3/decorator.py +104 -0
  44. xarm/x3/events.py +166 -0
  45. xarm/x3/ft_sensor.py +264 -0
  46. xarm/x3/gpio.py +457 -0
  47. xarm/x3/grammar_async.py +21 -0
  48. xarm/x3/grammar_coroutine.py +24 -0
  49. xarm/x3/gripper.py +830 -0
  50. xarm/x3/modbus_tcp.py +84 -0
  51. xarm/x3/parse.py +110 -0
  52. xarm/x3/record.py +216 -0
  53. xarm/x3/report.py +204 -0
  54. xarm/x3/robotiq.py +220 -0
  55. xarm/x3/servo.py +485 -0
  56. xarm/x3/studio.py +138 -0
  57. xarm/x3/track.py +424 -0
  58. xarm/x3/utils.py +43 -0
  59. xarm/x3/xarm.py +1928 -0
  60. xarm_python_sdk-1.15.2.dist-info/METADATA +103 -0
  61. xarm_python_sdk-1.15.2.dist-info/RECORD +63 -0
  62. xarm_python_sdk-1.15.2.dist-info/WHEEL +4 -0
  63. xarm_python_sdk-1.15.2.dist-info/licenses/LICENSE +27 -0
@@ -0,0 +1,1338 @@
1
+ #!/usr/bin/env python3
2
+ # Software License Agreement (BSD License)
3
+ #
4
+ # Copyright (c) 2022, UFACTORY, Inc.
5
+ # All rights reserved.
6
+ #
7
+ # Author: Vinman <vinman.wen@ufactory.cc> <vinman.cub@gmail.com>
8
+
9
+ import json
10
+ import re
11
+ import math
12
+ from ._blockly_base import _BlocklyBase, OPS_MAP
13
+ from ._blockly_highlight import HIGHLIGHT_BLOCKS
14
+
15
+
16
+ class _BlocklyHandler(_BlocklyBase):
17
+ def __init__(self, xml_path):
18
+ super(_BlocklyHandler, self).__init__(xml_path)
19
+ self._succeed = True
20
+ self._highlight_callback = None
21
+ self._loop_interval_sec = -1
22
+ self._init_code_list = []
23
+ self._main_init_code_list = []
24
+ self._main_func_code_list = []
25
+ self._main_run_code_list = []
26
+ self._is_main_run_code = True
27
+ self._is_exec = False
28
+ self._is_ide = False
29
+
30
+ self._listen_tgpio_digital = False
31
+ self._listen_tgpio_analog = False
32
+ self._listen_cgpio_state = False
33
+ self._listen_count = False
34
+ self._listen_holding = False
35
+ self._tgpio_digital_callbacks = []
36
+ self._tgpio_analog_callbacks = []
37
+ self._cgpio_digital_callbacks = []
38
+ self._cgpio_analog_callbacks = []
39
+ self._count_callbacks= []
40
+ self._holding_callbacks= []
41
+
42
+ self.is_run_linear_track = False
43
+ self._is_run_blockly = False
44
+ self._listen_counter = False
45
+ self._vacuum_version = '1'
46
+
47
+ def _append_init_code(self, code):
48
+ self._init_code_list.append(code)
49
+
50
+ def _append_main_init_code(self, code, indent=0):
51
+ self._main_init_code_list.append('{}{}'.format(' ' * indent, code))
52
+
53
+ def _append_main_code(self, code, indent=0):
54
+ if self._is_main_run_code:
55
+ self._main_run_code_list.append('{}{}'.format(' ' * (indent + 1), code))
56
+ else:
57
+ self._main_func_code_list.append('{}{}'.format(' ' * indent, code))
58
+
59
+ def _parse_variables(self):
60
+ variables = self._get_nodes('variables')
61
+ var_list = []
62
+ for var in variables:
63
+ for variable in self._get_nodes('variable', root=var):
64
+ var_list.append(variable.text)
65
+ return var_list
66
+
67
+ def _parse_block(self, root=None, indent=0, arg_map=None, **kwargs):
68
+ blocks = self._get_nodes('block', root=root)
69
+ for block in blocks:
70
+ # if not self._succeed:
71
+ # return
72
+ is_statement = root is None or root.tag == self._ns + 'statement'
73
+ while block is not None:
74
+ if not is_statement:
75
+ block = self._get_node('next', root=block)
76
+ if not block:
77
+ break
78
+ block = self._get_node('block', root=block)
79
+ else:
80
+ is_statement = False
81
+ if block.attrib.get('disabled', False):
82
+ continue
83
+ func = getattr(self, '_handle_{}'.format(block.attrib['type']), None)
84
+ if func and callable(func):
85
+ if self._highlight_callback is not None:
86
+ if block.attrib['type'] in HIGHLIGHT_BLOCKS:
87
+ self._append_main_code('highlight_callback(\'{}\')'.format(block.attrib['id']), indent=indent+2)
88
+ try:
89
+ func(block, indent, arg_map=arg_map, **kwargs)
90
+ except Exception as e:
91
+ self._succeed = False
92
+ print('convert {} failed, {}'.format(block.attrib['type'], e))
93
+ else:
94
+ self._succeed = False
95
+ print('block {} can\'t convert to python code'.format(block.attrib['type']))
96
+
97
+ def _handle_set_speed(self, block, indent=0, arg_map=None):
98
+ self._append_main_code('self._tcp_speed = {}'.format(self._get_field_value(block)), indent + 2)
99
+
100
+ def _handle_set_acceleration(self, block, indent=0, arg_map=None):
101
+ self._append_main_code('self._tcp_acc = {}'.format(self._get_field_value(block)), indent + 2)
102
+
103
+ def _handle_set_angle_speed(self, block, indent=0, arg_map=None):
104
+ self._append_main_code('self._angle_speed = {}'.format(self._get_field_value(block)), indent + 2)
105
+
106
+ def _handle_set_angle_acceleration(self, block, indent=0, arg_map=None):
107
+ self._append_main_code('self._angle_acc = {}'.format(self._get_field_value(block)), indent + 2)
108
+
109
+ def _handle_set_counter_increase(self, block, indent=0, arg_map=None):
110
+ self._listen_counter = True
111
+ self._append_main_code('code = self._arm.set_counter_increase()', indent + 2)
112
+ self._append_main_code('if not self._check_code(code, \'set_counter_increase\'):', indent + 2)
113
+ self._append_main_code(' return', indent + 2)
114
+
115
+ def _handle_set_counter_reset(self, block, indent=0, arg_map=None):
116
+ self._listen_counter = True
117
+ self._append_main_code('code = self._arm.set_counter_reset()', indent + 2)
118
+ self._append_main_code('if not self._check_code(code, \'set_counter_reset\'):', indent + 2)
119
+ self._append_main_code(' return', indent + 2)
120
+
121
+ def _handle_reset(self, block, indent=0, arg_map=None):
122
+ self._append_main_code('self._arm.move_gohome()', indent + 2)
123
+
124
+ def _handle_sleep(self, block, indent=0, arg_map=None):
125
+ value = self._get_node('value', root=block)
126
+ value = self._get_block_val(value, arg_map=arg_map)
127
+ self._append_main_code('code = self._arm.set_pause_time({})'.format(value), indent + 2)
128
+ self._append_main_code('if not self._check_code(code, \'set_pause_time\'):', indent + 2)
129
+ self._append_main_code(' return', indent + 2)
130
+
131
+ def _handle_move(self, block, indent=0, arg_map=None):
132
+ fields = self._get_nodes('field', root=block)
133
+ orientation = fields[0].text
134
+ value = fields[1].text if orientation == 'forward' or orientation == 'left' or orientation == 'up' else '-{}'.format(fields[1].text)
135
+ wait = fields[2].text == 'TRUE'
136
+ param = 'x' if orientation == 'forward' or orientation == 'backward' else 'y' if orientation == 'left' or orientation == 'right' else 'z' if orientation == 'up' or orientation == 'down' else None
137
+ if param is None:
138
+ return
139
+ radius = -1 if wait else 0
140
+ self._append_main_code('code = self._arm.set_position({}={}, radius={}, speed=self._tcp_speed, mvacc=self._tcp_acc, relative=True, wait={})'.format(param, value, radius, wait), indent + 2)
141
+ self._append_main_code('if not self._check_code(code, \'set_position\'):', indent + 2)
142
+ self._append_main_code(' return', indent + 2)
143
+
144
+ def _handle_move_variable(self, block, indent=0, arg_map=None):
145
+ fields = self._get_nodes('field', root=block)
146
+ orientation = fields[0].text
147
+ wait = fields[1].text == 'TRUE'
148
+ value = self._get_node('value', root=block)
149
+ value = self._get_block_val(value, arg_map=arg_map)
150
+ value = value if orientation == 'forward' or orientation == 'left' or orientation == 'up' else '-{}'.format(
151
+ value)
152
+ param = 'x' if orientation == 'forward' or orientation == 'backward' else 'y' if orientation == 'left' or orientation == 'right' else 'z' if orientation == 'up' or orientation == 'down' else None
153
+ if param is None:
154
+ return
155
+ radius = -1 if wait else 0
156
+ self._append_main_code(
157
+ 'code = self._arm.set_position({}={}, radius={}, speed=self._tcp_speed, mvacc=self._tcp_acc, relative=True, wait={})'.format(
158
+ param, value, radius, wait), indent + 2)
159
+ self._append_main_code('if not self._check_code(code, \'set_position\'):', indent + 2)
160
+ self._append_main_code(' return', indent + 2)
161
+
162
+ def _handle_move_arc_to(self, block, indent=0, arg_map=None):
163
+ value = self._get_node('value', root=block)
164
+ p_block = self._get_node('block', root=value)
165
+ fields = self._get_nodes('field', root=p_block)
166
+ values = []
167
+ for field in fields[:-2]:
168
+ values.append(float(field.text))
169
+ radius = float(fields[-2].text)
170
+ wait = fields[-1].text == 'TRUE'
171
+ self._append_main_code('code = self._arm.set_position(*{}, speed=self._tcp_speed, mvacc=self._tcp_acc, radius={}, wait={})'.format(values, radius, wait), indent + 2)
172
+ self._append_main_code('if not self._check_code(code, \'set_position\'):', indent + 2)
173
+ self._append_main_code(' return', indent + 2)
174
+
175
+ def _handle_move_circle(self, block, indent=0, arg_map=None):
176
+ values = self._get_nodes('value', root=block)
177
+ percent = self._get_block_val(values[2], arg_map=arg_map)
178
+ wait = self._get_block_val(values[3], arg_map=arg_map)
179
+ if wait == 'TRUE' or wait == 'FALSE':
180
+ wait = wait == 'TRUE'
181
+ p1_block = self._get_node('block', root=values[0])
182
+ fields = self._get_nodes('field', root=p1_block)
183
+ pose1 = []
184
+ for field in fields:
185
+ pose1.append(float(field.text))
186
+ p2_block = self._get_node('block', root=values[1])
187
+ fields = self._get_nodes('field', root=p2_block)
188
+ pose2 = []
189
+ for field in fields:
190
+ pose2.append(float(field.text))
191
+ self._append_main_code('code = self._arm.move_circle({}, {}, float({}) / 360 * 100, speed=self._tcp_speed, mvacc=self._tcp_acc, wait={})'.format(pose1, pose2, percent, wait), indent + 2)
192
+ self._append_main_code('if not self._check_code(code, \'move_circle\'):', indent + 2)
193
+ self._append_main_code(' return', indent + 2)
194
+
195
+ def _handle_move_7(self, block, indent=0, arg_map=None):
196
+ value = self._get_node('value', root=block)
197
+ p_block = self._get_node('block', root=value)
198
+ fields = self._get_nodes('field', root=p_block)
199
+ values = []
200
+ for field in fields[:-1]:
201
+ values.append(float(field.text))
202
+ wait = fields[-1].text == 'TRUE'
203
+ self._append_main_code('code = self._arm.set_servo_angle(angle={}, speed=self._angle_speed, mvacc=self._angle_acc, wait={})'.format(values, wait), indent + 2)
204
+ self._append_main_code('if not self._check_code(code, \'set_servo_angle\'):', indent + 2)
205
+ self._append_main_code(' return', indent + 2)
206
+
207
+ def _handle_move_joints(self, block, indent=0, arg_map=None):
208
+ fields = self._get_nodes('field', root=block)
209
+ values = []
210
+ for field in fields[:-1]:
211
+ values.append(float(field.text))
212
+ radius_fields = self._get_nodes('field', root=block, name='r')
213
+ if len(radius_fields) > 0:
214
+ radius = values[-1]
215
+ values = values[:-1]
216
+ else:
217
+ radius = None
218
+ wait = fields[-1].text == 'TRUE'
219
+ self._append_main_code('code = self._arm.set_servo_angle(angle={}, speed=self._angle_speed, mvacc=self._angle_acc, wait={}, radius={})'.format(values, wait, radius), indent + 2)
220
+ self._append_main_code('if not self._check_code(code, \'set_servo_angle\'):', indent + 2)
221
+ self._append_main_code(' return', indent + 2)
222
+
223
+ def _handle_move_cartesian(self, block, indent=0, arg_map=None):
224
+ fields = self._get_nodes('field', root=block)
225
+ values = []
226
+ for field in fields[:-2]:
227
+ values.append(float(field.text))
228
+ radius = float(fields[-2].text)
229
+ wait = fields[-1].text == 'TRUE'
230
+ self._append_main_code('code = self._arm.set_position(*{}, speed=self._tcp_speed, mvacc=self._tcp_acc, radius={}, wait={})'.format(values, radius, wait), indent + 2)
231
+ self._append_main_code('if not self._check_code(code, \'set_position\'):', indent + 2)
232
+ self._append_main_code(' return', indent + 2)
233
+
234
+ def _handle_move_tool_line(self, block, indent=0, arg_map=None):
235
+ fields = self._get_nodes('field', root=block)
236
+ values = []
237
+ for field in fields[:-1]:
238
+ values.append(float(field.text))
239
+ wait = fields[-1].text == 'TRUE'
240
+ self._append_main_code('code = self._arm.set_tool_position(*{}, speed=self._tcp_speed, mvacc=self._tcp_acc, wait={})'.format(values, wait), indent + 2)
241
+ self._append_main_code('if not self._check_code(code, \'set_position\'):', indent + 2)
242
+ self._append_main_code(' return', indent + 2)
243
+
244
+ def _handle_move_joints_var(self, block, indent=0, arg_map=None):
245
+ field = self._get_node('field', root=block)
246
+ wait = field.text == 'TRUE'
247
+ value_nodes = self._get_nodes('value', root=block)
248
+ values = []
249
+ for val_node in value_nodes:
250
+ val = self._get_condition_expression(val_node, arg_map=arg_map)
251
+ values.append(val)
252
+ radius_fields = self._get_nodes('value', root=block, name='r')
253
+ if len(radius_fields) > 0:
254
+ radius = values[-1]
255
+ values = values[:-1]
256
+ else:
257
+ radius = None
258
+ values = '[{}]'.format(','.join(values))
259
+ self._append_main_code('code = self._arm.set_servo_angle(angle={}, speed=self._angle_speed, mvacc=self._angle_acc, wait={}, radius={})'.format(values, wait, radius), indent + 2)
260
+ self._append_main_code('if not self._check_code(code, \'set_servo_angle\'):', indent + 2)
261
+ self._append_main_code(' return', indent + 2)
262
+
263
+ def _handle_move_cartesian_var(self, block, indent=0, arg_map=None):
264
+ field = self._get_node('field', root=block)
265
+ wait = field.text == 'TRUE'
266
+ value_nodes = self._get_nodes('value', root=block)
267
+ values = []
268
+ for val_node in value_nodes:
269
+ val = self._get_condition_expression(val_node, arg_map=arg_map)
270
+ values.append(val)
271
+ radius = values.pop()
272
+ values = '[{}]'.format(','.join(values))
273
+ self._append_main_code('code = self._arm.set_position(*{}, speed=self._tcp_speed, mvacc=self._tcp_acc, radius={}, wait={})'.format(values, radius, wait), indent + 2)
274
+ self._append_main_code('if not self._check_code(code, \'set_position\'):', indent + 2)
275
+ self._append_main_code(' return', indent + 2)
276
+
277
+ def _handle_move_circle_var(self, block, indent=0, arg_map=None):
278
+ values = self._get_nodes('value', root=block)
279
+ percent = self._get_block_val(values[2], arg_map=arg_map)
280
+ wait = self._get_block_val(values[3], arg_map=arg_map)
281
+ if wait == 'TRUE' or wait == 'FALSE':
282
+ wait = wait == 'TRUE'
283
+
284
+ pose1_block= self._get_node('block', root=values[0])
285
+ pose1_nodes = self._get_nodes('value', root=pose1_block)
286
+ pose1 = []
287
+ for val_node in pose1_nodes:
288
+ val = self._get_condition_expression(val_node, arg_map=arg_map)
289
+ pose1.append(val)
290
+
291
+ pose2_block = self._get_node('block', root=values[1])
292
+ pose2_nodes = self._get_nodes('value', root=pose2_block)
293
+ pose2 = []
294
+ for val_node in pose2_nodes:
295
+ val = self._get_condition_expression(val_node, arg_map=arg_map)
296
+ pose2.append(val)
297
+
298
+ pose1 = '[{}]'.format(', '.join(pose1))
299
+ pose2 = '[{}]'.format(', '.join(pose2))
300
+ self._append_main_code('code = self._arm.move_circle({}, {}, float({}) / 360 * 100, speed=self._tcp_speed, mvacc=self._tcp_acc, wait={})'.format(pose1, pose2, percent, wait), indent + 2)
301
+ self._append_main_code('if not self._check_code(code, \'move_circle\'):', indent + 2)
302
+ self._append_main_code(' return', indent + 2)
303
+
304
+ def _handle_move_axis_angle(self, block, indent=0, arg_map=None):
305
+ fields = self._get_nodes('field', root=block)
306
+ values = []
307
+ for field in fields[:-2]:
308
+ values.append(float(field.text))
309
+ radius = float(fields[-2].text)
310
+ wait = fields[-1].text == 'TRUE'
311
+ self._append_main_code(
312
+ 'code = self._arm.set_position_aa({}, speed=self._tcp_speed, mvacc=self._tcp_acc, radius={}, wait={})'.format(
313
+ values, radius, wait), indent + 2)
314
+ self._append_main_code('if not self._check_code(code, \'set_position_aa\'):', indent + 2)
315
+ self._append_main_code(' return', indent + 2)
316
+
317
+ def _handle_move_axis_angle_variable(self, block, indent=0, arg_map=None):
318
+ field = self._get_node('field', root=block)
319
+ wait = field.text == 'TRUE'
320
+ value_nodes = self._get_nodes('value', root=block)
321
+ values = []
322
+ for val_node in value_nodes:
323
+ val = self._get_condition_expression(val_node, arg_map=arg_map)
324
+ values.append(val)
325
+ radius = values.pop()
326
+ values = '[{}]'.format(','.join(values))
327
+ self._append_main_code(
328
+ 'code = self._arm.set_position_aa({}, speed=self._tcp_speed, mvacc=self._tcp_acc, radius={}, wait={})'.format(
329
+ values, radius, wait), indent + 2)
330
+ self._append_main_code('if not self._check_code(code, \'set_position_aa\'):', indent + 2)
331
+ self._append_main_code(' return', indent + 2)
332
+
333
+
334
+ def _handle_motion_set_state(self, block, indent=0, arg_map=None):
335
+ fields = self._get_nodes('field', root=block)
336
+ state = fields[0].text
337
+ self._append_main_code('code = self._arm.set_state({})'.format(state), indent + 2)
338
+ self._append_main_code('if not self._check_code(code, \'set_state\'):', indent + 2)
339
+ self._append_main_code(' return', indent + 2)
340
+
341
+ def _handle_motion_stop(self, block, indent=0, arg_map=None):
342
+ self._append_main_code('self._arm.emergency_stop()', indent + 2)
343
+
344
+ def _handle_studio_run_traj(self, block, indent=0, arg_map=None):
345
+ fields = self._get_nodes('field', root=block)
346
+ filename = fields[0].text
347
+ speed = fields[1].text
348
+ times = fields[2].text
349
+ if filename:
350
+ self._append_main_code('code = self._arm.playback_trajectory(times={}, filename=\'{}\', wait=True, double_speed={})'.format(times, filename, speed), indent + 2)
351
+ self._append_main_code('if not self._check_code(code, \'playback_trajectory\'):', indent + 2)
352
+ self._append_main_code(' return', indent + 2)
353
+ else:
354
+ self._append_main_code('pass', indent + 2)
355
+
356
+ def _handle_app_studio_traj(self, block, indent=0, arg_map=None):
357
+ fields = self._get_nodes('field', root=block)
358
+ filename = fields[0].text
359
+ speed = fields[1].text
360
+ value = self._get_node('value', root=block)
361
+ times = self._get_nodes('field', root=value, descendant=True)[0].text
362
+ self._append_main_code('code = self._arm.playback_trajectory(times={}, filename=\'{}\', wait=True, double_speed={})'.format(times, filename, speed), indent + 2)
363
+ self._append_main_code('if not self._check_code(code, \'playback_trajectory\'):', indent + 2)
364
+ self._append_main_code(' return', indent + 2)
365
+
366
+ def _handle_tool_message(self, block, indent=0, arg_map=None):
367
+ fields = self._get_nodes('field', block)
368
+ color = json.dumps(fields[0].text, ensure_ascii=False) if len(fields) > 1 else 'white'
369
+ msg = json.dumps(fields[2].text if fields[-1].text is not None else '', ensure_ascii=False)
370
+ if self._highlight_callback is not None:
371
+ self._append_main_code('print({}, color={})'.format(msg, color), indent + 2)
372
+ else:
373
+ self._append_main_code('print({})'.format(msg), indent + 2)
374
+
375
+ def _handle_tool_console(self, block, indent=0, arg_map=None):
376
+ fields = self._get_nodes('field', block)
377
+ color = json.dumps(fields[0].text, ensure_ascii=False) if len(fields) > 1 else 'white'
378
+ msg = json.dumps(fields[1].text if fields[-1].text is not None else '', ensure_ascii=False)
379
+ if self._highlight_callback is not None:
380
+ self._append_main_code('print({}, color={})'.format(msg, color), indent + 2)
381
+ else:
382
+ self._append_main_code('print({})'.format(msg), indent + 2)
383
+
384
+ def _handle_tool_console_with_variable(self, block, indent=0, arg_map=None):
385
+ fields = self._get_nodes('field', block)
386
+ color = json.dumps(fields[0].text, ensure_ascii=False)
387
+ msg = fields[1].text
388
+ value = self._get_node('value', block)
389
+ expression = self._get_condition_expression(value, arg_map=arg_map)
390
+ if msg:
391
+ if self._highlight_callback is not None:
392
+ self._append_main_code('print({}.format({}), color={})'.format(json.dumps(msg+'{}', ensure_ascii=False), expression, color), indent + 2)
393
+ else:
394
+ self._append_main_code('print({}.format({}))'.format(json.dumps(msg+'{}', ensure_ascii=False), expression), indent + 2)
395
+ else:
396
+ if self._highlight_callback is not None:
397
+ self._append_main_code('print(\'{{}}\'.format({}), color={})'.format(expression, color), indent + 2)
398
+ else:
399
+ self._append_main_code('print(\'{{}}\'.format({}))'.format(expression), indent + 2)
400
+
401
+ def _handle_wait(self, block, indent=0, arg_map=None):
402
+ value = self._get_node('value', root=block)
403
+ value = float(self._get_nodes('field', root=value, descendant=True)[0].text)
404
+ self._append_main_code('for i in range({}):'.format(int(value / 0.1)), indent + 2)
405
+ self._append_main_code(' time.sleep(0.1)', indent + 2)
406
+ self._append_main_code(' if not self.is_alive:', indent=indent + 2)
407
+ self._append_main_code(' return', indent=indent + 2)
408
+
409
+ def _handle_gpio_get_digital(self, block, indent=0, arg_map=None):
410
+ io = self._get_node('field', block).text
411
+ self._append_main_code('self._arm.get_tgpio_digital({})'.format(io), indent + 2)
412
+
413
+ def _handle_gpio_get_analog(self, block, indent=0, arg_map=None):
414
+ io = self._get_node('field', block).text
415
+ self._append_main_code('self._arm.get_tgpio_analog({})'.format(io), indent + 2)
416
+
417
+ def _handle_gpio_set_digital(self, block, indent=0, arg_map=None):
418
+ fields = self._get_nodes('field', root=block)
419
+ io = fields[0].text
420
+ value = 0 if fields[1].text == 'LOW' else 1
421
+ is_sync = fields[2].text if len(fields) > 2 else 'True'
422
+ delay_sec = fields[3].text if len(fields) > 3 else 0
423
+ self._append_main_code('code = self._arm.set_tgpio_digital({}, {}, delay_sec={}, sync={})'.format(io, value, delay_sec, is_sync), indent + 2)
424
+ self._append_main_code('if not self._check_code(code, \'set_tgpio_digital\'):', indent + 2)
425
+ self._append_main_code(' return', indent + 2)
426
+
427
+ def _handle_gpio_set_digital_with_xyz(self, block, indent=0, arg_map=None):
428
+ fields = self._get_nodes('field', root=block)
429
+ x = fields[0].text
430
+ y = fields[1].text
431
+ z = fields[2].text
432
+ xyz = list(map(float, [x, y, z]))
433
+ tol_r = fields[3].text
434
+ io = fields[4].text
435
+ value = 0 if fields[5].text == 'LOW' else 1
436
+ self._append_main_code('code = self._arm.set_tgpio_digital_with_xyz({}, {}, {}, {})'.format(io, value, xyz, tol_r), indent + 2)
437
+ self._append_main_code('if not self._check_code(code, \'set_tgpio_digital_with_xyz\'):', indent + 2)
438
+ self._append_main_code(' return', indent + 2)
439
+
440
+ def _handle_gpio_set_digital_with_xyz_var(self, block, indent=0, arg_map=None):
441
+ value_nodes = self._get_nodes('value', root=block)
442
+ x = self._get_block_val(value_nodes[0], arg_map)
443
+ y = self._get_block_val(value_nodes[1], arg_map)
444
+ z = self._get_block_val(value_nodes[2], arg_map)
445
+ xyz_li = [x, y, z]
446
+ xyz = []
447
+ for i in range(3):
448
+ if re.match('\d+(\.\d+)*$', xyz_li[i]) is not None:
449
+ xyz.append(float(xyz_li[i]))
450
+ else:
451
+ xyz.append(math.log2(3) if i == 0 else math.log2(5) if i == 1 else math.log2(7))
452
+ xyz = str(xyz).replace(str(math.log2(3)), xyz_li[0]).replace(str(math.log2(5)), xyz_li[1]).replace(
453
+ str(math.log2(7)), xyz_li[2])
454
+ tol_r = self._get_block_val(value_nodes[3], arg_map)
455
+ io = self._get_block_val(value_nodes[4], arg_map)
456
+ value = 0 if self._get_block_val(value_nodes[5], arg_map) == 'LOW' else 1
457
+ self._append_main_code(
458
+ 'code = self._arm.set_tgpio_digital_with_xyz({}, {}, {}, {})'.format(io, value, xyz, tol_r), indent + 2)
459
+ self._append_main_code('if not self._check_code(code, \'set_tgpio_digital_with_xyz\'):', indent + 2)
460
+ self._append_main_code(' return', indent + 2)
461
+
462
+ def _handle_get_suction_cup(self, block, indent=0, arg_map=None):
463
+ self._append_main_code('{}self._arm.get_suction_cup(hardware_version={})'.format('{}', self._vacuum_version), indent + 2)
464
+
465
+ def _handle_check_air_pump_state(self, block, indent=0, arg_map=None):
466
+ fields = self._get_nodes('field', root=block)
467
+ state = 1 if fields[0].text == 'ON' else 0
468
+ timeout = float(fields[1].text)
469
+ self._append_main_code('self._arm.arm.check_air_pump_state({}, timeout={}, hardware_version={})'.format(state, timeout, self._vacuum_version), indent + 2)
470
+
471
+ def _handle_check_bio_gripper_is_catch(self, block, indent=0, arg_map=None):
472
+ fields = self._get_nodes('field', root=block)
473
+ timeout = float(fields[0].text)
474
+ self._append_main_code('self._arm.arm.check_bio_gripper_is_catch(timeout={})'.format(timeout), indent + 2)
475
+
476
+ def _handle_check_robotiq_is_catch(self, block, indent=0, arg_map=None):
477
+ fields = self._get_nodes('field', root=block)
478
+ timeout = float(fields[0].text)
479
+ self._append_main_code('self._arm.arm.check_robotiq_is_catch(timeout={})'.format(timeout), indent + 2)
480
+
481
+ def _handle_set_suction_cup(self, block, indent=0, arg_map=None):
482
+ fields = self._get_nodes('field', root=block, name='trigger')
483
+ on = True if fields[0].text == 'ON' else False
484
+ fields = self._get_nodes('field', root=block, name='wait')
485
+ if fields and len(fields) > 0:
486
+ wait = fields[0].text == 'TRUE'
487
+ else:
488
+ wait = False
489
+ fields = self._get_nodes('field', root=block, name='delay')
490
+ delay_sec = fields[0].text if len(fields) > 0 else 0
491
+ self._append_main_code('code = self._arm.set_suction_cup({}, wait={}, delay_sec={}, hardware_version={})'.format(on, wait, delay_sec, self._vacuum_version), indent + 2)
492
+ self._append_main_code('if not self._check_code(code, \'set_suction_cup\'):', indent + 2)
493
+ self._append_main_code(' return', indent + 2)
494
+
495
+ def _handle_gpio_get_controller_digital(self, block, indent=0, arg_map=None):
496
+ io = self._get_node('field', block).text
497
+ self._append_main_code('self._arm.get_cgpio_digital({})'.format(io), indent + 2)
498
+
499
+ def _handle_gpio_get_controller_digital_di(self, block, indent=0, arg_map=None):
500
+ io = self._get_node('field', block).text
501
+ self._append_main_code('self._arm.get_cgpio_digital({})'.format(io), indent + 2)
502
+
503
+ def _handle_gpio_get_controller_ci_li(self, block, indent=0, arg_map=None):
504
+ fields = self._get_nodes('field', root=block)
505
+ values = []
506
+ for field in fields[:-1]:
507
+ values.append(int(field.text))
508
+ timeout = float(fields[-1].text)
509
+ self._append_main_code('self._arm.arm.get_cgpio_li_state({},timeout={},is_ci=True)'.format(values, timeout),
510
+ indent + 2)
511
+
512
+ def _handle_gpio_get_controller_di_li(self, block, indent=0, arg_map=None):
513
+ fields = self._get_nodes('field', root=block)
514
+ values = []
515
+ for field in fields[:-1]:
516
+ values.append(int(field.text))
517
+ timeout = float(fields[-1].text)
518
+ self._append_main_code('self._arm.arm.get_cgpio_li_state({},timeout={},is_ci=False)'.format(values, timeout),
519
+ indent + 2)
520
+
521
+ def _handle_gpio_get_tgpio_li(self, block, indent=0, arg_map=None):
522
+ fields = self._get_nodes('field', root=block)
523
+ values = []
524
+ for field in fields[:-1]:
525
+ values.append(int(field.text))
526
+ timeout = float(fields[-1].text)
527
+ self._append_main_code('self._arm.arm.get_tgpio_li_state({},timeout={})'.format(values, timeout),
528
+ indent + 2)
529
+
530
+ def _handle_gpio_get_controller_analog(self, block, indent=0, arg_map=None):
531
+ io = self._get_node('field', block).text
532
+ self._append_main_code('self._arm.get_cgpio_analog({})'.format(io), indent + 2)
533
+
534
+ def _handle_gpio_set_controller_digital(self, block, indent=0, arg_map=None):
535
+ fields = self._get_nodes('field', root=block)
536
+ io = fields[0].text
537
+ value = 0 if fields[1].text == 'LOW' else 1
538
+ is_sync = fields[2].text if len(fields) > 2 else 'True'
539
+ delay_sec = fields[3].text if len(fields) > 3 else 0
540
+ self._append_main_code('code = self._arm.set_cgpio_digital({}, {}, delay_sec={}, sync={})'.format(io, value, delay_sec, is_sync), indent + 2)
541
+ self._append_main_code('if not self._check_code(code, \'set_cgpio_digital\'):', indent + 2)
542
+ self._append_main_code(' return', indent + 2)
543
+
544
+ def _handle_gpio_set_controller_digital_with_xyz(self, block, indent=0, arg_map=None):
545
+ fields = self._get_nodes('field', root=block)
546
+ x = fields[0].text
547
+ y = fields[1].text
548
+ z = fields[2].text
549
+ xyz = list(map(float, [x, y, z]))
550
+ tol_r = fields[3].text
551
+ io = fields[4].text
552
+ value = 0 if fields[5].text == 'LOW' else 1
553
+ self._append_main_code(
554
+ 'code = self._arm.set_cgpio_digital_with_xyz({}, {}, {}, {})'.format(io, value, xyz, tol_r), indent + 2)
555
+ self._append_main_code('if not self._check_code(code, \'set_cgpio_digital_with_xyz\'):', indent + 2)
556
+ self._append_main_code(' return', indent + 2)
557
+
558
+ def _handle_gpio_set_controller_digital_with_xyz_var(self, block, indent=0, arg_map=None):
559
+ value_nodes = self._get_nodes('value', root=block)
560
+ x = self._get_block_val(value_nodes[0], arg_map)
561
+ y = self._get_block_val(value_nodes[1], arg_map)
562
+ z = self._get_block_val(value_nodes[2], arg_map)
563
+ xyz_li = [x, y, z]
564
+ xyz = []
565
+ for i in range(3):
566
+ if re.match('\d+(\.\d+)*$', xyz_li[i]) is not None:
567
+ xyz.append(float(xyz_li[i]))
568
+ else:
569
+ xyz.append(math.log2(3) if i == 0 else math.log2(5) if i == 1 else math.log2(7))
570
+ xyz = str(xyz).replace(str(math.log2(3)), xyz_li[0]).replace(str(math.log2(5)), xyz_li[1]).replace(str(math.log2(7)), xyz_li[2])
571
+ tol_r = self._get_block_val(value_nodes[3], arg_map)
572
+ io = self._get_block_val(value_nodes[4], arg_map)
573
+ value = 0 if self._get_block_val(value_nodes[5], arg_map) == 'LOW' else 1
574
+ self._append_main_code('code = self._arm.set_cgpio_digital_with_xyz({}, {}, {}, {})'.format(io, value, xyz, tol_r), indent + 2)
575
+ self._append_main_code('if not self._check_code(code, \'set_cgpio_digital_with_xyz\'):', indent + 2)
576
+ self._append_main_code(' return', indent + 2)
577
+
578
+ def _handle_gpio_set_controller_digital_do(self, block, indent=0, arg_map=None):
579
+ fields = self._get_nodes('field', root=block)
580
+ io = fields[0].text
581
+ value = 0 if fields[1].text == 'LOW' else 1
582
+ is_sync = fields[2].text if len(fields) > 2 else 'True'
583
+ delay_sec = fields[3].text if len(fields) > 3 else 0
584
+ self._append_main_code('code = self._arm.set_cgpio_digital({}, {}, delay_sec={}, sync={})'.format(io, value, delay_sec, is_sync), indent + 2)
585
+ self._append_main_code('if not self._check_code(code, \'set_cgpio_digital\'):', indent + 2)
586
+ self._append_main_code(' return', indent + 2)
587
+
588
+ def _handle_gpio_set_controller_digital_with_xyz_do(self, block, indent=0, arg_map=None):
589
+ value_nodes = self._get_nodes('value', root=block)
590
+ x = self._get_block_val(value_nodes[0], arg_map)
591
+ y = self._get_block_val(value_nodes[1], arg_map)
592
+ z = self._get_block_val(value_nodes[2], arg_map)
593
+ xyz = list(map(float, [x, y, z]))
594
+ tol_r = self._get_block_val(value_nodes[3], arg_map)
595
+ io = self._get_block_val(value_nodes[4], arg_map)
596
+ value = 0 if self._get_block_val(value_nodes[5], arg_map) == 'LOW' else 1
597
+ self._append_main_code(
598
+ 'code = self._arm.set_cgpio_digital_with_xyz({}, {}, {}, {})'.format(io, value, xyz, tol_r), indent + 2)
599
+ self._append_main_code('if not self._check_code(code, \'set_cgpio_digital_with_xyz\'):', indent + 2)
600
+ self._append_main_code(' return', indent + 2)
601
+
602
+ def _handle_gpio_set_controller_digital_with_xyz_do_var(self, block, indent=0, arg_map=None):
603
+ value_nodes = self._get_nodes('value', root=block)
604
+ x = self._get_block_val(value_nodes[0], arg_map)
605
+ y = self._get_block_val(value_nodes[1], arg_map)
606
+ z = self._get_block_val(value_nodes[2], arg_map)
607
+ tol_r = self._get_block_val(value_nodes[3], arg_map)
608
+ io = self._get_block_val(value_nodes[4], arg_map)
609
+ value = 0 if self._get_block_val(value_nodes[5], arg_map) == 'LOW' else 1
610
+ xyz_li = [x, y, z]
611
+ xyz = []
612
+ for i in range(3):
613
+ if re.match('\d+(\.\d+)*$', xyz_li[i]) is not None:
614
+ xyz.append(float(xyz_li[i]))
615
+ else:
616
+ xyz.append(math.log2(3) if i == 0 else math.log2(5) if i == 1 else math.log2(7))
617
+ xyz = str(xyz).replace(str(math.log2(3)), xyz_li[0]).replace(str(math.log2(5)), xyz_li[1]).replace(
618
+ str(math.log2(7)), xyz_li[2])
619
+ self._append_main_code('code = self._arm.set_cgpio_digital_with_xyz({}, {}, {}, {})'.format(io, value, xyz, tol_r), indent + 2)
620
+ self._append_main_code('if not self._check_code(code, \'set_cgpio_digital_with_xyz\'):', indent + 2)
621
+ self._append_main_code(' return', indent + 2)
622
+
623
+ def _handle_gpio_set_controller_analog_with_xyz(self, block, indent=0, arg_map=None):
624
+ fields = self._get_nodes('field', root=block)
625
+ x = fields[0].text
626
+ y = fields[1].text
627
+ z = fields[2].text
628
+ xyz = list(map(float, [x, y, z]))
629
+ tol_r = fields[3].text
630
+ io = fields[4].text
631
+ value = fields[5].text
632
+ self._append_main_code('code = self._arm.set_cgpio_analog_with_xyz({}, {}, {}, {})'.format(io, value, xyz, tol_r), indent + 2)
633
+ self._append_main_code('if not self._check_code(code, \'set_cgpio_analog_with_xyz\'):', indent + 2)
634
+ self._append_main_code(' return', indent + 2)
635
+
636
+ def _handle_gpio_set_controller_analog_with_xyz_var(self, block, indent=0, arg_map=None):
637
+ value_nodes = self._get_nodes('value', root=block)
638
+ x = self._get_block_val(value_nodes[0], arg_map)
639
+ y = self._get_block_val(value_nodes[1], arg_map)
640
+ z = self._get_block_val(value_nodes[2], arg_map)
641
+ # xyz = list(map(lambda x: float(x) if re.match('\d+(\.\d+)*$', x) is not None else [x, y, z].index(x), [x, y, z]))
642
+ xyz_li = [x, y, z]
643
+ xyz = []
644
+ for i in range(3):
645
+ if re.match('\d+(\.\d+)*$', xyz_li[i]) is not None:
646
+ xyz.append(float(xyz_li[i]))
647
+ else:
648
+ xyz.append(math.log2(3) if i == 0 else math.log2(5) if i == 1 else math.log2(7))
649
+ xyz = str(xyz).replace(str(math.log2(3)), xyz_li[0]).replace(str(math.log2(5)), xyz_li[1]).replace(
650
+ str(math.log2(7)), xyz_li[2])
651
+ tol_r = self._get_block_val(value_nodes[3], arg_map)
652
+ io = self._get_block_val(value_nodes[4], arg_map)
653
+ value = self._get_block_val(value_nodes[5], arg_map)
654
+ self._append_main_code('code = self._arm.set_cgpio_analog_with_xyz({}, {}, {}, {})'.format(io, value, xyz, tol_r), indent + 2)
655
+ self._append_main_code('if not self._check_code(code, \'set_cgpio_analog_with_xyz\'):', indent + 2)
656
+ self._append_main_code(' return', indent + 2)
657
+
658
+ def _handle_gpio_set_controller_analog(self, block, indent=0, arg_map=None):
659
+ fields = self._get_nodes('field', root=block)
660
+ io = fields[0].text
661
+ is_sync = fields[1].text
662
+ value = self._get_node('value', root=block)
663
+ value = self._get_block_val(value, arg_map=arg_map)
664
+ self._append_main_code('code = self._arm.set_cgpio_analog({}, {}, sync={})'.format(io, value, is_sync), indent + 2)
665
+ self._append_main_code('if not self._check_code(code, \'set_cgpio_analog\'):', indent + 2)
666
+ self._append_main_code(' return', indent + 2)
667
+
668
+ def _handle_set_collision_sensitivity(self, block, indent=0, arg_map=None):
669
+ # value = self._get_node('value', root=block)
670
+ # value = self._get_nodes('field', root=value, descendant=True)[0].text
671
+ value = self._get_field_value(block)[0]
672
+ self._append_main_code('code = self._arm.set_collision_sensitivity({})'.format(value), indent + 2)
673
+ self._append_main_code('if not self._check_code(code, \'set_collision_sensitivity\'):', indent + 2)
674
+ self._append_main_code(' return', indent + 2)
675
+
676
+ def _handle_set_teach_sensitivity(self, block, indent=0, arg_map=None):
677
+ value = self._get_node('value', root=block)
678
+ value = self._get_nodes('field', root=value, descendant=True)[0].text
679
+ self._append_main_code('code = self._arm.set_teach_sensitivity({})'.format(value), indent + 2)
680
+ self._append_main_code('if not self._check_code(code, \'set_teach_sensitivity\'):', indent + 2)
681
+ self._append_main_code(' return', indent + 2)
682
+
683
+ def _handle_set_tcp_load(self, block, indent=0, arg_map=None):
684
+ fields = self._get_nodes('field', root=block)
685
+ weight = fields[1].text
686
+ x = fields[2].text
687
+ y = fields[3].text
688
+ z = fields[4].text
689
+ self._append_main_code('code = self._arm.set_tcp_load({}, [{}, {}, {}])'.format(weight, x, y, z), indent + 2)
690
+ self._append_main_code('if not self._check_code(code, \'set_tcp_load\'):', indent + 2)
691
+ self._append_main_code(' return', indent + 2)
692
+
693
+ def _handle_set_gravity_direction(self, block, indent=0, arg_map=None):
694
+ values = self._get_nodes('value', root=block)
695
+ x = self._get_nodes('field', root=values[0], descendant=True)[0].text
696
+ y = self._get_nodes('field', root=values[1], descendant=True)[0].text
697
+ z = self._get_nodes('field', root=values[2], descendant=True)[0].text
698
+ self._append_main_code('code = self._arm.set_gravity_direction([{}, {}, {}])'.format(x, y, z), indent + 2)
699
+ self._append_main_code('if not self._check_code(code, \'set_gravity_direction\'):', indent + 2)
700
+ self._append_main_code(' return', indent + 2)
701
+
702
+ def _handle_set_tcp_offset(self, block, indent=0, arg_map=None):
703
+ fields = self._get_nodes('field', root=block)
704
+ x = fields[1].text
705
+ y = fields[2].text
706
+ z = fields[3].text
707
+ roll = fields[4].text
708
+ pitch = fields[5].text
709
+ yaw = fields[6].text
710
+ self._append_main_code('code = self._arm.set_tcp_offset([{}, {}, {}, {}, {}, {}], wait=True)'.format(x, y, z, roll, pitch, yaw), indent + 2)
711
+ self._append_main_code('self._arm.set_state(0)', indent + 2)
712
+ self._append_main_code('if not self._check_code(code, \'set_tcp_offset\'):', indent + 2)
713
+ self._append_main_code(' return', indent + 2)
714
+ self._append_main_code('time.sleep(0.5)', indent + 2)
715
+
716
+ def _handle_set_world_offset(self, block, indent=0, arg_map=None):
717
+ fields = self._get_nodes('field', root=block)
718
+ x = fields[1].text
719
+ y = fields[2].text
720
+ z = fields[3].text
721
+ roll = fields[4].text
722
+ pitch = fields[5].text
723
+ yaw = fields[6].text
724
+ self._append_main_code('code = self._arm.set_world_offset([{}, {}, {}, {}, {}, {}])'.format(x, y, z, roll, pitch, yaw), indent + 2)
725
+ self._append_main_code('self._arm.set_state(0)', indent + 2)
726
+ self._append_main_code('if not self._check_code(code, \'set_world_offset\'):', indent + 2)
727
+ self._append_main_code(' return', indent + 2)
728
+ self._append_main_code('time.sleep(0.5)', indent + 2)
729
+
730
+ def _handle_set_lite6_gripper(self, block, indent=0, arg_map=None):
731
+ fields = self._get_nodes('field', root=block, name='trigger')
732
+ op = fields[0].text.upper()
733
+ func = ''
734
+ if op == 'OPEN':
735
+ func = 'open_lite6_gripper'
736
+ self._append_main_code('code = self._arm.{}()'.format(func), indent + 2)
737
+ elif op == 'CLOSE':
738
+ func = 'close_lite6_gripper'
739
+ self._append_main_code('code = self._arm.{}()'.format(func), indent + 2)
740
+ elif op == 'STOP':
741
+ func = 'stop_lite6_gripper'
742
+ self._append_main_code('code = self._arm.{}()'.format(func), indent + 2)
743
+ else:
744
+ return
745
+ self._append_main_code('if not self._check_code(code, \'{}\'):'.format(func), indent + 2)
746
+ self._append_main_code(' return', indent + 2)
747
+
748
+ def _handle_gripper_set(self, block, indent=0, arg_map=None):
749
+ fields = self._get_nodes('field', root=block)
750
+ if fields is not None and len(fields) >= 3:
751
+ pos = fields[0].text
752
+ speed = fields[1].text
753
+ wait = fields[2].text == 'TRUE'
754
+ else:
755
+ values = self._get_nodes('value', root=block)
756
+ pos = self._get_nodes('field', root=values[0], descendant=True)[0].text
757
+ speed = self._get_nodes('field', root=values[1], descendant=True)[0].text
758
+ wait = self._get_nodes('field', root=values[2], descendant=True)[0].text == 'TRUE'
759
+ self._append_main_code('code = self._arm.set_gripper_position({}, wait={}, speed={}, auto_enable=True)'.format(pos, wait, speed), indent + 2)
760
+ self._append_main_code('if not self._check_code(code, \'set_gripper_position\'):', indent + 2)
761
+ self._append_main_code(' return', indent + 2)
762
+
763
+ def _handle_gripper_set_variable(self, block, indent=0, arg_map=None):
764
+ fields = self._get_nodes('field', root=block)
765
+ wait = fields[0].text == 'TRUE'
766
+ values = self._get_nodes('value', root=block)
767
+ pos = self._get_block_val(values[0], arg_map)
768
+ speed = self._get_block_val(values[1], arg_map)
769
+ self._append_main_code('code = self._arm.set_gripper_position({}, wait={}, speed={}, auto_enable=True)'.format(pos, wait, speed), indent + 2)
770
+ self._append_main_code('if not self._check_code(code, \'set_gripper_position\'):', indent + 2)
771
+ self._append_main_code(' return', indent + 2)
772
+
773
+ def _handle_gripper_set_status(self, block, indent=0, arg_map=None):
774
+ fields = self._get_nodes('field', root=block, name='status')
775
+ status = True if fields[0].text == 'TRUE' else False
776
+ fields = self._get_nodes('field', root=block, name='delay')
777
+ delay_sec = fields[0].text if len(fields) > 0 else 0
778
+ self._append_main_code('code = self._arm.arm.set_gripper_status({}, delay_sec={})'.format(status, delay_sec), indent + 2)
779
+ self._append_main_code('if not self._check_code(code, \'set_gripper_status\'):', indent + 2)
780
+ self._append_main_code(' return', indent + 2)
781
+
782
+ def _handle_set_bio_g2_gripper_init(self, block, indent=0, arg_map=None):
783
+ self._append_main_code('code = self._arm.set_bio_gripper_enable(True)', indent + 2)
784
+ self._append_main_code('if not self._check_code(code, \'set_bio_gripper_enable\'):', indent + 2)
785
+ self._append_main_code(' return', indent + 2)
786
+
787
+ def _handle_set_bio_gripper_init(self, block, indent=0, arg_map=None):
788
+ self._append_main_code('code = self._arm.set_bio_gripper_enable(True)', indent + 2)
789
+ self._append_main_code('if not self._check_code(code, \'set_bio_gripper_enable\'):', indent + 2)
790
+ self._append_main_code(' return', indent + 2)
791
+
792
+ def _handle_set_bio_gripper(self, block, indent=0, arg_map=None):
793
+ fields = self._get_nodes('field', root=block, name='status')
794
+ on = True if fields[0].text == 'TRUE' else False
795
+ fields = self._get_nodes('field', root=block, name='speed')
796
+ speed = int(fields[0].text) if fields and len(fields) > 0 else 0
797
+ fields = self._get_nodes('field', root=block, name='wait')
798
+ wait = fields[0].text == 'TRUE' if fields and len(fields) > 0 else False
799
+ if on:
800
+ self._append_main_code('code = self._arm.open_bio_gripper(speed={}, wait={})'.format(speed, wait), indent + 2)
801
+ self._append_main_code('if not self._check_code(code, \'open_bio_gripper\'):', indent + 2)
802
+ self._append_main_code(' return', indent + 2)
803
+ else:
804
+ self._append_main_code('code = self._arm.close_bio_gripper(speed={}, wait={})'.format(speed, wait), indent + 2)
805
+ self._append_main_code('if not self._check_code(code, \'close_bio_gripper\'):', indent + 2)
806
+ self._append_main_code(' return', indent + 2)
807
+
808
+ def _handle_set_bio_gripper_pos_force(self, block, indent=0, arg_map=None):
809
+ fields = self._get_nodes('field', root=block)
810
+ pos = fields[0].text
811
+ speed = fields[1].text
812
+ force = fields[2].text
813
+ wait = fields[3].text == 'TRUE'
814
+ self._append_main_code('code = self._arm.set_bio_gripper_position(pos={}, speed={}, force={}, wait={})'.format(pos, speed, force, wait), indent + 2)
815
+ self._append_main_code('if not self._check_code(code, \'open_bio_gripper\'):', indent + 2)
816
+ self._append_main_code(' return', indent + 2)
817
+
818
+ def _handle_set_robotiq_init(self, block, indent=0, arg_map=None):
819
+ self._append_main_code('code, ret = self._arm.robotiq_reset()', indent + 2)
820
+ self._append_main_code('if not self._check_code(code, \'robotiq_reset\'):', indent + 2)
821
+ self._append_main_code(' return', indent + 2)
822
+ self._append_main_code('code, ret = self._arm.robotiq_set_activate(wait=True)', indent + 2)
823
+ self._append_main_code('if not self._check_code(code, \'robotiq_set_activate\'):', indent + 2)
824
+ self._append_main_code(' return', indent + 2)
825
+
826
+ def _handle_set_robotiq_gripper(self, block, indent=0, arg_map=None):
827
+ fields = self._get_nodes('field', root=block, name='pos')
828
+ pos = int(fields[0].text)
829
+ fields = self._get_nodes('field', root=block, name='speed')
830
+ speed = int(fields[0].text) if fields and len(fields) > 0 else 0xFF
831
+ fields = self._get_nodes('field', root=block, name='force')
832
+ force = int(fields[0].text) if fields and len(fields) > 0 else 0xFF
833
+ fields = self._get_nodes('field', root=block, name='wait')
834
+ wait = fields[0].text == 'TRUE' if fields and len(fields) > 0 else False
835
+ self._append_main_code('code, ret = self._arm.robotiq_set_position({}, speed={}, force={}, wait={})'.format(pos, speed, force, wait), indent + 2)
836
+ self._append_main_code('if not self._check_code(code, \'robotiq_set_position\'):', indent + 2)
837
+ self._append_main_code(' return', indent + 2)
838
+
839
+ def __handle_gpio_event(self, gpio_type, block, indent=0, arg_map=None):
840
+ if gpio_type.startswith('listen'):
841
+ if gpio_type == 'listen_tgpio_digital':
842
+ self._listen_tgpio_digital = True
843
+ elif gpio_type == 'listen_tgpio_analog':
844
+ self._listen_tgpio_analog = True
845
+ elif gpio_type == 'listen_cgpio_state':
846
+ self._listen_cgpio_state = True
847
+ else:
848
+ return
849
+ else:
850
+ fields = self._get_nodes('field', root=block)
851
+ io = fields[0].text
852
+ trigger = fields[1].text
853
+
854
+ num = 1
855
+
856
+ self._is_main_run_code = False
857
+ if gpio_type == 'tgpio_digital':
858
+ num = len(self._tgpio_digital_callbacks) + 1
859
+ name = 'tool_gpio_{}_digital_is_changed_callback_{}'.format(io, num)
860
+ self._append_main_code('# Define Tool GPIO-{} DIGITAL is {} callback'.format(io, trigger), indent=1)
861
+ elif gpio_type == 'tgpio_analog':
862
+ num = len(self._tgpio_analog_callbacks) + 1
863
+ name = 'tool_gpio_{}_analog_is_changed_callback_{}'.format(io, num)
864
+ self._append_main_code('# Define Tool GPIO-{} ANALOG is changed callback'.format(io), indent=1)
865
+ elif gpio_type == 'cgpio_digital':
866
+ num = len(self._cgpio_digital_callbacks) + 1
867
+ name = 'controller_gpio_{}_digital_is_changed_callback_{}'.format(io, num)
868
+ self._append_main_code('# Define Contoller GPIO-{} DIGITAL is {} callback'.format(io, trigger), indent=1)
869
+ elif gpio_type == 'cgpio_analog':
870
+ num = len(self._cgpio_analog_callbacks) + 1
871
+ name = 'controller_gpio_{}_analog_is_changed_callback_{}'.format(io, num)
872
+ self._append_main_code('# Define Contoller GPIO-{} ANALOG is changed callback'.format(io), indent=1)
873
+ else:
874
+ self._is_main_run_code = True
875
+ return
876
+ self._append_main_code('def {}(self):'.format(name), indent=1)
877
+ statement = self._get_node('statement', root=block)
878
+ if statement:
879
+ self._parse_block(statement, indent, arg_map=arg_map)
880
+ else:
881
+ self._append_main_code('pass', indent=indent+3)
882
+ self._append_main_code('')
883
+
884
+ self._is_main_run_code = True
885
+ if gpio_type == 'tgpio_digital':
886
+ self._tgpio_digital_callbacks.append(name)
887
+ self._append_main_code('self._tgpio_digital_callbacks.append({{\'io\': {}, \'trigger\': {}, \'op\': \'{}\', \'callback\': self.{}}})'.format(io, 1 if trigger == 'HIGH' else 0, '==', name), indent=indent+2)
888
+ elif gpio_type == 'tgpio_analog':
889
+ op = OPS_MAP.get(trigger)
890
+ trigger = fields[2].text
891
+ self._tgpio_analog_callbacks.append(name)
892
+ self._append_main_code('self._tgpio_analog_callbacks.append({{\'io\': {}, \'trigger\': {}, \'op\': \'{}\', \'callback\': self.{}}})'.format(io, trigger, op, name), indent=indent+2)
893
+ elif gpio_type == 'cgpio_digital':
894
+ self._cgpio_digital_callbacks.append(name)
895
+ self._append_main_code('self._cgpio_digital_callbacks.append({{\'io\': {}, \'trigger\': {}, \'op\': \'{}\', \'callback\': self.{}}})'.format(io, 1 if trigger == 'HIGH' else 0, '==', name), indent=indent+2)
896
+ elif gpio_type == 'cgpio_analog':
897
+ op = OPS_MAP.get(trigger)
898
+ trigger = fields[2].text
899
+ self._cgpio_analog_callbacks.append(name)
900
+ self._append_main_code('self._cgpio_analog_callbacks.append({{\'io\': {}, \'trigger\': {}, \'op\': \'{}\', \'callback\': self.{}}})'.format(io, trigger, op, name), indent=indent+2)
901
+
902
+ def _handle_event_get_holding_condition(self, block, indent=0, arg_map=None):
903
+ fields = self._get_nodes('field', root=block)
904
+ addr = int(fields[0].text.replace(' ', '').replace('0x','').replace(',','').replace('\xa0', ''), 16)
905
+ trigger = int(fields[1].text.replace(' ', '').replace('0x','').replace(',','').replace('\xa0', ''), 16)
906
+
907
+ num = 1
908
+
909
+ self._is_main_run_code = False
910
+ num = len(self._holding_callbacks) + 1
911
+ name = 'holding_is_changed_callback_{}'.format(num)
912
+ self._append_main_code('# Define Holding Registers {} Value is {} callback'.format(
913
+ addr, trigger), indent=1)
914
+
915
+ self._append_main_code('def {}(self):'.format(name), indent=1)
916
+ statement = self._get_node('statement', root=block)
917
+ if statement:
918
+ self._parse_block(statement, indent, arg_map=arg_map)
919
+ else:
920
+ self._append_main_code('pass', indent=indent + 3)
921
+ self._append_main_code('')
922
+
923
+ self._is_main_run_code = True
924
+ self._holding_callbacks.append(name)
925
+ self._append_main_code(
926
+ 'self._holding_callbacks.append({{\'trigger\': \'{}\', \'addr\': \'{}\', \'callback\': self.{}}})'.format(
927
+ trigger, addr, name), indent=indent + 2)
928
+
929
+ def __handle_count_event(self, count_type, block, indent=0, arg_map=None):
930
+ fields = self._get_nodes('field', root=block)
931
+ op = fields[0].text
932
+ trigger = fields[1].text
933
+
934
+ num = 1
935
+
936
+ self._is_main_run_code = False
937
+ num = len(self._count_callbacks) + 1
938
+ name = 'count_is_changed_callback_{}'.format(num)
939
+ self._append_main_code('# Define Counter Value is {} {} callback'.format('greater than' if op == '>' else 'less than' if op == '<' else '', trigger), indent=1)
940
+
941
+ self._append_main_code('def {}(self):'.format(name), indent=1)
942
+ statement = self._get_node('statement', root=block)
943
+ if statement:
944
+ self._parse_block(statement, indent, arg_map=arg_map)
945
+ else:
946
+ self._append_main_code('pass', indent=indent + 3)
947
+ self._append_main_code('')
948
+
949
+ self._is_main_run_code = True
950
+ self._count_callbacks.append(name)
951
+ self._append_main_code(
952
+ 'self._count_callbacks.append({{\'trigger\': {}, \'op\': \'{}\', \'callback\': self.{}}})'.format(
953
+ trigger, '==' if op == '=' else op, name), indent=indent + 2)
954
+
955
+ def _handle_event_get_counter_condition(self, block, indent=0, arg_map=None):
956
+ self.__handle_count_event('get_counter', block, indent, arg_map=arg_map)
957
+
958
+ def _handle_event_gpio_digital(self, block, indent=0, arg_map=None):
959
+ self.__handle_gpio_event('tgpio_digital', block, indent, arg_map=arg_map)
960
+
961
+ def _handle_event_gpio_analog(self, block, indent=0, arg_map=None):
962
+ self.__handle_gpio_event('tgpio_analog', block, indent, arg_map=arg_map)
963
+
964
+ def _handle_event_gpio_controller_digital(self, block, indent=0, arg_map=None):
965
+ self.__handle_gpio_event('cgpio_digital', block, indent, arg_map=arg_map)
966
+
967
+ def _handle_event_gpio_controller_analog(self, block, indent=0, arg_map=None):
968
+ self.__handle_gpio_event('cgpio_analog', block, indent, arg_map=arg_map)
969
+
970
+ def _handle_gpio_controller_digitals_listen(self, block, indent=0, arg_map=None):
971
+ self.__handle_gpio_event('listen_cgpio_state', block, indent, arg_map=arg_map)
972
+
973
+ def _handle_event_gpio_controller_digital_di(self, block, indent=0, arg_map=None):
974
+ self.__handle_gpio_event('cgpio_digital', block, indent, arg_map=arg_map)
975
+
976
+ def _handle_procedures_defnoreturn(self, block, indent=0, arg_map=None):
977
+ field = self._get_node('field', block).text
978
+ if not field:
979
+ field = '1'
980
+ if field not in self._funcs:
981
+ name = 'function_{}'.format(len(self._funcs) + 1)
982
+ else:
983
+ name = self._funcs[field]
984
+ self._is_main_run_code = False
985
+ try:
986
+ args = self._get_nodes('arg', root=self._get_node('mutation', block))
987
+ arg_map_ = None
988
+
989
+ if not args:
990
+ self._append_main_code(' def {}(self):'.format(name), indent=indent)
991
+ else:
992
+ arg_list = [arg.attrib['name'] for arg in args]
993
+ arg_map_ = {arg: 'arg_{}'.format(i + 1) for i, arg in enumerate(arg_list)}
994
+ args_str = ', '.join(map(lambda x: arg_map_[x], arg_list)).strip()
995
+ self._append_main_code(' def {}(self, {}):'.format(name, args_str), indent=indent)
996
+ comment_block = self._get_node('comment', block)
997
+ comment = '' if comment_block is None else comment_block.text
998
+ self._append_main_code(' """', indent=indent+1)
999
+ self._append_main_code(' {}'.format(comment), indent=indent+1)
1000
+ self._append_main_code(' """', indent=indent+1)
1001
+ statement = self._get_node('statement', root=block)
1002
+ self._funcs[field] = name
1003
+ if statement:
1004
+ self._parse_block(statement, indent, arg_map=arg_map_)
1005
+ else:
1006
+ self._append_main_code(' pass', indent=indent+1)
1007
+ self._append_main_code('')
1008
+ return arg_map_
1009
+ except Exception as e:
1010
+ self._succeed = False
1011
+ print('convert procedures_defnoreturn failed, {}'.format(e))
1012
+ finally:
1013
+ self._is_main_run_code = True
1014
+
1015
+ def _handle_procedures_defreturn(self, block, indent=0, arg_map=None):
1016
+ arg_map_ = self._handle_procedures_defnoreturn(block, indent=indent, arg_map=arg_map)
1017
+ value = self._get_node('value', root=block)
1018
+ expression = self._get_condition_expression(value, arg_map=arg_map_)
1019
+ self._is_main_run_code = False
1020
+ self._append_main_code(' return {}'.format(expression), indent=indent+1)
1021
+ self._append_main_code('')
1022
+ self._is_main_run_code = True
1023
+
1024
+ def _handle_procedures_callnoreturn(self, block, indent=0, arg_map=None):
1025
+ mutation = self._get_node('mutation', block).attrib['name']
1026
+ if not mutation:
1027
+ mutation = '1'
1028
+ if mutation in self._funcs:
1029
+ name = self._funcs[mutation]
1030
+ else:
1031
+ name = 'function_{}'.format(len(self._funcs) + 1)
1032
+ args = self._get_nodes('arg', root=self._get_node('mutation', block))
1033
+ values = self._get_nodes('value', root=block)
1034
+ if args and values and len(args) == len(values):
1035
+ self._append_main_code('self.{}({})'.format(name, ','.join([self._get_condition_expression(val, arg_map=arg_map) for val in values])), indent=indent+2)
1036
+ else:
1037
+ self._append_main_code('self.{}()'.format(name), indent=indent+2)
1038
+ self._append_main_code('if not self.is_alive:', indent=indent+2)
1039
+ self._append_main_code(' return', indent=indent+2)
1040
+
1041
+ self._funcs[mutation] = name
1042
+
1043
+ def _handle_procedures_ifreturn(self, block, indent=0, arg_map=None):
1044
+ """
1045
+ This block may be used only within a function definition
1046
+ """
1047
+ self._is_main_run_code = False
1048
+ values = self._get_nodes('value', block)
1049
+ expression = self._get_condition_expression(values[0], arg_map=arg_map)
1050
+ self._append_main_code('if {}:'.format(expression), indent=indent+2)
1051
+ expression = self._get_condition_expression(values[1], arg_map=arg_map)
1052
+ self._append_main_code(' return {}'.format(expression), indent=indent+2)
1053
+ self._append_main_code('if not self.is_alive:', indent=indent+2)
1054
+ self._append_main_code(' return', indent=indent+2)
1055
+ self._is_main_run_code = True
1056
+
1057
+ def _handle_procedures_callreturn(self, block, indent=0, arg_map=None):
1058
+ self._handle_procedures_callnoreturn(block, indent, arg_map=arg_map)
1059
+
1060
+ def _handle_variables_set(self, block, indent=0, arg_map=None):
1061
+ field = self._get_node('field', block).text
1062
+ value = self._get_node('value', root=block)
1063
+ expression = self._get_condition_expression(value, arg_map=arg_map)
1064
+ if arg_map and field in arg_map:
1065
+ self._append_main_code('{} = {}'.format(arg_map[field], expression), indent=indent+2)
1066
+ else:
1067
+ self._append_main_code('self._vars[\'{}\'] = {}'.format(field, expression), indent=indent+2)
1068
+
1069
+ def _handle_math_change(self, block, indent=0, arg_map=None):
1070
+ field = self._get_node('field', block).text
1071
+ value = self._get_node('value', root=block)
1072
+ # shadow = self._get_node('shadow', root=value)
1073
+ # val = self._get_node('field', root=shadow).text
1074
+ val = self._get_block_val(value)
1075
+ if arg_map and field in arg_map:
1076
+ self._append_main_code('{} += {}'.format(arg_map[field], val), indent=indent+2)
1077
+ else:
1078
+ self._append_main_code('self._vars[\'{}\'] += {}'.format(field, val), indent=indent+2)
1079
+
1080
+ def _handle_controls_repeat_ext(self, block, indent=0, arg_map=None):
1081
+ value = self._get_node('value', root=block)
1082
+ times = self._get_block_val(value, arg_map=arg_map)
1083
+ self._append_main_code('for i in range(int({})):'.format(times), indent=indent+2)
1084
+ self._append_main_code(' if not self.is_alive:', indent=indent+2)
1085
+ self._append_main_code(' break', indent=indent+2)
1086
+ statement = self._get_node('statement', root=block)
1087
+ if statement:
1088
+ if self._loop_interval_sec > 0:
1089
+ self._append_main_code(' t1 = time.monotonic()', indent=indent+2)
1090
+ self._parse_block(statement, indent+1, arg_map=arg_map)
1091
+ if self._loop_interval_sec > 0:
1092
+ # limit frequency
1093
+ self._append_main_code(' interval = time.monotonic() - t1', indent=indent+2)
1094
+ self._append_main_code(' if interval < {}:'.format(self._loop_interval_sec), indent=indent+2)
1095
+ self._append_main_code(' time.sleep({} - interval)'.format(self._loop_interval_sec), indent=indent+2)
1096
+ else:
1097
+ if self._loop_interval_sec > 0:
1098
+ self._append_main_code(' time.sleep({})'.format(self._loop_interval_sec), indent=indent+2)
1099
+ else:
1100
+ self._append_main_code(' pass', indent=indent+2)
1101
+
1102
+ def _handle_controls_whileUntil(self, block, indent=0, arg_map=None):
1103
+ field = self._get_node('field', root=block)
1104
+ if field.text == 'WHILE':
1105
+ value = self._get_node('value', root=block)
1106
+ expression = self._get_condition_expression(value, arg_map=arg_map)
1107
+ self._append_main_code('while self.is_alive and {}:'.format(expression), indent=indent+2)
1108
+ elif field.text == 'UNTIL':
1109
+ value = self._get_node('value', root=block)
1110
+ expression = self._get_condition_expression(value, arg_map=arg_map)
1111
+ self._append_main_code('while self.is_alive and not {}:'.format(expression), indent=indent+2)
1112
+ statement = self._get_node('statement', root=block)
1113
+ if statement:
1114
+ if self._loop_interval_sec > 0:
1115
+ self._append_main_code(' t1 = time.monotonic()', indent=indent+2)
1116
+ self._parse_block(statement, indent+1, arg_map=arg_map)
1117
+ if self._loop_interval_sec > 0:
1118
+ # limit frequency
1119
+ self._append_main_code(' interval = time.monotonic() - t1', indent=indent+2)
1120
+ self._append_main_code(' if interval < {}:'.format(self._loop_interval_sec), indent=indent+2)
1121
+ self._append_main_code(' time.sleep({} - interval)'.format(self._loop_interval_sec), indent=indent+2)
1122
+ else:
1123
+ if self._loop_interval_sec > 0:
1124
+ self._append_main_code(' time.sleep({})'.format(self._loop_interval_sec), indent=indent+2)
1125
+ else:
1126
+ self._append_main_code(' pass', indent=indent+2)
1127
+
1128
+ def _handle_loop_run_forever(self, block, indent=0, arg_map=None):
1129
+ self._append_main_code('while self.is_alive:', indent=indent+2)
1130
+ statement = self._get_node('statement', root=block)
1131
+ if statement:
1132
+ if self._loop_interval_sec > 0:
1133
+ self._append_main_code(' t1 = time.monotonic()', indent=indent+2)
1134
+ self._parse_block(statement, indent+1, arg_map=arg_map)
1135
+ if self._loop_interval_sec > 0:
1136
+ # limit frequency
1137
+ self._append_main_code(' interval = time.monotonic() - t1', indent=indent+2)
1138
+ self._append_main_code(' if interval < {}:'.format(self._loop_interval_sec), indent=indent+2)
1139
+ self._append_main_code(' time.sleep({} - interval)'.format(self._loop_interval_sec), indent=indent+2)
1140
+ else:
1141
+ if self._loop_interval_sec > 0:
1142
+ self._append_main_code(' time.sleep({})'.format(self._loop_interval_sec), indent=indent+2)
1143
+ else:
1144
+ self._append_main_code(' pass', indent=indent+2)
1145
+
1146
+ def _handle_loop_break(self, block, indent=0, arg_map=None):
1147
+ self._append_main_code('break', indent=indent+2)
1148
+
1149
+ def _handle_tool_comment(self, block, indent=0, arg_map=None):
1150
+ field = self._get_node('field', block)
1151
+ self._append_main_code('# {}'.format(field.text), indent=indent+2)
1152
+ statement = self._get_node('statement', block)
1153
+ if statement:
1154
+ self._parse_block(statement, indent, arg_map=arg_map)
1155
+
1156
+ def _handle_tool_app_comment(self, block, indent=0, arg_map=None):
1157
+ field = self._get_node('field', block)
1158
+ self._append_main_code('# [APP] {}'.format(field.text), indent=indent+2)
1159
+ statement = self._get_node('statement', block)
1160
+ if statement:
1161
+ self._parse_block(statement, indent, arg_map=arg_map)
1162
+
1163
+ def _handle_tool_remark(self, block, indent=0, arg_map=None):
1164
+ field = self._get_node('field', block)
1165
+ self._append_main_code('# {}'.format(field.text), indent=indent+2)
1166
+
1167
+ def _handle_controls_if(self, block, indent=0, arg_map=None):
1168
+ values = self._get_nodes('value', root=block)
1169
+ statements = self._get_nodes('statement', root=block)
1170
+ old_indent = indent
1171
+ has_if = False
1172
+ for _, value in enumerate(values):
1173
+ indent = old_indent
1174
+ expression = self._get_condition_expression(value, arg_map=arg_map)
1175
+ if not has_if:
1176
+ has_if = True
1177
+ self._append_main_code('if {}:'.format(expression), indent=indent+2)
1178
+ else:
1179
+ self._append_main_code('elif {}:'.format(expression), indent=indent+2)
1180
+ old_indent = indent
1181
+ indent += 1
1182
+ statement = None
1183
+ for st in statements:
1184
+ if st.attrib['name'][2:] == value.attrib['name'][2:]:
1185
+ statement = st
1186
+ break
1187
+ if statement:
1188
+ self._parse_block(statement, old_indent+1, arg_map=arg_map)
1189
+ else:
1190
+ self._append_main_code(' pass', indent=old_indent+2)
1191
+ for st in statements:
1192
+ if st.attrib['name'] == 'ELSE':
1193
+ if has_if:
1194
+ self._append_main_code('else:', indent=old_indent+2)
1195
+ self._parse_block(st, old_indent if not has_if else indent, arg_map=arg_map)
1196
+ break
1197
+
1198
+ def _handle_set_line_track(self, block, indent=0, arg_map=None):
1199
+ self.is_run_linear_track = True
1200
+ fields = self._get_nodes('field', root=block)
1201
+ if fields is None:
1202
+ values = self._get_nodes('value', root=block)
1203
+ fields = [
1204
+ self._get_nodes('field', root=values[0], descendant=True)[0],
1205
+ self._get_nodes('field', root=values[1], descendant=True)[0]
1206
+ ]
1207
+ pos = fields[0].text
1208
+ speed = fields[1].text
1209
+ wait = True
1210
+ self._append_main_code('code = self._arm.set_linear_track_pos({}, speed={}, wait={}, auto_enable=True)'.format(pos, speed, wait), indent + 2)
1211
+ self._append_main_code('if not self._check_code(code, \'set_linear_track_pos\'):', indent + 2)
1212
+ self._append_main_code(' return', indent + 2)
1213
+
1214
+ def _handle_set_line_track_origin(self, block, indent=0, arg_map=None):
1215
+ self._append_main_code('code = self._arm.set_linear_track_back_origin(wait=True, auto_enable=True)', indent + 2)
1216
+ self._append_main_code('if not self._check_code(code, \'set_linear_track_back_origin\'):', indent + 2)
1217
+ self._append_main_code(' return', indent + 2)
1218
+
1219
+ def _handle_python_code(self, block, indent=0, arg_map=None, **kwargs):
1220
+ self._append_main_code('##### Python code #####', indent + 2)
1221
+ text = self._get_field_value(block)
1222
+ codes = text.split('\n') if isinstance(text, str) else []
1223
+ prev_is_empty = False
1224
+ length = len(codes)
1225
+ for i, code in enumerate(codes):
1226
+ if not code.strip():
1227
+ if prev_is_empty or i == length - 1:
1228
+ continue
1229
+ prev_is_empty = True
1230
+ else:
1231
+ prev_is_empty = False
1232
+ if (self._is_exec or (not self._is_exec and not self._is_ide)) and code.strip() and code not in \
1233
+ ['finally:', 'else:'] and all([i not in code for i in ['elif', 'except', 'def', 'class']]) \
1234
+ and not code.startswith('@'):
1235
+ # 只有在studio执行blockly时或者SDK直接调用run_blockly_app时才会执行
1236
+ code_indent = re.match('(\s*).*', code).group(1)
1237
+ self._append_main_code(code_indent + 'if not self.is_alive:', indent + 2)
1238
+ self._append_main_code(code_indent + 'return', indent + 3)
1239
+ self._append_main_code(code, indent + 2)
1240
+ self._append_main_code('#######################', indent + 2)
1241
+
1242
+ def _handle_set_end_level(self, block, indent=0, arg_map=None, **kwargs):
1243
+ if not self.axis_type:
1244
+ return
1245
+ self._append_main_code('self._arm.arm.wait_move()', indent + 2)
1246
+ self._append_main_code('current_angle = self._arm.angles', indent + 2)
1247
+ if self.axis_type[0] == 5:
1248
+ self._append_main_code('angle = -(current_angle[1] + current_angle[2])', indent + 2)
1249
+ self._append_main_code('code = self._arm.set_servo_angle(angle=[*current_angle[:3], angle, current_angle[4]])', indent + 2,)
1250
+ elif self.axis_type[0] == 6:
1251
+ self._append_main_code('angle_5 = {}'.format('-(current_angle[1] - current_angle[2])' if self.axis_type[1]==9 or self.axis_type[1]==12 else
1252
+ '-(current_angle[1] + current_angle[2])'), indent + 2)
1253
+ self._append_main_code('angles = [*current_angle[:3],0,angle_5,current_angle[5]]', indent + 2)
1254
+ self._append_main_code('code = self._arm.set_servo_angle(angle=angles)', indent + 2)
1255
+ elif self.axis_type[0] == 7:
1256
+ self._append_main_code('code, ret = self._arm.get_inverse_kinematics(pose=[*current_angle[:3], 180, 0, current_angle[5]])', indent + 2)
1257
+ self._append_main_code('if not self._check_code(code, \'set_end_level\'):', indent + 2)
1258
+ self._append_main_code(' return', indent + 2)
1259
+ self._append_main_code('code = self._arm.set_servo_angle(angle=ret)', indent + 2)
1260
+ self._append_main_code('if not self._check_code(code, \'set_end_level\'):', indent + 2)
1261
+ self._append_main_code(' return', indent + 2)
1262
+
1263
+ def _handle_set_modbus_rtu(self, block, indent=0, arg_map=None):
1264
+ fields = self._get_nodes('field', root=block)
1265
+ host_id = fields[0].text
1266
+ cmd = fields[1].text
1267
+ cmd_li = re.sub(',', ' ', cmd)
1268
+ is_run_cmd = ''.join(cmd_li.split()).isalnum()
1269
+ if not is_run_cmd:
1270
+ self._append_main_code('if not self._check_code(-1, \'set_tgpio_modbus\'):', indent + 2)
1271
+ self._append_main_code(' return', indent + 2)
1272
+ return
1273
+ cmd_li = re.sub(' +', ' ', cmd_li)
1274
+ cmd_li = re.sub('\xa0', ' ', cmd_li)
1275
+ cmd_li = re.sub('\s+', ' ', cmd_li)
1276
+ cmd_li = cmd_li.strip().split(' ')
1277
+ int_li = [int(da, 16) for da in cmd_li]
1278
+ self._append_main_code('code, ret = self._arm.getset_tgpio_modbus_data({}, host_id={})'.format(int_li, host_id), indent + 2)
1279
+ self._append_main_code('if not self._check_code(code, \'set_tgpio_modbus\'):', indent + 2)
1280
+ self._append_main_code(' return', indent + 2)
1281
+
1282
+ def _handle_set_ft_sensor(self, block, indent=0, arg_map=None):
1283
+ force_axis_list = ['fx', 'fy', 'fz', 'tx', 'ty', 'tz']
1284
+ force_axis_value = [0, 0, 0, 0, 0, 0]
1285
+ force_ref_value = [0, 0, 0, 0, 0, 0]
1286
+ fields = self._get_nodes('field', root=block)
1287
+ ref_frame = fields[0].text
1288
+ force_axis = fields[1].text
1289
+ force_ref = fields[2].text
1290
+ wait_time = fields[3].text
1291
+ for index, axis in enumerate(force_axis_list):
1292
+ if axis == force_axis:
1293
+ force_axis_value[index] = 1
1294
+ force_ref_value[index] = float(force_ref)
1295
+ self._append_main_code('code = self._arm.config_force_control({}, {}, {}, [0] * 6)'.format(ref_frame, force_axis_value,
1296
+ force_ref_value), indent + 2)
1297
+ self._append_main_code('if not self._check_code(code, \'set_tgpio_modbus\'):', indent + 2)
1298
+ self._append_main_code(' return', indent + 2)
1299
+ self._append_main_code('code = self._arm.ft_sensor_enable(1)', indent + 2)
1300
+ self._append_main_code('if not self._check_code(code, \'set_tgpio_modbus\'):', indent + 2)
1301
+ self._append_main_code(' return', indent + 2)
1302
+ self._append_main_code('time.sleep(0.2)', indent + 2)
1303
+ self._append_main_code('self._arm.ft_sensor_app_set(2)', indent + 2)
1304
+ self._append_main_code('self._arm.set_state(0)', indent + 2)
1305
+ self._append_main_code('start_time = time.time()', indent + 2)
1306
+ self._append_main_code('while time.time() - start_time < {}:'.format(wait_time), indent + 2)
1307
+ self._append_main_code('if self._arm.state == 4:', indent + 3)
1308
+ self._append_main_code(' return', indent + 4)
1309
+ self._append_main_code('self._arm.ft_sensor_app_set(0)', indent + 2)
1310
+
1311
+ def _handle_studio_run_blockly(self, block, indent=0, arg_map=None):
1312
+ fields = self._get_nodes('field', root=block)
1313
+ projectName = fields[0].text
1314
+ fileName = fields[1].text
1315
+ times = fields[2].text
1316
+ if not self._is_exec:
1317
+ self._append_main_code('self._start_run_blockly(fileName="{}", times={})'.format(fileName.lstrip('/'), times), indent + 2)
1318
+ else:
1319
+ self._append_main_code('start_run_blockly(fileName="{}", times={})'.format(fileName, times), indent + 2)
1320
+ self._is_run_blockly = True
1321
+
1322
+ def _handle_studio_run_gcode(self, block, indent=0, arg_map=None):
1323
+ fields = self._get_nodes('field', root=block)
1324
+ projectName = fields[0].text
1325
+ fileName = fields[1].text
1326
+ times = fields[2].text
1327
+ if self._is_exec:
1328
+ self._append_main_code('start_run_gcode(projectName="{}", fileName="{}", times={})'.format(projectName, fileName, times), indent + 2)
1329
+ else:
1330
+ self._append_main_code("for i in range({}):".format(times), indent + 2)
1331
+ self._append_main_code(' self._arm.run_gcode_app(path="{}")'.format(projectName+fileName), indent + 2)
1332
+
1333
+ def _handle_write_single_holding_register(self, block, indent=0, arg_map=None):
1334
+ fields = self._get_nodes('field', root=block)
1335
+ addr = int(fields[0].text.replace(' ', '').replace('0x','').replace(',','').replace('\xa0', ''), 16)
1336
+ value = int(fields[1].text.replace(' ', '').replace('0x','').replace(',','').replace('\xa0', ''), 16)
1337
+ self._append_main_code('self._arm.write_single_holding_register({}, {})'.format(addr, value), indent + 2)
1338
+