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,1864 @@
1
+ #!/usr/bin/env python3
2
+ # Software License Agreement (BSD License)
3
+ #
4
+ # Copyright (c) 2019, UFACTORY, Inc.
5
+ # All rights reserved.
6
+ #
7
+ # Author: Vinman <vinman.wen@ufactory.cc> <vinman.cub@gmail.com>
8
+
9
+ try:
10
+ import xml.etree.cElementTree as ET
11
+ except ImportError:
12
+ import xml.etree.ElementTree as ET
13
+ import re
14
+ import sys
15
+ import json
16
+ import time
17
+ import random
18
+ from .blockly._blockly_highlight import HIGHLIGHT_BLOCKS
19
+ from .blockly import BlocklyTool
20
+
21
+
22
+ class BlocklyToolOld(object):
23
+ def __init__(self, path):
24
+ self.tree = ET.parse(path)
25
+ self.root = self.tree.getroot()
26
+ self.namespace = self.get_namespace()
27
+ self._ops = {
28
+ 'EQ': '==',
29
+ 'NEQ': '!=',
30
+ 'LT': '<',
31
+ 'LTE': '<=',
32
+ 'GT': '>',
33
+ 'GTE': '>='
34
+ }
35
+ self._ops2 = {
36
+ '===': '==',
37
+ '!==': '!=',
38
+ '>=': '>=',
39
+ '>': '>',
40
+ '<=': '<=',
41
+ '<': '<',
42
+ }
43
+ self._code_list = []
44
+ self._hasEvent = False
45
+ self._events = {}
46
+ self._funcs = {}
47
+ self._func_cls_exist = False
48
+ self._func_index = 0
49
+ self._index = -1
50
+ self._first_index = 0
51
+ self._is_insert = False
52
+ self.codes = ''
53
+ self._succeed = True
54
+ self._show_comment = False
55
+ self._highlight_callback = None
56
+
57
+ @property
58
+ def index(self):
59
+ self._index += 1
60
+ return self._index
61
+
62
+ @property
63
+ def func_index(self):
64
+ self._func_index += 1
65
+ return self._func_index
66
+
67
+ @property
68
+ def first_index(self):
69
+ self._first_index += 1
70
+ self._index += 1
71
+ return self._first_index
72
+
73
+ def _append_to_file(self, data):
74
+ if not self._is_insert:
75
+ self._code_list.append(data)
76
+ else:
77
+ self._code_list.insert(self.first_index, data)
78
+
79
+ def _insert_to_file(self, i, data):
80
+ self._code_list.insert(i, data)
81
+
82
+ def get_namespace(self):
83
+ try:
84
+ r = re.compile('({.+})')
85
+ if r.search(self.root.tag) is not None:
86
+ ns = r.search(self.root.tag).group(1)
87
+ else:
88
+ ns = ''
89
+ except Exception as e:
90
+ # print(e)
91
+ ns = ''
92
+ return ns
93
+
94
+ def get_node(self, tag, root=None):
95
+ if root is None:
96
+ root = self.root
97
+ return root.find(self.namespace + tag)
98
+
99
+ def get_nodes(self, tag, root=None, descendant=False, **kwargs):
100
+ if root is None:
101
+ root = self.root
102
+ nodes = []
103
+ if descendant:
104
+ func = root.iter
105
+ else:
106
+ func = root.findall
107
+ for node in func(self.namespace + tag):
108
+ flag = True
109
+ for k, v in kwargs.items():
110
+ if node.attrib[k] != v:
111
+ flag = False
112
+ if flag:
113
+ nodes.append(node)
114
+ return nodes
115
+
116
+ def _init_py3(self, arm=None, init=True, wait_seconds=1, mode=0, state=0, error_exit=True, stop_exit=True):
117
+ self._insert_to_file(self.index, '#!/usr/bin/env python3')
118
+ self._insert_to_file(self.index, '# Software License Agreement (BSD License)\n#')
119
+ self._insert_to_file(self.index, '# Copyright (c) {}, UFACTORY, Inc.'.format(time.localtime(time.time()).tm_year))
120
+ self._insert_to_file(self.index, '# All rights reserved.\n#')
121
+ self._insert_to_file(self.index, '# Author: Vinman <vinman.wen@ufactory.cc> <vinman.cub@gmail.com>\n')
122
+ self._insert_to_file(self.index, '"""')
123
+ self._insert_to_file(self.index, '# Notice')
124
+ self._insert_to_file(self.index, '# 1. Changes to this file on Studio will not be preserved')
125
+ self._insert_to_file(self.index, '# 2. The next conversion will overwrite the file with the same name')
126
+ self._insert_to_file(self.index, '"""')
127
+ self._insert_to_file(self.index, 'import sys')
128
+ self._insert_to_file(self.index, 'import math')
129
+ self._insert_to_file(self.index, 'import time')
130
+ self._insert_to_file(self.index, 'import datetime')
131
+ self._insert_to_file(self.index, 'import random')
132
+ self._insert_to_file(self.index, 'import traceback')
133
+ self._insert_to_file(self.index, 'import threading\n')
134
+ self._insert_to_file(self.index, '"""')
135
+ self._insert_to_file(self.index, '# xArm-Python-SDK: https://github.com/xArm-Developer/xArm-Python-SDK')
136
+ self._insert_to_file(self.index, '# git clone git@github.com:xArm-Developer/xArm-Python-SDK.git')
137
+ self._insert_to_file(self.index, '# cd xArm-Python-SDK')
138
+ self._insert_to_file(self.index, '# python setup.py install')
139
+ self._insert_to_file(self.index, '"""')
140
+ self._insert_to_file(self.index, 'try:')
141
+ self._insert_to_file(self.index, ' from xarm.tools import utils')
142
+ self._insert_to_file(self.index, 'except:')
143
+ self._insert_to_file(self.index, ' pass')
144
+ self._insert_to_file(self.index, 'from xarm import version')
145
+ self._insert_to_file(self.index, 'from xarm.wrapper import XArmAPI\n')
146
+ # self._insert_to_file(self.index, 'locals_keys = list(locals().keys())\n\n')
147
+
148
+ self._insert_to_file(self.index, 'def pprint(*args, **kwargs):')
149
+ self._insert_to_file(self.index, ' try:')
150
+ self._insert_to_file(self.index, ' stack_tuple = traceback.extract_stack(limit=2)[0]')
151
+ self._insert_to_file(self.index, ' print(\'[{}][{}] {}\'.format('
152
+ 'time.strftime(\'%Y-%m-%d %H:%M:%S\', time.localtime(time.time())), '
153
+ 'stack_tuple[1], \' \'.join(map(str, args))))')
154
+ self._insert_to_file(self.index, ' except:')
155
+ # self._insert_to_file(self.index, ' pass')
156
+ self._insert_to_file(self.index, ' print(*args, **kwargs)\n')
157
+ self._insert_to_file(self.index, 'pprint(\'xArm-Python-SDK Version:{}\'.format(version.__version__))\n')
158
+ # if self._highlight_callback is None:
159
+ # self._insert_to_file(self.index, 'highlight_callback = lambda x:x')
160
+ if arm is None:
161
+ self._insert_to_file(self.index, 'arm = XArmAPI(sys.argv[1], baud_checkset=False)')
162
+ elif isinstance(arm, str):
163
+ self._insert_to_file(self.index, 'arm = XArmAPI(\'{}\', baud_checkset=False)'.format(arm))
164
+ if init:
165
+ self._insert_to_file(self.index, 'arm.clean_warn()')
166
+ self._insert_to_file(self.index, 'arm.clean_error()')
167
+ self._insert_to_file(self.index, 'arm.motion_enable(True)')
168
+
169
+ self._insert_to_file(self.index, 'arm.set_mode({})'.format(mode))
170
+ self._insert_to_file(self.index, 'arm.set_state({})'.format(state))
171
+ if wait_seconds > 0:
172
+ self._insert_to_file(self.index, 'time.sleep({})\n'.format(wait_seconds))
173
+ variables = self.parse_vars()
174
+ variables = {var: 0 for var in variables}
175
+ self._insert_to_file(self.index, 'variables = {}'.format(variables))
176
+ self._insert_to_file(self.index, 'params = {\'speed\': 100, \'acc\': 2000, '
177
+ '\'angle_speed\': 20, \'angle_acc\': 500, '
178
+ '\'events\': {}, \'variables\': variables, '
179
+ '\'callback_in_thread\': True, \'quit\': False}')
180
+ if error_exit:
181
+ self._insert_to_file(self.index, '\n\n# Register error/warn changed callback')
182
+ self._insert_to_file(self.index, 'def error_warn_change_callback(data):')
183
+ self._insert_to_file(self.index, ' if data and data[\'error_code\'] != 0:')
184
+ # self._insert_to_file(self.index, ' arm.set_state(4)')
185
+ self._insert_to_file(self.index, ' params[\'quit\'] = True')
186
+ self._insert_to_file(self.index, ' pprint(\'err={}, quit\'.format(data[\'error_code\']))')
187
+ self._insert_to_file(self.index, ' arm.release_error_warn_changed_callback(error_warn_change_callback)')
188
+ self._insert_to_file(self.index, 'arm.register_error_warn_changed_callback(error_warn_change_callback)')
189
+ if stop_exit:
190
+ self._insert_to_file(self.index, '\n\n# Register state changed callback')
191
+ self._insert_to_file(self.index, 'def state_changed_callback(data):')
192
+ self._insert_to_file(self.index, ' if data and data[\'state\'] == 4:')
193
+ self._insert_to_file(self.index, ' if arm.version_number[0] > 1 or (arm.version_number[0] == 1 and arm.version_number[1] > 1):')
194
+ self._insert_to_file(self.index, ' params[\'quit\'] = True')
195
+ self._insert_to_file(self.index, ' pprint(\'state=4, quit\')')
196
+ self._insert_to_file(self.index, ' arm.release_state_changed_callback(state_changed_callback)')
197
+ self._insert_to_file(self.index, 'arm.register_state_changed_callback(state_changed_callback)')
198
+
199
+ self._insert_to_file(self.index, '\n\n# Register counter value changed callback')
200
+ self._insert_to_file(self.index, 'if hasattr(arm, \'register_count_changed_callback\'):')
201
+ self._insert_to_file(self.index, ' def count_changed_callback(data):')
202
+ self._insert_to_file(self.index, ' if not params[\'quit\']:')
203
+ self._insert_to_file(self.index, ' pprint(\'counter val: {}\'.format(data[\'count\']))')
204
+ self._insert_to_file(self.index, ' arm.register_count_changed_callback(count_changed_callback)')
205
+
206
+ self._insert_to_file(self.index, '\n\n# Register connect changed callback')
207
+ self._insert_to_file(self.index, 'def connect_changed_callback(data):')
208
+ self._insert_to_file(self.index, ' if data and not data[\'connected\']:')
209
+ self._insert_to_file(self.index, ' params[\'quit\'] = True')
210
+ self._insert_to_file(self.index, ' pprint(\'disconnect, connected={}, reported={}, quit\'.format(data[\'connected\'], data[\'reported\']))')
211
+ self._insert_to_file(self.index, ' arm.release_connect_changed_callback(error_warn_change_callback)')
212
+ self._insert_to_file(self.index, 'arm.register_connect_changed_callback(connect_changed_callback)\n')
213
+
214
+ self._first_index = self._index
215
+
216
+ def _finish_py3(self, error_exit=True, stop_exit=True):
217
+ if self._hasEvent:
218
+ self._append_to_file('\n# Main loop')
219
+ self._append_to_file('while arm.connected and arm.error_code == 0 and not params[\'quit\']:')
220
+ self._append_to_file(' time.sleep(0.5)')
221
+
222
+ self._append_to_file('\n# release all event')
223
+ self._append_to_file('if hasattr(arm, \'release_count_changed_callback\'):')
224
+ self._append_to_file(' arm.release_count_changed_callback(count_changed_callback)')
225
+ if error_exit:
226
+ self._append_to_file('arm.release_error_warn_changed_callback(state_changed_callback)')
227
+ if stop_exit:
228
+ self._append_to_file('arm.release_state_changed_callback(state_changed_callback)')
229
+ self._append_to_file('arm.release_connect_changed_callback(error_warn_change_callback)\n')
230
+
231
+ def to_python(self, path=None, arm=None, init=True, wait_seconds=1, mode=0, state=0,
232
+ error_exit=True, stop_exit=True, show_comment=False, **kwargs):
233
+ self._show_comment = show_comment
234
+ self._succeed = True
235
+ self._highlight_callback = kwargs.get('highlight_callback', None)
236
+ self._init_py3(arm=arm, init=init, wait_seconds=wait_seconds, mode=mode, state=state, error_exit=error_exit, stop_exit=stop_exit)
237
+ self.parse()
238
+ self._finish_py3(error_exit=error_exit, stop_exit=stop_exit)
239
+ self.codes = '\n'.join(self._code_list)
240
+ if path is not None:
241
+ with open(path, 'w', encoding='utf-8') as f:
242
+ f.write('{}\n'.format(self.codes))
243
+ return self._succeed
244
+
245
+ def parse_vars(self):
246
+ var_list = []
247
+ variables = self.get_nodes('variables')
248
+ for vars in variables:
249
+ for variable in self.get_nodes('variable', root=vars):
250
+ var_list.append(variable.text)
251
+ return var_list
252
+
253
+ def parse(self, root=None, prefix='', arg_map=None):
254
+ blocks = self.get_nodes('block', root=root)
255
+ if blocks:
256
+ for block in blocks:
257
+ is_statement = root is None
258
+ if root is not None:
259
+ if root.tag == self.namespace + 'statement':
260
+ is_statement = True
261
+ while block is not None:
262
+ if not is_statement:
263
+ block = self.get_node('next', root=block)
264
+ if not block:
265
+ break
266
+ block = self.get_node('block', root=block)
267
+ else:
268
+ is_statement = False
269
+ if block.attrib.get('disabled', False):
270
+ continue
271
+ func = getattr(self, '_handle_{}'.format(block.attrib['type']), None)
272
+ if func:
273
+ if self._highlight_callback is not None:
274
+ if block.attrib['type'] in HIGHLIGHT_BLOCKS:
275
+ self._append_to_file('{}if not params[\'quit\']:'.format(prefix))
276
+ self._append_to_file('{} highlight_callback(\'{}\')'.format(prefix, block.attrib['id']))
277
+ # if block.attrib['type'] not in ['procedures_defnoreturn', 'procedures_defreturn', 'controls_if']:
278
+ # self._append_to_file('{}highlight_callback(\'{}\')'.format(prefix, block.attrib['id']))
279
+ func(block, prefix, arg_map=arg_map)
280
+ else:
281
+ self._succeed = False
282
+ print('block {} can\'t convert to python code'.format(block.attrib['type']))
283
+ # block = self.get_node('block', root=root)
284
+ # while block is not None:
285
+ # if not is_statement:
286
+ # block = self.get_node('next', root=block)
287
+ # if not block:
288
+ # break
289
+ # block = self.get_node('block', root=block)
290
+ # else:
291
+ # is_statement = False
292
+ # if block.attrib.get('disabled', False):
293
+ # continue
294
+ # func = getattr(self, '_handle_{}'.format(block.attrib['type']), None)
295
+ # if func:
296
+ # func(block, prefix)
297
+ # else:
298
+ # print('block {} can\'t convert to python code'.format(block.attrib['type']))
299
+
300
+ def __check_is_quit(self, prefix):
301
+ self._append_to_file('{}if not params[\'quit\']:'.format(prefix))
302
+ return ' {}'.format(prefix)
303
+
304
+ def _handle_set_speed(self, block, prefix='', arg_map=None):
305
+ field = self.get_node('field', root=block)
306
+ if field is not None:
307
+ value = field.text
308
+ else:
309
+ value = self.get_node('value', root=block)
310
+ value = self.get_nodes('field', root=value, descendant=True)[0].text
311
+ prefix = self.__check_is_quit(prefix)
312
+ self._append_to_file('{}params[\'speed\'] = {}'.format(prefix, value))
313
+
314
+ def _handle_set_acceleration(self, block, prefix='', arg_map=None):
315
+ field = self.get_node('field', root=block)
316
+ if field is not None:
317
+ value = field.text
318
+ else:
319
+ value = self.get_node('value', root=block)
320
+ value = self.get_nodes('field', root=value, descendant=True)[0].text
321
+ prefix = self.__check_is_quit(prefix)
322
+ self._append_to_file('{}params[\'acc\'] = {}'.format(prefix, value))
323
+
324
+ def _handle_set_angle_speed(self, block, prefix='', arg_map=None):
325
+ field = self.get_node('field', root=block)
326
+ if field is not None:
327
+ value = field.text
328
+ else:
329
+ value = self.get_node('value', root=block)
330
+ value = self.get_nodes('field', root=value, descendant=True)[0].text
331
+ prefix = self.__check_is_quit(prefix)
332
+ self._append_to_file('{}params[\'angle_speed\'] = {}'.format(prefix, value))
333
+
334
+ def _handle_set_angle_acceleration(self, block, prefix='', arg_map=None):
335
+ field = self.get_node('field', root=block)
336
+ if field is not None:
337
+ value = field.text
338
+ else:
339
+ value = self.get_node('value', root=block)
340
+ value = self.get_nodes('field', root=value, descendant=True)[0].text
341
+ prefix = self.__check_is_quit(prefix)
342
+ self._append_to_file('{}params[\'angle_acc\'] = {}'.format(prefix, value))
343
+
344
+ def _handle_set_counter_increase(self, block, prefix='', arg_map=None):
345
+ # field = self.get_node('field', root=block)
346
+ # if field is not None:
347
+ # value = field.text
348
+ # else:
349
+ # value = self.get_node('value', root=block)
350
+ # value = self.get_nodes('field', root=value, descendant=True)[0].text
351
+ if self._show_comment:
352
+ self._append_to_file('{}# set counter increase'.format(prefix))
353
+ prefix = self.__check_is_quit(prefix)
354
+ self._append_to_file('{}arm.set_counter_increase()'.format(prefix))
355
+
356
+ def _handle_set_counter_reset(self, block, prefix='', arg_map=None):
357
+ if self._show_comment:
358
+ self._append_to_file('{}# set counter reset'.format(prefix))
359
+ prefix = self.__check_is_quit(prefix)
360
+ self._append_to_file('{}arm.set_counter_reset()'.format(prefix))
361
+
362
+ def _handle_reset(self, block, prefix='', arg_map=None):
363
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
364
+ self._append_to_file('{} arm.reset()'.format(prefix))
365
+
366
+ def _handle_sleep(self, block, prefix='', arg_map=None):
367
+ value = self.get_node('value', root=block)
368
+ value = self.__get_block_val(value, arg_map=arg_map)
369
+ # value = self.get_nodes('field', root=value, descendant=True)[0].text
370
+ if self._show_comment:
371
+ self._append_to_file('{}# set pause time'.format(prefix))
372
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
373
+ self._append_to_file('{} arm.set_pause_time({})'.format(prefix, value))
374
+
375
+ def _handle_move(self, block, prefix='', arg_map=None):
376
+ fields = self.get_nodes('field', root=block)
377
+ orientation = fields[0].text
378
+ wait = fields[1].text == 'TRUE'
379
+ value = fields[2].text
380
+ if orientation == 'forward':
381
+ param = 'x'
382
+ elif orientation == 'backward':
383
+ param = 'x'
384
+ value = '-{}'.format(value)
385
+ elif orientation == 'left':
386
+ param = 'y'
387
+ elif orientation == 'right':
388
+ param = 'y'
389
+ value = '-{}'.format(value)
390
+ elif orientation == 'up':
391
+ param = 'z'
392
+ elif orientation == 'down':
393
+ param = 'z'
394
+ value = '-{}'.format(value)
395
+ else:
396
+ return
397
+
398
+ if self._show_comment:
399
+ self._append_to_file('{}# relative move'.format(prefix))
400
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
401
+ self._append_to_file('{} code = arm.set_position({}={}, speed=params[\'speed\'], mvacc=params[\'acc\'], '
402
+ 'relative=True, wait={})'.format(prefix, param, value, wait))
403
+ self._append_to_file('{} if code != 0:'.format(prefix))
404
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
405
+ self._append_to_file('{} pprint(\'set_position, code={{}}\'.format(code))'.format(prefix))
406
+
407
+ def _handle_move_arc_to(self, block, prefix='', arg_map=None):
408
+ value = self.get_node('value', root=block)
409
+ p_block = self.get_node('block', root=value)
410
+ fields = self.get_nodes('field', root=p_block)
411
+ values = []
412
+ for field in fields[:-2]:
413
+ values.append(float(field.text))
414
+ radius = float(fields[-2].text)
415
+ wait = fields[-1].text == 'TRUE'
416
+ if self._show_comment:
417
+ self._append_to_file('{}# move{}line and {}'.format(
418
+ prefix, ' arc ' if float(radius) >= 0 else ' ', 'wait' if wait else 'no wait'))
419
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
420
+ self._append_to_file('{} code = arm.set_position(*{}, speed=params[\'speed\'], mvacc=params[\'acc\'], '
421
+ 'radius={}, wait={})'.format(prefix, values, radius, wait))
422
+ self._append_to_file('{} if code != 0:'.format(prefix))
423
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
424
+ self._append_to_file('{} pprint(\'set_position, code={{}}\'.format(code))'.format(prefix))
425
+
426
+ def _handle_move_circle(self, block, prefix='', arg_map=None):
427
+ values = self.get_nodes('value', root=block)
428
+ # percent = self.get_nodes('field', root=values[2], descendant=True)[0].text
429
+ # percent = round(float(percent) / 360 * 100, 2)
430
+ # wait = self.get_nodes('field', root=values[3], descendant=True)[0].text == 'TRUE'
431
+ percent = self.__get_block_val(values[2], arg_map=arg_map)
432
+ wait = self.__get_block_val(values[3], arg_map=arg_map)
433
+ if wait == 'TRUE' or wait == 'FALSE':
434
+ wait = wait == 'TRUE'
435
+
436
+ p1_block = self.get_node('block', root=values[0])
437
+ fields = self.get_nodes('field', root=p1_block)
438
+ pose1 = []
439
+ for field in fields:
440
+ pose1.append(float(field.text))
441
+
442
+ p2_block = self.get_node('block', root=values[1])
443
+ fields = self.get_nodes('field', root=p2_block)
444
+ pose2 = []
445
+ for field in fields:
446
+ pose2.append(float(field.text))
447
+ if self._show_comment:
448
+ self._append_to_file('{}# move circle and {}'.format(
449
+ prefix, 'wait' if wait else 'no wait'))
450
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
451
+ self._append_to_file('{} code = arm.move_circle({}, {}, float({}) / 360 * 100, speed=params[\'speed\'], mvacc=params[\'acc\'], '
452
+ 'wait={})'.format(prefix, pose1, pose2, percent, wait))
453
+ self._append_to_file('{} if code != 0:'.format(prefix))
454
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
455
+ self._append_to_file('{} pprint(\'move_circle, code={{}}\'.format(code))'.format(prefix))
456
+
457
+ def _handle_move_7(self, block, prefix='', arg_map=None):
458
+ value = self.get_node('value', root=block)
459
+ p_block = self.get_node('block', root=value)
460
+ fields = self.get_nodes('field', root=p_block)
461
+ values = []
462
+ for field in fields[:-1]:
463
+ values.append(float(field.text))
464
+ wait = fields[-1].text == 'TRUE'
465
+ if self._show_comment:
466
+ self._append_to_file('{}# move joint and {}'.format(prefix, 'wait' if wait else 'no wait'))
467
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
468
+ self._append_to_file('{} code = arm.set_servo_angle(angle={}, speed=params[\'angle_speed\'], '
469
+ 'mvacc=params[\'angle_acc\'], wait={})'.format(prefix, values, wait))
470
+ self._append_to_file('{} if code != 0:'.format(prefix))
471
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
472
+ self._append_to_file('{} pprint(\'set_servo_angle, code={{}}\'.format(code))'.format(prefix))
473
+
474
+ def _handle_move_joints(self, block, prefix='', arg_map=None):
475
+ fields = self.get_nodes('field', root=block)
476
+ values = []
477
+ for field in fields[:-1]:
478
+ values.append(float(field.text))
479
+ radius_fields = self.get_nodes('field', root=block, name='r')
480
+ if len(radius_fields) > 0:
481
+ radius = values[-1]
482
+ values = values[:-1]
483
+ else:
484
+ radius = None
485
+ wait = fields[-1].text == 'TRUE'
486
+ if self._show_comment:
487
+ self._append_to_file('{}# move joint and {}'.format(prefix, 'wait' if wait else 'no wait'))
488
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
489
+ self._append_to_file('{} code = arm.set_servo_angle(angle={}, speed=params[\'angle_speed\'], '
490
+ 'mvacc=params[\'angle_acc\'], wait={}, radius={})'.format(prefix, values, wait, radius))
491
+ self._append_to_file('{} if code != 0:'.format(prefix))
492
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
493
+ self._append_to_file('{} pprint(\'set_servo_angle, code={{}}\'.format(code))'.format(prefix))
494
+
495
+ def _handle_move_cartesian(self, block, prefix='', arg_map=None):
496
+ fields = self.get_nodes('field', root=block)
497
+ values = []
498
+ for field in fields[:-2]:
499
+ values.append(float(field.text))
500
+ radius = float(fields[-2].text)
501
+ wait = fields[-1].text == 'TRUE'
502
+ if self._show_comment:
503
+ self._append_to_file('{}# move{}line and {}'.format(
504
+ prefix, ' arc ' if float(radius) >= 0 else ' ', 'wait' if wait else 'no wait'))
505
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
506
+ self._append_to_file('{} code = arm.set_position(*{}, speed=params[\'speed\'], mvacc=params[\'acc\'], '
507
+ 'radius={}, wait={})'.format(prefix, values, radius, wait))
508
+ self._append_to_file('{} if code != 0:'.format(prefix))
509
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
510
+ self._append_to_file('{} pprint(\'set_position, code={{}}\'.format(code))'.format(prefix))
511
+
512
+ def _handle_move_tool_line(self, block, prefix='', arg_map=None):
513
+ fields = self.get_nodes('field', root=block)
514
+ values = []
515
+ for field in fields[:-1]:
516
+ values.append(float(field.text))
517
+ wait = fields[-1].text == 'TRUE'
518
+ if self._show_comment:
519
+ self._append_to_file('{}# move tool line and {}'.format(prefix, 'wait' if wait else 'no wait'))
520
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
521
+ self._append_to_file('{} code = arm.set_tool_position(*{}, speed=params[\'speed\'], mvacc=params[\'acc\'], '
522
+ 'wait={})'.format(prefix, values, wait))
523
+ self._append_to_file('{} if code != 0:'.format(prefix))
524
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
525
+ self._append_to_file('{} pprint(\'set_tool_position, code={{}}\'.format(code))'.format(prefix))
526
+
527
+ def _handle_move_joints_var(self, block, prefix='', arg_map=None):
528
+ field = self.get_node('field', root=block)
529
+ wait = field.text == 'TRUE'
530
+ value_nodes = self.get_nodes('value', root=block)
531
+ values = []
532
+ for val_node in value_nodes:
533
+ val = self.__get_condition_expression(val_node, arg_map=arg_map)
534
+ values.append(val)
535
+ radius_fields = self.get_nodes('value', root=block, name='r')
536
+ if len(radius_fields) > 0:
537
+ radius = values[-1]
538
+ values = values[:-1]
539
+ else:
540
+ radius = None
541
+ values = '[{}]'.format(','.join(values))
542
+ if self._show_comment:
543
+ self._append_to_file('{}# move joint and {}'.format(prefix, 'wait' if wait else 'no wait'))
544
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
545
+ self._append_to_file('{} code = arm.set_servo_angle(angle={}, speed=params[\'angle_speed\'], '
546
+ 'mvacc=params[\'angle_acc\'], wait={}, radius={})'.format(prefix, values, wait, radius))
547
+ self._append_to_file('{} if code != 0:'.format(prefix))
548
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
549
+ self._append_to_file('{} pprint(\'set_servo_angle, code={{}}\'.format(code))'.format(prefix))
550
+
551
+ def _handle_move_cartesian_var(self, block, prefix='', arg_map=None):
552
+ field = self.get_node('field', root=block)
553
+ wait = field.text == 'TRUE'
554
+ value_nodes = self.get_nodes('value', root=block)
555
+ values = []
556
+ for val_node in value_nodes:
557
+ val = self.__get_condition_expression(val_node, arg_map=arg_map)
558
+ values.append(val)
559
+ radius = values.pop()
560
+ values = '[{}]'.format(','.join(values))
561
+ if self._show_comment:
562
+ try:
563
+ self._append_to_file('{}# move{}line and {}'.format(
564
+ prefix, ' arc ' if float(radius) >= 0 else ' ', 'wait' if wait else 'no wait'))
565
+ except:
566
+ pass
567
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
568
+ self._append_to_file('{} code = arm.set_position(*{}, speed=params[\'speed\'], mvacc=params[\'acc\'], '
569
+ 'radius={}, wait={})'.format(prefix, values, radius, wait))
570
+ self._append_to_file('{} if code != 0:'.format(prefix))
571
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
572
+ self._append_to_file('{} pprint(\'set_position, code={{}}\'.format(code))'.format(prefix))
573
+
574
+ def _handle_motion_set_state(self, block, prefix='', arg_map=None):
575
+ fields = self.get_nodes('field', root=block)
576
+ state = fields[0].text
577
+ if self._show_comment:
578
+ self._append_to_file('{}# set state'.format(prefix))
579
+ prefix = self.__check_is_quit(prefix)
580
+ self._append_to_file('{}arm.set_state({})'.format(prefix, state))
581
+
582
+ def _handle_motion_stop(self, block, prefix='', arg_map=None):
583
+ if self._show_comment:
584
+ self._append_to_file('{}# emergency stop'.format(prefix))
585
+ prefix = self.__check_is_quit(prefix)
586
+ self._append_to_file('{}arm.emergency_stop()'.format(prefix))
587
+
588
+ def _handle_studio_run_traj(self, block, prefix='', arg_map=None):
589
+ filename = self.get_node('field', root=block).text
590
+ value = self.get_node('value', root=block)
591
+ times = self.get_nodes('field', root=value, descendant=True)[0].text
592
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
593
+ self._append_to_file('{} code = arm.playback_trajectory(times={}, filename=\'{}\', wait=True)'.format(prefix, times, filename))
594
+ self._append_to_file('{} if code != 0:'.format(prefix))
595
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
596
+ self._append_to_file('{} pprint(\'playback_trajectory, code={{}}\'.format(code))'.format(prefix))
597
+
598
+ def _handle_app_studio_traj(self, block, prefix='', arg_map=None):
599
+ fields = self.get_nodes('field', root=block)
600
+ filename = fields[0].text
601
+ speed = fields[1].text
602
+ value = self.get_node('value', root=block)
603
+ times = self.get_nodes('field', root=value, descendant=True)[0].text
604
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
605
+ self._append_to_file('{} code = arm.playback_trajectory(times={}, filename=\'{}\', wait=True, double_speed={})'.format(prefix, times, filename, speed))
606
+ self._append_to_file('{} if code != 0:'.format(prefix))
607
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
608
+ self._append_to_file('{} pprint(\'playback_trajectory, code={{}}\'.format(code))'.format(prefix))
609
+
610
+ def _handle_tool_message(self, block, prefix='', arg_map=None):
611
+ fields = self.get_nodes('field', block)
612
+ msg = json.dumps(fields[-1].text, ensure_ascii=False)
613
+ prefix = self.__check_is_quit(prefix)
614
+ self._append_to_file('{}print({})'.format(prefix, msg))
615
+ # msg = fields[-1].text
616
+ # self._append_to_file('{}print(\'{}\')'.format(prefix, message))
617
+ # self._append_to_file('{}print(\'{{}}\'.format(\'{}\'))'.format(prefix, message))
618
+
619
+ def _handle_tool_console(self, block, prefix='', arg_map=None):
620
+ fields = self.get_nodes('field', block)
621
+ msg = json.dumps(fields[1].text, ensure_ascii=False)
622
+ prefix = self.__check_is_quit(prefix)
623
+ self._append_to_file('{}print({})'.format(prefix, msg))
624
+ # msg = fields[1].text
625
+ # self._append_to_file('{}print(\'{}\')'.format(prefix, msg))
626
+
627
+ def _handle_tool_console_with_variable(self, block, prefix='', arg_map=None):
628
+ fields = self.get_nodes('field', block)
629
+ msg = fields[1].text
630
+ # msg = json.dumps(fields[1].text, ensure_ascii=False)
631
+ value = self.get_node('value', block)
632
+ expression = self.__get_condition_expression(value, arg_map=arg_map)
633
+ # self._append_to_file('{}value = {}'.format(prefix, expression))
634
+ prefix = self.__check_is_quit(prefix)
635
+ if msg:
636
+ self._append_to_file('{}print({}.format({}))'.format(prefix, json.dumps(msg+'{}', ensure_ascii=False), expression))
637
+ # self._append_to_file('{}pprint(\'{}{{}}\'.format({}))'.format(prefix, msg, expression))
638
+ else:
639
+ self._append_to_file('{}print(\'{{}}\'.format({}))'.format(prefix, expression))
640
+
641
+ def _handle_wait(self, block, prefix='', arg_map=None):
642
+ value = self.get_node('value', root=block)
643
+ value = self.get_nodes('field', root=value, descendant=True)[0].text
644
+ self._append_to_file('{}if not params[\'quit\']:'.format(prefix))
645
+ self._append_to_file('{} time.sleep({})'.format(prefix, value))
646
+
647
+ def _handle_gpio_get_digital(self, block, prefix='', arg_map=None):
648
+ io = self.get_node('field', block).text
649
+ if self._show_comment:
650
+ self._append_to_file('{}# get tgpio-{} digital'.format(prefix, io))
651
+ self._append_to_file('{}if not params[\'quit\']:'.format(prefix))
652
+ self._append_to_file('{} arm.get_tgpio_digital({})'.format(prefix, io))
653
+
654
+ def _handle_gpio_get_analog(self, block, prefix='', arg_map=None):
655
+ io = self.get_node('field', block).text
656
+ if self._show_comment:
657
+ self._append_to_file('{}# get tgpio-{} analog'.format(prefix, io))
658
+ self._append_to_file('{}if not params[\'quit\']:'.format(prefix))
659
+ self._append_to_file('{} arm.get_tgpio_analog({})'.format(prefix, io))
660
+
661
+ def _handle_gpio_set_digital(self, block, prefix='', arg_map=None):
662
+ fields = self.get_nodes('field', root=block)
663
+ io = fields[0].text
664
+ value = 0 if fields[1].text == 'LOW' else 1
665
+ delay_sec = fields[2].text if len(fields) > 2 else 0
666
+ # io = self.get_node('field', block).text
667
+ # value = self.get_node('value', root=block)
668
+ # value = self.get_nodes('field', root=value, descendant=True)[0].text
669
+ if self._show_comment:
670
+ self._append_to_file('{}# set tgpio-{} digital'.format(prefix, io))
671
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
672
+ self._append_to_file('{} code = arm.set_tgpio_digital({}, {}, delay_sec={})'.format(prefix, io, value, delay_sec))
673
+ self._append_to_file('{} if code != 0:'.format(prefix))
674
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
675
+ self._append_to_file('{} pprint(\'set_tgpio_digital, code={{}}\'.format(code))'.format(prefix))
676
+
677
+ def _handle_gpio_set_digital_with_xyz(self, block, prefix='', arg_map=None):
678
+ fields = self.get_nodes('field', root=block)
679
+ x = fields[0].text
680
+ y = fields[1].text
681
+ z = fields[2].text
682
+ xyz = list(map(float, [x, y, z]))
683
+ tol_r = fields[3].text
684
+ io = fields[4].text
685
+ value = 0 if fields[5].text == 'LOW' else 1
686
+ # io = self.get_node('field', block).text
687
+ # value = self.get_node('value', root=block)
688
+ # value = self.get_nodes('field', root=value, descendant=True)[0].text
689
+ if self._show_comment:
690
+ self._append_to_file('{}# set tgpio-{} digital with pos {}'.format(prefix, io, xyz))
691
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
692
+ self._append_to_file('{} code = arm.set_tgpio_digital_with_xyz({}, {}, {}, {})'.format(prefix, io, value, xyz, tol_r))
693
+ self._append_to_file('{} if code != 0:'.format(prefix))
694
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
695
+ self._append_to_file('{} pprint(\'set_tgpio_digital_with_xyz, code={{}}\'.format(code))'.format(prefix))
696
+
697
+ def _handle_get_suction_cup(self, block, prefix='', arg_map=None):
698
+ if self._show_comment:
699
+ self._append_to_file('{}# get suction cup status'.format(prefix))
700
+ self._append_to_file('{}if not params[\'quit\']:'.format(prefix))
701
+ self._append_to_file('{} arm.get_suction_cup()'.format(prefix))
702
+
703
+ def _handle_check_air_pump_state(self, block, prefix='', arg_map=None):
704
+ if self._show_comment:
705
+ self._append_to_file('{}# check air pump state'.format(prefix))
706
+ fields = self.get_nodes('field', root=block)
707
+ state = 1 if fields[0].text == 'ON' else 0
708
+ timeout = float(fields[1].text)
709
+ self._append_to_file('{}if not params[\'quit\']:'.format(prefix))
710
+ self._append_to_file('{} arm.arm.check_air_pump_state({}, timeout={})'.format(prefix, state, timeout))
711
+
712
+ def _handle_check_bio_gripper_is_catch(self, block, prefix='', arg_map=None):
713
+ if self._show_comment:
714
+ self._append_to_file('{}# check bio gripper is catch'.format(prefix))
715
+ fields = self.get_nodes('field', root=block)
716
+ timeout = float(fields[0].text)
717
+ self._append_to_file('{}if not params[\'quit\']:'.format(prefix))
718
+ self._append_to_file('{} arm.arm.check_bio_gripper_is_catch(timeout={})'.format(prefix, timeout))
719
+
720
+ def _handle_check_robotiq_is_catch(self, block, prefix='', arg_map=None):
721
+ if self._show_comment:
722
+ self._append_to_file('{}# check robotiq is catch'.format(prefix))
723
+ fields = self.get_nodes('field', root=block)
724
+ timeout = float(fields[0].text)
725
+ self._append_to_file('{}if not params[\'quit\']:'.format(prefix))
726
+ self._append_to_file('{} arm.arm.check_robotiq_is_catch(timeout={})'.format(prefix, timeout))
727
+
728
+ def _handle_set_suction_cup(self, block, prefix='', arg_map=None):
729
+ fields = self.get_nodes('field', root=block, name='trigger')
730
+ on = True if fields[0].text == 'ON' else False
731
+ fields = self.get_nodes('field', root=block, name='wait')
732
+ if fields and len(fields) > 0:
733
+ wait = fields[0].text == 'TRUE'
734
+ else:
735
+ wait = False
736
+ fields = self.get_nodes('field', root=block, name='delay')
737
+ delay_sec = fields[0].text if len(fields) > 0 else 0
738
+
739
+ # io = self.get_node('field', block).text
740
+ # value = self.get_node('value', root=block)
741
+ # value = self.get_nodes('field', root=value, descendant=True)[0].text
742
+ if self._show_comment:
743
+ self._append_to_file('{}# set_suction_cup({}, wait={}, delay_sec={})'.format(prefix, on, wait, delay_sec))
744
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
745
+ self._append_to_file('{} code = arm.set_suction_cup({}, wait={}, delay_sec={})'.format(prefix, on, wait, delay_sec))
746
+ self._append_to_file('{} if code != 0:'.format(prefix))
747
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
748
+ self._append_to_file('{} pprint(\'set_suction_cup, code={{}}\'.format(code))'.format(prefix))
749
+
750
+ def _handle_gpio_get_controller_digital(self, block, prefix='', arg_map=None):
751
+ io = self.get_node('field', block).text
752
+ if self._show_comment:
753
+ self._append_to_file('{}# get cgpio-{} digital'.format(prefix, io))
754
+ self._append_to_file('{}if not params[\'quit\']:'.format(prefix))
755
+ self._append_to_file('{} arm.get_cgpio_digital({})'.format(prefix, io))
756
+
757
+ def _handle_gpio_get_controller_digital_di(self, block, prefix='', arg_map=None):
758
+ io = self.get_node('field', block).text
759
+ if self._show_comment:
760
+ self._append_to_file('{}# get cgpio-{} digital'.format(prefix, io))
761
+ self._append_to_file('{}if not params[\'quit\']:'.format(prefix))
762
+ self._append_to_file('{} arm.get_cgpio_digital({})'.format(prefix, io))
763
+
764
+ def _handle_gpio_get_controller_analog(self, block, prefix='', arg_map=None):
765
+ io = self.get_node('field', block).text
766
+ if self._show_comment:
767
+ self._append_to_file('{}# get cgpio-{} analog'.format(prefix, io))
768
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
769
+ self._append_to_file('{} arm.get_cgpio_analog({})'.format(prefix, io))
770
+
771
+ def _handle_gpio_set_controller_digital(self, block, prefix='', arg_map=None):
772
+ fields = self.get_nodes('field', root=block)
773
+ io = fields[0].text
774
+ value = 0 if fields[1].text == 'LOW' else 1
775
+ delay_sec = fields[2].text if len(fields) > 2 else 0
776
+ # io = self.get_node('field', block).text
777
+ # value = self.get_node('value', root=block)
778
+ # value = self.get_nodes('field', root=value, descendant=True)[0].text
779
+ if self._show_comment:
780
+ self._append_to_file('{}# set cgpio-{} digital'.format(prefix, io))
781
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
782
+ self._append_to_file('{} code = arm.set_cgpio_digital({}, {}, delay_sec={})'.format(prefix, io, value, delay_sec))
783
+ self._append_to_file('{} if code != 0:'.format(prefix))
784
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
785
+ self._append_to_file('{} pprint(\'set_cgpio_digital, code={{}}\'.format(code))'.format(prefix))
786
+
787
+ def _handle_gpio_set_controller_digital_with_xyz(self, block, prefix='', arg_map=None):
788
+ fields = self.get_nodes('field', root=block)
789
+ x = fields[0].text
790
+ y = fields[1].text
791
+ z = fields[2].text
792
+ xyz = list(map(float, [x, y, z]))
793
+ tol_r = fields[3].text
794
+ io = fields[4].text
795
+ value = 0 if fields[5].text == 'LOW' else 1
796
+ # io = self.get_node('field', block).text
797
+ # value = self.get_node('value', root=block)
798
+ # value = self.get_nodes('field', root=value, descendant=True)[0].text
799
+ if self._show_comment:
800
+ self._append_to_file('{}# set cgpio-{} digital with pos {}'.format(prefix, io, xyz))
801
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
802
+ self._append_to_file('{} code = arm.set_cgpio_digital_with_xyz({}, {}, {}, {})'.format(prefix, io, value, xyz, tol_r))
803
+ self._append_to_file('{} if code != 0:'.format(prefix))
804
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
805
+ self._append_to_file('{} pprint(\'set_cgpio_digital_with_xyz, code={{}}\'.format(code))'.format(prefix))
806
+
807
+ def _handle_gpio_set_controller_digital_do(self, block, prefix='', arg_map=None):
808
+ fields = self.get_nodes('field', root=block)
809
+ io = fields[0].text
810
+ value = 0 if fields[1].text == 'LOW' else 1
811
+ delay_sec = fields[2].text if len(fields) > 2 else 0
812
+ # io = self.get_node('field', block).text
813
+ # value = self.get_node('value', root=block)
814
+ # value = self.get_nodes('field', root=value, descendant=True)[0].text
815
+ if self._show_comment:
816
+ self._append_to_file('{}# set cgpio-{} digital'.format(prefix, io))
817
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
818
+ self._append_to_file('{} code = arm.set_cgpio_digital({}, {}, delay_sec={})'.format(prefix, io, value, delay_sec))
819
+ self._append_to_file('{} if code != 0:'.format(prefix))
820
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
821
+ self._append_to_file('{} pprint(\'set_cgpio_digital, code={{}}\'.format(code))'.format(prefix))
822
+
823
+ def _handle_gpio_set_controller_digital_with_xyz_do(self, block, prefix='', arg_map=None):
824
+ fields = self.get_nodes('field', root=block)
825
+ x = fields[0].text
826
+ y = fields[1].text
827
+ z = fields[2].text
828
+ xyz = list(map(float, [x, y, z]))
829
+ tol_r = fields[3].text
830
+ io = fields[4].text
831
+ value = 0 if fields[5].text == 'LOW' else 1
832
+ # io = self.get_node('field', block).text
833
+ # value = self.get_node('value', root=block)
834
+ # value = self.get_nodes('field', root=value, descendant=True)[0].text
835
+ if self._show_comment:
836
+ self._append_to_file('{}# set cgpio-{} digital with pos {}'.format(prefix, io, xyz))
837
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
838
+ self._append_to_file('{} code = arm.set_cgpio_digital_with_xyz({}, {}, {}, {})'.format(prefix, io, value, xyz, tol_r))
839
+ self._append_to_file('{} if code != 0:'.format(prefix))
840
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
841
+ self._append_to_file('{} pprint(\'set_cgpio_digital_with_xyz, code={{}}\'.format(code))'.format(prefix))
842
+
843
+ def _handle_gpio_set_controller_analog_with_xyz(self, block, prefix='', arg_map=None):
844
+ fields = self.get_nodes('field', root=block)
845
+ x = fields[0].text
846
+ y = fields[1].text
847
+ z = fields[2].text
848
+ xyz = list(map(float, [x, y, z]))
849
+ tol_r = fields[3].text
850
+ io = fields[4].text
851
+ value = fields[5].text
852
+ # io = self.get_node('field', block).text
853
+ # value = self.get_node('value', root=block)
854
+ # value = self.get_nodes('field', root=value, descendant=True)[0].text
855
+ if self._show_comment:
856
+ self._append_to_file('{}# set cgpio-{} analog with pos {}'.format(prefix, io, xyz))
857
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
858
+ self._append_to_file('{} code = arm.set_cgpio_analog_with_xyz({}, {}, {}, {})'.format(prefix, io, value, xyz, tol_r))
859
+ self._append_to_file('{} if code != 0:'.format(prefix))
860
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
861
+ self._append_to_file('{} pprint(\'set_cgpio_analog_with_xyz, code={{}}\'.format(code))'.format(prefix))
862
+
863
+ def _handle_gpio_set_controller_analog(self, block, prefix='', arg_map=None):
864
+ io = self.get_node('field', block).text
865
+ value = self.get_node('value', root=block)
866
+ value = self.__get_block_val(value, arg_map=arg_map)
867
+ # value = self.get_nodes('field', root=value, descendant=True)[0].text
868
+ if self._show_comment:
869
+ self._append_to_file('{}# set cgpio-{} digital'.format(prefix, io))
870
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
871
+ self._append_to_file('{} code = arm.set_cgpio_analog({}, {})'.format(prefix, io, value))
872
+ self._append_to_file('{} if code != 0:'.format(prefix))
873
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
874
+ self._append_to_file('{} pprint(\'set_cgpio_analog, code={{}}\'.format(code))'.format(prefix))
875
+
876
+ def _handle_set_collision_sensitivity(self, block, prefix='', arg_map=None):
877
+ value = self.get_node('value', root=block)
878
+ value = self.get_nodes('field', root=value, descendant=True)[0].text
879
+ self._append_to_file('{}if not params[\'quit\']:'.format(prefix))
880
+ self._append_to_file('{} arm.set_collision_sensitivity({})'.format(prefix, value))
881
+
882
+ def _handle_set_teach_sensitivity(self, block, prefix=''):
883
+ value = self.get_node('value', root=block)
884
+ value = self.get_nodes('field', root=value, descendant=True)[0].text
885
+ self._append_to_file('{}if not params[\'quit\']:'.format(prefix))
886
+ self._append_to_file('{} arm.set_teach_sensitivity({})'.format(prefix, value))
887
+
888
+ def _handle_set_tcp_load(self, block, prefix='', arg_map=None):
889
+ fields = self.get_nodes('field', root=block)
890
+ weight = fields[1].text
891
+ x = fields[2].text
892
+ y = fields[3].text
893
+ z = fields[4].text
894
+ self._append_to_file('{}if not params[\'quit\']:'.format(prefix))
895
+ self._append_to_file('{} arm.set_tcp_load({}, [{}, {}, {}])'.format(prefix, weight, x, y, z))
896
+ # self._append_to_file('{} arm.set_state(0)'.format(prefix))
897
+ # self._append_to_file('{} time.sleep(0.5)'.format(prefix))
898
+
899
+ # values = self.get_nodes('value', root=block)
900
+ # weight = self.get_nodes('field', root=values[0], descendant=True)[0].text
901
+ # x = self.get_nodes('field', root=values[1], descendant=True)[0].text
902
+ # y = self.get_nodes('field', root=values[2], descendant=True)[0].text
903
+ # z = self.get_nodes('field', root=values[3], descendant=True)[0].text
904
+ # self._append_to_file('{}arm.set_tcp_load({}, [{}, {}, {}])'.format(prefix, weight, x, y, z))
905
+ # self._append_to_file('{}arm.set_state(0)'.format(prefix))
906
+
907
+ def _handle_set_gravity_direction(self, block, prefix='', arg_map=None):
908
+ values = self.get_nodes('value', root=block)
909
+ x = self.get_nodes('field', root=values[0], descendant=True)[0].text
910
+ y = self.get_nodes('field', root=values[1], descendant=True)[0].text
911
+ z = self.get_nodes('field', root=values[2], descendant=True)[0].text
912
+ self._append_to_file('{}if not params[\'quit\']:'.format(prefix))
913
+ self._append_to_file('{} arm.set_gravity_direction([{}, {}, {}])'.format(prefix, x, y, z))
914
+
915
+ def _handle_set_tcp_offset(self, block, prefix='', arg_map=None):
916
+ fields = self.get_nodes('field', root=block)
917
+ x = fields[1].text
918
+ y = fields[2].text
919
+ z = fields[3].text
920
+ roll = fields[4].text
921
+ pitch = fields[5].text
922
+ yaw = fields[6].text
923
+ self._append_to_file('{}if not params[\'quit\']:'.format(prefix))
924
+ self._append_to_file('{} arm.set_tcp_offset([{}, {}, {}, {}, {}, {}], wait=True)'.format(prefix, x, y, z, roll, pitch, yaw))
925
+ self._append_to_file('{} arm.set_state(0)'.format(prefix))
926
+ self._append_to_file('{} time.sleep(0.5)'.format(prefix))
927
+
928
+ # values = self.get_nodes('value', root=block)
929
+ # x = self.get_nodes('field', root=values[0], descendant=True)[0].text
930
+ # y = self.get_nodes('field', root=values[1], descendant=True)[0].text
931
+ # z = self.get_nodes('field', root=values[2], descendant=True)[0].text
932
+ # roll = self.get_nodes('field', root=values[3], descendant=True)[0].text
933
+ # pitch = self.get_nodes('field', root=values[4], descendant=True)[0].text
934
+ # yaw = self.get_nodes('field', root=values[5], descendant=True)[0].text
935
+ # self._append_to_file('{}arm.set_tcp_offset([{}, {}, {}, {}, {}, {}])'.format(prefix, x, y, z, roll, pitch, yaw))
936
+ # self._append_to_file('{}arm.set_state(0)'.format(prefix))
937
+
938
+ def _handle_set_world_offset(self, block, prefix='', arg_map=None):
939
+ fields = self.get_nodes('field', root=block)
940
+ x = fields[1].text
941
+ y = fields[2].text
942
+ z = fields[3].text
943
+ roll = fields[4].text
944
+ pitch = fields[5].text
945
+ yaw = fields[6].text
946
+ self._append_to_file('{}if not params[\'quit\']:'.format(prefix))
947
+ self._append_to_file('{} arm.set_world_offset([{}, {}, {}, {}, {}, {}])'.format(prefix, x, y, z, roll, pitch, yaw))
948
+ self._append_to_file('{} arm.set_state(0)'.format(prefix))
949
+ self._append_to_file('{} time.sleep(0.5)'.format(prefix))
950
+
951
+ def _handle_gripper_set(self, block, prefix='', arg_map=None):
952
+ fields = self.get_nodes('field', root=block)
953
+ if fields is not None and len(fields) >= 3:
954
+ pos = fields[0].text
955
+ speed = fields[1].text
956
+ wait = fields[2].text == 'TRUE'
957
+ else:
958
+ values = self.get_nodes('value', root=block)
959
+ pos = self.get_nodes('field', root=values[0], descendant=True)[0].text
960
+ speed = self.get_nodes('field', root=values[1], descendant=True)[0].text
961
+ wait = self.get_nodes('field', root=values[2], descendant=True)[0].text == 'TRUE'
962
+ if self._show_comment:
963
+ self._append_to_file('{}# set gripper position and {}'.format(prefix, 'wait' if wait else 'no wait'))
964
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
965
+ self._append_to_file('{} code = arm.set_gripper_position({}, wait={}, speed={}, auto_enable=True)'.format(prefix, pos, wait, speed))
966
+ self._append_to_file('{} if code != 0:'.format(prefix))
967
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
968
+ self._append_to_file('{} pprint(\'set_gripper_position, code={{}}\'.format(code))'.format(prefix))
969
+
970
+ def _handle_gripper_set_status(self, block, prefix='', arg_map=None):
971
+ fields = self.get_nodes('field', root=block, name='status')
972
+ status = True if fields[0].text == 'TRUE' else False
973
+ fields = self.get_nodes('field', root=block, name='delay')
974
+ delay_sec = fields[0].text if len(fields) > 0 else 0
975
+ if self._show_comment:
976
+ self._append_to_file('{}# set_gripper_status({}, delay_sec={})'.format(prefix, status, delay_sec))
977
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
978
+ self._append_to_file('{} code = arm._arm.set_gripper_status({}, delay_sec={})'.format(prefix, status, delay_sec))
979
+ self._append_to_file('{} if code != 0:'.format(prefix))
980
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
981
+ self._append_to_file('{} pprint(\'set_gripper_status, code={{}}\'.format(code))'.format(prefix))
982
+
983
+ def _handle_set_bio_gripper_init(self, block, prefix='', arg_map=None):
984
+ if self._show_comment:
985
+ self._append_to_file('{}# set_bio_gripper_enable(True)'.format(prefix))
986
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
987
+ self._append_to_file('{} code = arm.set_bio_gripper_enable(True)'.format(prefix))
988
+ self._append_to_file('{} if code != 0:'.format(prefix))
989
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
990
+ self._append_to_file('{} pprint(\'set_bio_gripper_enable, code={{}}\'.format(code))'.format(prefix))
991
+ # self._append_to_file('{}expired = time.monotonic() + 2'.format(prefix))
992
+ # self._append_to_file('{}while not params[\'quit\'] and time.monotonic() < expired:'.format(prefix))
993
+ # self._append_to_file('{} time.sleep(0.1)'.format(prefix))
994
+
995
+ def _handle_set_bio_gripper(self, block, prefix='', arg_map=None):
996
+ fields = self.get_nodes('field', root=block, name='status')
997
+ on = True if fields[0].text == 'TRUE' else False
998
+ fields = self.get_nodes('field', root=block, name='speed')
999
+ speed = int(fields[0].text) if fields and len(fields) > 0 else 0
1000
+ fields = self.get_nodes('field', root=block, name='wait')
1001
+ wait = fields[0].text == 'TRUE' if fields and len(fields) > 0 else False
1002
+ if on:
1003
+ if self._show_comment:
1004
+ self._append_to_file('{}# open_bio_gripper(speed={}, wait={})'.format(prefix, speed, wait))
1005
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
1006
+ self._append_to_file('{} code = arm.open_bio_gripper(speed={}, wait={})'.format(prefix, speed, wait))
1007
+ self._append_to_file('{} if code != 0:'.format(prefix))
1008
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
1009
+ self._append_to_file('{} pprint(\'open_bio_gripper, code={{}}\'.format(code))'.format(prefix))
1010
+ else:
1011
+ if self._show_comment:
1012
+ self._append_to_file('{}# close_bio_gripper(speed={}, wait={})'.format(prefix, speed, wait))
1013
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
1014
+ self._append_to_file('{} code = arm.close_bio_gripper(speed={}, wait={})'.format(prefix, speed, wait))
1015
+ self._append_to_file('{} if code != 0:'.format(prefix))
1016
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
1017
+ self._append_to_file('{} pprint(\'close_bio_gripper, code={{}}\'.format(code))'.format(prefix))
1018
+
1019
+ def _handle_set_robotiq_init(self, block, prefix='', arg_map=None):
1020
+ if self._show_comment:
1021
+ self._append_to_file('{}# set_robotiq_init()'.format(prefix))
1022
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
1023
+ self._append_to_file('{} code, _ = arm.robotiq_reset()'.format(prefix))
1024
+ self._append_to_file('{} if code != 0:'.format(prefix))
1025
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
1026
+ self._append_to_file('{} pprint(\'robotiq_reset, code={{}}\'.format(code))'.format(prefix))
1027
+
1028
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
1029
+ self._append_to_file('{} code, _ = arm.robotiq_set_activate(wait=True)'.format(prefix))
1030
+ self._append_to_file('{} if code != 0:'.format(prefix))
1031
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
1032
+ self._append_to_file('{} pprint(\'robotiq_set_activate, code={{}}\'.format(code))'.format(prefix))
1033
+
1034
+ def _handle_set_robotiq_gripper(self, block, prefix='', arg_map=None):
1035
+ fields = self.get_nodes('field', root=block, name='pos')
1036
+ pos = int(fields[0].text)
1037
+ fields = self.get_nodes('field', root=block, name='speed')
1038
+ speed = int(fields[0].text) if fields and len(fields) > 0 else 0xFF
1039
+ fields = self.get_nodes('field', root=block, name='force')
1040
+ force = int(fields[0].text) if fields and len(fields) > 0 else 0xFF
1041
+ fields = self.get_nodes('field', root=block, name='wait')
1042
+ wait = fields[0].text == 'TRUE' if fields and len(fields) > 0 else False
1043
+ if self._show_comment:
1044
+ self._append_to_file('{}# robotiq_set_position({}, speed={}, force={}, wait={})'.format(prefix, pos, speed, force, wait))
1045
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
1046
+ self._append_to_file('{} code, _ = arm.robotiq_set_position({}, speed={}, force={}, wait={})'.format(prefix, pos, speed, force, wait))
1047
+ self._append_to_file('{} if code != 0:'.format(prefix))
1048
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
1049
+ self._append_to_file('{} pprint(\'robotiq_set_position, code={{}}\'.format(code))'.format(prefix))
1050
+
1051
+ def __handle_gpio_event(self, gpio_type, block, prefix='', arg_map=None):
1052
+ if gpio_type.startswith('listen'):
1053
+ if gpio_type == 'listen_tgpio_digital':
1054
+ self._append_to_file('\n{}params[\'events\'][\'gpio\'].listen_tgpio_digital = True'.format(prefix))
1055
+ elif gpio_type == 'listen_tgpio_analog':
1056
+ self._append_to_file('\n{}params[\'events\'][\'gpio\'].listen_tgpio_analog = True'.format(prefix))
1057
+ elif gpio_type == 'listen_cgpio_state':
1058
+ self._append_to_file('\n{}params[\'events\'][\'gpio\'].listen_cgpio_state = True'.format(prefix))
1059
+ else:
1060
+ return
1061
+ old_prefix = prefix
1062
+ else:
1063
+ fields = self.get_nodes('field', root=block)
1064
+ io = fields[0].text
1065
+ trigger = fields[1].text
1066
+
1067
+ if 'gpio' not in self._events:
1068
+ num = 1
1069
+ else:
1070
+ if gpio_type not in self._events['gpio']:
1071
+ num = 1
1072
+ else:
1073
+ num = self._events['gpio'][gpio_type] + 1
1074
+
1075
+ if gpio_type == 'tgpio_digital':
1076
+ name = 'tool_gpio_{}_digital_is_changed_callback_{}'.format(io, num)
1077
+ self._append_to_file('\n\n{}# Define Tool GPIO-{} DIGITAL is changed callback'.format(prefix, io))
1078
+ elif gpio_type == 'tgpio_analog':
1079
+ name = 'tool_gpio_{}_analog_is_changed_callback_{}'.format(io, num)
1080
+ self._append_to_file('\n\n{}# Define Tool GPIO-{} ANALOG is changed callback'.format(prefix, io))
1081
+ elif gpio_type == 'cgpio_digital':
1082
+ name = 'controller_gpio_{}_digital_is_changed_callback_{}'.format(io, num)
1083
+ self._append_to_file('\n\n{}# Define Contoller GPIO-{} DIGITAL is {} callback'.format(prefix, io, trigger))
1084
+ elif gpio_type == 'cgpio_analog':
1085
+ name = 'controller_gpio_{}_digital_is_changed_callback_{}'.format(io, num)
1086
+ self._append_to_file('\n\n{}# Define Contoller GPIO-{} ANALOG is changed callback'.format(prefix, io))
1087
+ else:
1088
+ return
1089
+ self._append_to_file('{}def {}():'.format(prefix, name))
1090
+ old_prefix = prefix
1091
+ prefix = ' ' + prefix
1092
+ statement = self.get_node('statement', root=block)
1093
+ if statement:
1094
+ self._append_to_file('{}def _callback():'.format(prefix))
1095
+ self.parse(statement, prefix + ' ', arg_map=arg_map)
1096
+ self._append_to_file('{}_callback() if not params[\'callback_in_thread\'] else threading.Thread(target=_callback, daemon=True).start()'.format(prefix))
1097
+ else:
1098
+ self._append_to_file('{}pass'.format(prefix))
1099
+
1100
+ if gpio_type == 'tgpio_digital':
1101
+ self._append_to_file(
1102
+ '\n{}params[\'events\'][\'gpio\'].tgpio_digital_callbacks.append({{'
1103
+ '\'io\': {}, \'trigger\': {}, \'op\': \'==\', \'callback\': {}}})'.format(
1104
+ old_prefix, io, 1 if trigger == 'HIGH' else 0, name))
1105
+ elif gpio_type == 'tgpio_analog':
1106
+ op = self._ops2.get(trigger)
1107
+ trigger = fields[2].text
1108
+ self._append_to_file(
1109
+ '\n{}params[\'events\'][\'gpio\'].tgpio_analog_callbacks.append({{'
1110
+ '\'io\': {}, \'trigger\': {}, \'op\': \'{}\', \'callback\': {}}})'.format(
1111
+ old_prefix, io, trigger, op, name))
1112
+ elif gpio_type == 'cgpio_digital':
1113
+ self._append_to_file(
1114
+ '\n{}params[\'events\'][\'gpio\'].cgpio_callbacks.append({{'
1115
+ '\'type\': \'digital\', \'io\': {}, \'trigger\': {}, \'op\': \'{}\', \'callback\': {}}})'.format(
1116
+ old_prefix, io, 1 if trigger == 'HIGH' else 0, '==', name))
1117
+ elif gpio_type == 'cgpio_analog':
1118
+ op = self._ops2.get(trigger)
1119
+ trigger = fields[2].text
1120
+ self._append_to_file(
1121
+ '\n{}params[\'events\'][\'gpio\'].cgpio_callbacks.append({{'
1122
+ '\'type\': \'analog\', \'io\': {}, \'trigger\': {}, \'op\': \'{}\', \'callback\': {}}})'.format(
1123
+ old_prefix, io, trigger, op, name))
1124
+ else:
1125
+ return
1126
+ self._append_to_file('{}if not params[\'events\'][\'gpio\'].alive:'.format(old_prefix))
1127
+ self._append_to_file('{} params[\'events\'][\'gpio\'].start()'.format(old_prefix))
1128
+
1129
+ if 'gpio' not in self._events:
1130
+ name2 = 'EventGPIOThread'
1131
+ self._insert_to_file(self.index, '\n\n# Define GPIO callback handle thread')
1132
+ self._insert_to_file(self.index, 'class {}(threading.Thread):'.format(name2))
1133
+ self._insert_to_file(self.index, ' def __init__(self, *args, **kwargs):'
1134
+ '\n threading.Thread.__init__(self, *args, **kwargs)')
1135
+ self._insert_to_file(self.index, ' self.daemon = True')
1136
+ self._insert_to_file(self.index, ' self.alive = False')
1137
+ self._insert_to_file(self.index, ' self.is_init_tgpio_digital = False')
1138
+ self._insert_to_file(self.index, ' self.is_init_tgpio_analog = False')
1139
+ self._insert_to_file(self.index, ' self.is_init_cgpio_state = False')
1140
+ self._insert_to_file(self.index, ' self.listen_tgpio_digital = False')
1141
+ self._insert_to_file(self.index, ' self.listen_tgpio_analog = False')
1142
+ self._insert_to_file(self.index, ' self.listen_cgpio_state = False')
1143
+
1144
+ self._insert_to_file(self.index, ' self.values = {'
1145
+ '\'tgpio\': {\'digital\': [0] * 2, \'analog\': [0] * 2, \'digital_o\': [0] * 2, \'analog_o\': [0] * 2},'
1146
+ '\'cgpio\': {\'digital\': [1] * 16, \'analog\': [0] * 2, \'digital_o\': [1] * 16, \'analog_o\': [0] * 2}}')
1147
+
1148
+ self._insert_to_file(self.index, ' self.tgpio_digital_callbacks = []')
1149
+ self._insert_to_file(self.index, ' self.tgpio_analog_callbacks = []')
1150
+ self._insert_to_file(self.index, ' self.cgpio_callbacks = []')
1151
+
1152
+ self._insert_to_file(self.index, '\n def cgpio_digitals_is_matchs_bin(self, bin_val):')
1153
+ self._insert_to_file(self.index, ' digitals_bin = \'\'.join(map(str, self.values[\'cgpio\'][\'digital\']))')
1154
+ self._insert_to_file(self.index, ' length = min(len(digitals_bin), len(bin_val))')
1155
+ self._insert_to_file(self.index, ' bin_val_ = bin_val[::-1]')
1156
+ self._insert_to_file(self.index, ' for i in range(length):')
1157
+ self._insert_to_file(self.index, ' if bin_val_[i] != digitals_bin[i]:')
1158
+ self._insert_to_file(self.index, ' return False')
1159
+ self._insert_to_file(self.index, ' return True')
1160
+
1161
+ self._insert_to_file(self.index, '\n def run(self):')
1162
+ self._insert_to_file(self.index, ' self.alive = True')
1163
+ self._insert_to_file(self.index, ' while arm.connected and arm.error_code == 0 and not params[\'quit\']:')
1164
+ self._insert_to_file(self.index, ' if self.listen_tgpio_digital or len(self.tgpio_digital_callbacks) > 0:')
1165
+ self._insert_to_file(self.index, ' _, values = arm.get_tgpio_digital()')
1166
+ self._insert_to_file(self.index, ' if _ == 0:')
1167
+ self._insert_to_file(self.index, ' if self.is_init_tgpio_digital:')
1168
+ self._insert_to_file(self.index, ' for item in self.tgpio_digital_callbacks:')
1169
+ self._insert_to_file(self.index, ' for io in range(2):')
1170
+ self._insert_to_file(self.index, ' if item[\'io\'] == io and eval(\'{} {} {}\'.format(values[io], item[\'op\'], item[\'trigger\'])) and not eval(\'{} {} {}\'.format(self.values[\'tgpio\'][\'digital\'][io], item[\'op\'], item[\'trigger\'])):')
1171
+ # self._insert_to_file(self.index, ' if item[\'io\'] == io and values[io] {op} item[\'trigger\'] and not (values[io] {op} self.values[\'tgpio\'][\'digital\'][io]):'.format(op='item[\'op\']'))
1172
+ self._insert_to_file(self.index, ' item[\'callback\']()')
1173
+ self._insert_to_file(self.index, ' self.values[\'tgpio\'][\'digital\'] = values')
1174
+ self._insert_to_file(self.index, ' self.is_init_tgpio_digital = True')
1175
+
1176
+ self._insert_to_file(self.index, ' if self.listen_tgpio_analog or len(self.tgpio_analog_callbacks) > 0:')
1177
+ self._insert_to_file(self.index, ' _, values = arm.get_tgpio_analog()')
1178
+ self._insert_to_file(self.index, ' if _ == 0:')
1179
+ self._insert_to_file(self.index, ' if self.is_init_tgpio_analog:')
1180
+ self._insert_to_file(self.index, ' for item in self.tgpio_analog_callbacks:')
1181
+ self._insert_to_file(self.index, ' for io in range(2):')
1182
+ self._insert_to_file(self.index, ' if item[\'io\'] == io and eval(\'{} {} {}\'.format(values[io], item[\'op\'], item[\'trigger\'])) and not eval(\'{} {} {}\'.format(self.values[\'tgpio\'][\'analog\'][io], item[\'op\'], item[\'trigger\'])):')
1183
+ # self._insert_to_file(self.index, ' if item[\'io\'] == io and values[io] {op} item[\'trigger\'] and not (values[io] {op} self.values[\'tgpio\'][\'analog\'][io]):'.format(op='item[\'op\']'))
1184
+ self._insert_to_file(self.index, ' item[\'callback\']()')
1185
+ self._insert_to_file(self.index, ' self.values[\'tgpio\'][\'analog\'] = values')
1186
+ self._insert_to_file(self.index, ' self.is_init_tgpio_analog = True')
1187
+
1188
+ self._insert_to_file(self.index, ' if self.listen_cgpio_state or len(self.cgpio_callbacks) > 0:')
1189
+ self._insert_to_file(self.index, ' _, values = arm.get_cgpio_state()')
1190
+ self._insert_to_file(self.index, ' if _ == 0:')
1191
+ self._insert_to_file(self.index, ' digitals = [values[3] >> i & 0x0001 if values[10][i] in [0, 255] else 1 for i in range(len(values[10]))]')
1192
+ self._insert_to_file(self.index, ' digitals_o = [values[5] >> i & 0x0001 for i in range(len(values[11]))]')
1193
+ self._insert_to_file(self.index, ' analogs = [values[6], values[7]]')
1194
+ self._insert_to_file(self.index, ' analogs_o = [values[8], values[9]]')
1195
+ self._insert_to_file(self.index, ' if self.is_init_cgpio_state:')
1196
+ self._insert_to_file(self.index, ' for item in self.cgpio_callbacks:')
1197
+ self._insert_to_file(self.index, ' if item[\'type\'] == \'digital\':')
1198
+ self._insert_to_file(self.index, ' for io in range(len(digitals)):')
1199
+ self._insert_to_file(self.index, ' if item[\'io\'] == io and eval(\'{} {} {}\'.format(digitals[io], item[\'op\'], item[\'trigger\'])) and not eval(\'{} {} {}\'.format(self.values[\'cgpio\'][\'digital\'][io], item[\'op\'], item[\'trigger\'])):')
1200
+ # self._insert_to_file(self.index, ' if item[\'io\'] == io and values[io] {op} item[\'trigger\'] and not (values[io] {op} self.values[\'cgpio\'][\'digital\'][io]):'.format(op='item[\'op\']'))
1201
+ self._insert_to_file(self.index, ' item[\'callback\']()')
1202
+ self._insert_to_file(self.index, ' elif item[\'type\'] == \'analog\':')
1203
+ self._insert_to_file(self.index, ' for io in range(2):')
1204
+ self._insert_to_file(self.index, ' if item[\'io\'] == io and eval(\'{} {} {}\'.format(analogs[io], item[\'op\'], item[\'trigger\'])) and not eval(\'{} {} {}\'.format(self.values[\'cgpio\'][\'analog\'][io], item[\'op\'], item[\'trigger\'])):')
1205
+ # self._insert_to_file(self.index, ' if item[\'io\'] == io and values[io] {op} item[\'trigger\'] and not (values[io] {op} self.values[\'cgpio\'][\'analog\'][io]):'.format(op='item[\'op\']'))
1206
+ self._insert_to_file(self.index, ' item[\'callback\']()')
1207
+ self._insert_to_file(self.index, ' self.values[\'cgpio\'][\'digital\'] = digitals')
1208
+ self._insert_to_file(self.index, ' self.values[\'cgpio\'][\'analog\'] = analogs')
1209
+ self._insert_to_file(self.index, ' self.values[\'cgpio\'][\'digital_o\'] = digitals_o')
1210
+ self._insert_to_file(self.index, ' self.values[\'cgpio\'][\'analog_o\'] = analogs_o')
1211
+ self._insert_to_file(self.index, ' self.is_init_cgpio_state = True')
1212
+
1213
+ self._insert_to_file(self.index, ' time.sleep(0.1)')
1214
+ self._insert_to_file(self.index, '\nparams[\'events\'][\'gpio\'] = {}()'.format(name2))
1215
+ self._events['gpio'] = {}
1216
+
1217
+ if not gpio_type.startswith('listen'):
1218
+ if gpio_type not in self._events['gpio']:
1219
+ self._events['gpio'][gpio_type] = 2
1220
+ else:
1221
+ self._events['gpio'][gpio_type] += 1
1222
+
1223
+ self._hasEvent = True
1224
+
1225
+ def _handle_event_gpio_digital(self, block, prefix='', arg_map=None):
1226
+ self.__handle_gpio_event('tgpio_digital', block, prefix, arg_map=arg_map)
1227
+
1228
+ def _handle_event_gpio_analog(self, block, prefix='', arg_map=None):
1229
+ self.__handle_gpio_event('tgpio_analog', block, prefix, arg_map=arg_map)
1230
+
1231
+ def _handle_event_gpio_controller_digital(self, block, prefix, arg_map=None):
1232
+ self.__handle_gpio_event('cgpio_digital', block, prefix, arg_map=arg_map)
1233
+
1234
+ def _handle_event_gpio_controller_analog(self, block, prefix, arg_map=None):
1235
+ self.__handle_gpio_event('cgpio_analog', block, prefix, arg_map=arg_map)
1236
+
1237
+ def _handle_gpio_controller_digitals_listen(self, block, prefix, arg_map=None):
1238
+ self.__handle_gpio_event('listen_cgpio_state', block, prefix, arg_map=arg_map)
1239
+
1240
+ def _handle_event_gpio_controller_digital_di(self, block, prefix, arg_map=None):
1241
+ self.__handle_gpio_event('cgpio_digital', block, prefix, arg_map=arg_map)
1242
+ # def _handle_event_gpio_digital(self, block, prefix=''):
1243
+ # fields = self.get_nodes('field', root=block)
1244
+ # io = fields[0].text
1245
+ # trigger = fields[1].text
1246
+ #
1247
+ # if 'gpio' not in self._events:
1248
+ # num = 1
1249
+ # else:
1250
+ # num = self._events['gpio'] + 1
1251
+ # name = '{}_io{}_is_{}_{}'.format(block.attrib['type'], io, trigger.lower(), num)
1252
+ # self._append_to_file('\n\n{}# Define TGPIO-{} is {} callback'.format(prefix, io, trigger))
1253
+ # self._append_to_file('{}def {}():'.format(prefix, name))
1254
+ # old_prefix = prefix
1255
+ # prefix = ' ' + prefix
1256
+ # statement = self.get_node('statement', root=block)
1257
+ # if statement:
1258
+ # self.parse(statement, prefix)
1259
+ # else:
1260
+ # self._append_to_file('{}pass'.format(prefix))
1261
+ # self._append_to_file('\n{}params[\'events\'][\'gpio\'].callbacks[\'IO{}\'][{}].append({})'.format(
1262
+ # old_prefix, io, 1 if trigger == 'HIGH' else 0, name))
1263
+ # self._append_to_file('{}if not params[\'events\'][\'gpio\'].alive:'.format(old_prefix))
1264
+ # self._append_to_file('{} params[\'events\'][\'gpio\'].start()'.format(old_prefix))
1265
+ #
1266
+ # if 'gpio' not in self._events:
1267
+ # name2 = 'EventGPIOThread'.format(io, trigger.capitalize())
1268
+ # self._insert_to_file(self.index, '\n\n# Define GPIO callback handle thread')
1269
+ # self._insert_to_file(self.index, 'class {}(threading.Thread):'.format(name2))
1270
+ # self._insert_to_file(self.index, ' def __init__(self, *args, **kwargs):'
1271
+ # '\n threading.Thread.__init__(self, *args, **kwargs)')
1272
+ # self._insert_to_file(self.index, ' self.daemon = True')
1273
+ # self._insert_to_file(self.index, ' self.alive = False')
1274
+ # self._insert_to_file(self.index, ' self.digital = [-1, -1]')
1275
+ # self._insert_to_file(self.index, ' self.callbacks = {\'IO0\': {0: [], 1: []}, '
1276
+ # '\'IO1\': {0: [], 1: []}}')
1277
+ # self._insert_to_file(self.index, '\n def run(self):')
1278
+ # self._insert_to_file(self.index, ' self.alive = True')
1279
+ # self._insert_to_file(self.index, ' while arm.connected and arm.error_code == 0:')
1280
+ # self._insert_to_file(self.index, ' _, digital = arm.get_tgpio_digital()')
1281
+ # self._insert_to_file(self.index, ' if _ == 0:')
1282
+ # self._insert_to_file(self.index, ' if digital[0] != self.digital[0]:')
1283
+ # self._insert_to_file(self.index, ' for callback in self.callbacks[\'IO0\'][digital[0]]:')
1284
+ # self._insert_to_file(self.index, ' callback()')
1285
+ # self._insert_to_file(self.index, ' if digital[1] != self.digital[1]:')
1286
+ # self._insert_to_file(self.index, ' for callback in self.callbacks[\'IO1\'][digital[1]]:')
1287
+ # self._insert_to_file(self.index, ' callback()')
1288
+ # self._insert_to_file(self.index, ' if _ == 0:')
1289
+ # self._insert_to_file(self.index, ' self.digital = digital')
1290
+ # self._insert_to_file(self.index, ' time.sleep(0.1)')
1291
+ # self._insert_to_file(self.index, '\nparams[\'events\'][\'gpio\'] = {}()'.format(name2))
1292
+ #
1293
+ # if 'gpio' not in self._events:
1294
+ # self._events['gpio'] = 2
1295
+ # else:
1296
+ # self._events['gpio'] += 1
1297
+ #
1298
+ # self._hasEvent = True
1299
+
1300
+ def _handle_procedures_defnoreturn(self, block, prefix='', arg_map=None):
1301
+ if not self._func_cls_exist:
1302
+ name = 'MyDef'
1303
+ self._insert_to_file(self.first_index, '\n\n# Define Mydef class')
1304
+ self._insert_to_file(self.first_index, 'class {}(object):'.format(name))
1305
+ self._insert_to_file(self.first_index,
1306
+ ' def __init__(self, *args, **kwargs):\n pass')
1307
+ self._func_cls_exist = True
1308
+
1309
+ field = self.get_node('field', block).text
1310
+ if not field:
1311
+ field = '1'
1312
+ if field not in self._funcs:
1313
+ name = 'function_{}'.format(self.func_index)
1314
+ else:
1315
+ name = self._funcs[field]
1316
+ self._is_insert = True
1317
+ try:
1318
+ args = self.get_nodes('arg', root=self.get_node('mutation', block))
1319
+ arg_map_ = None
1320
+
1321
+ self._append_to_file('\n @classmethod')
1322
+ if not args:
1323
+ self._append_to_file(' def {}(cls):'.format(name))
1324
+ else:
1325
+ arg_list = [arg.attrib['name'] for arg in args]
1326
+ # arg_map_ = {arg: arg for i, arg in enumerate(arg_list)}
1327
+ arg_map_ = {arg: 'arg_{}'.format(i + 1) for i, arg in enumerate(arg_list)}
1328
+ self._append_to_file(' def {}(cls, {}):'.format(name, ','.join(map(lambda x: arg_map_[x], arg_list))))
1329
+ # self._append_to_file(' def {}(cls):'.format(name))
1330
+ prefix = ' '
1331
+ comment = self.get_node('comment', block).text
1332
+ self._append_to_file('{}"""'.format(prefix))
1333
+ self._append_to_file('{}{}'.format(prefix, comment))
1334
+ self._append_to_file('{}"""'.format(prefix))
1335
+ statement = self.get_node('statement', root=block)
1336
+ if statement:
1337
+ self.parse(statement, prefix, arg_map=arg_map_)
1338
+ else:
1339
+ self._append_to_file('{}pass'.format(prefix))
1340
+ self._funcs[field] = name
1341
+ return arg_map_
1342
+ except:
1343
+ self._succeed = False
1344
+ finally:
1345
+ self._is_insert = False
1346
+
1347
+ def _handle_procedures_defreturn(self, block, prefix='', arg_map=None):
1348
+ arg_map_ = self._handle_procedures_defnoreturn(block, prefix)
1349
+ value = self.get_node('value', root=block)
1350
+ expression = self.__get_condition_expression(value, arg_map=arg_map_)
1351
+ self._is_insert = True
1352
+ prefix = ' '
1353
+ self._append_to_file('{}return {}'.format(prefix, expression))
1354
+ self._is_insert = False
1355
+
1356
+ def _handle_procedures_callnoreturn(self, block, prefix='', arg_map=None):
1357
+ mutation = self.get_node('mutation', block).attrib['name']
1358
+ if not mutation:
1359
+ mutation = '1'
1360
+ if mutation in self._funcs:
1361
+ name = self._funcs[mutation]
1362
+ else:
1363
+ name = 'function_{}'.format(self.func_index)
1364
+ args = self.get_nodes('arg', root=self.get_node('mutation', block))
1365
+ values = self.get_nodes('value', root=block)
1366
+ if args and values and len(args) == len(values):
1367
+ self._append_to_file('{}MyDef.{}({})'.format(prefix, name, ','.join([self.__get_condition_expression(val, arg_map=arg_map) for val in values])))
1368
+ else:
1369
+ self._append_to_file('{}MyDef.{}()'.format(prefix, name))
1370
+
1371
+ # self._append_to_file('{}MyDef.{}()'.format(prefix, name))
1372
+ self._funcs[mutation] = name
1373
+
1374
+ def _handle_procedures_ifreturn(self, block, prefix='', arg_map=None):
1375
+ self._is_insert = True
1376
+ values = self.get_nodes('value', block)
1377
+ expression = self.__get_condition_expression(values[0], arg_map=arg_map)
1378
+ self._append_to_file('{}if {}:'.format(prefix, expression))
1379
+ expression = self.__get_condition_expression(values[1], arg_map=arg_map)
1380
+ self._append_to_file('{} return {}'.format(prefix, expression))
1381
+ self._is_insert = False
1382
+
1383
+ def _handle_procedures_callreturn(self, block, prefix='', arg_map=None):
1384
+ self._handle_procedures_callnoreturn(block, prefix, arg_map=arg_map)
1385
+
1386
+ def _handle_variables_set(self, block, prefix='', arg_map=None):
1387
+ field = self.get_node('field', block).text
1388
+ value = self.get_node('value', root=block)
1389
+ expression = self.__get_condition_expression(value, arg_map=arg_map)
1390
+ # self._append_to_file('{}params[\'variables\'][\'{}\'] = {}'.format(prefix, field, expression))
1391
+ prefix = self.__check_is_quit(prefix)
1392
+ if arg_map and field in arg_map:
1393
+ self._append_to_file('{}{} = {}'.format(prefix, arg_map[field], expression))
1394
+ else:
1395
+ self._append_to_file('{}params[\'variables\'][\'{}\'] = {}'.format(prefix, field, expression))
1396
+ # self._append_to_file('{}if \'{}\' not in locals_keys and \'{}\' in locals():'.format(prefix, field, field))
1397
+ # self._append_to_file('{} {} = {}'.format(prefix, field, expression))
1398
+ # self._append_to_file('{}else:'.format(prefix))
1399
+ # self._append_to_file('{} params[\'variables\'][\'{}\'] = {}'.format(prefix, field, expression))
1400
+
1401
+ def _handle_math_change(self, block, prefix='', arg_map=None):
1402
+ field = self.get_node('field', block).text
1403
+ value = self.get_node('value', root=block)
1404
+ # shadow = self.get_node('shadow', root=value)
1405
+ # val = self.get_node('field', root=shadow).text
1406
+ val = self.__get_block_val(value)
1407
+ # self._append_to_file('{}params[\'variables\'][\'{}\'] += {}'.format(prefix, field, val))
1408
+
1409
+ prefix = self.__check_is_quit(prefix)
1410
+ if arg_map and field in arg_map:
1411
+ self._append_to_file('{}{} += {}'.format(prefix, arg_map[field], val))
1412
+ else:
1413
+ self._append_to_file('{}params[\'variables\'][\'{}\'] += {}'.format(prefix, field, val))
1414
+ # self._append_to_file('{}if \'{}\' not in locals_keys and \'{}\' in locals():'.format(prefix, field, field))
1415
+ # self._append_to_file('{} {} += {}'.format(prefix, field, val))
1416
+ # self._append_to_file('{}else:'.format(prefix))
1417
+ # self._append_to_file('{} params[\'variables\'][\'{}\'] += {}'.format(prefix, field, val))
1418
+
1419
+ def _handle_controls_repeat_ext(self, block, prefix='', arg_map=None):
1420
+ value = self.get_node('value', root=block)
1421
+ # times = self.get_nodes('field', root=value, descendant=True)[0].text
1422
+ times = self.__get_block_val(value, arg_map=arg_map)
1423
+ self._append_to_file('{}for i in range(int({})):'.format(prefix, times))
1424
+ prefix = ' ' + prefix
1425
+ self._append_to_file('{}if params[\'quit\']:'.format(prefix))
1426
+ self._append_to_file('{} break'.format(prefix))
1427
+ statement = self.get_node('statement', root=block)
1428
+ if statement:
1429
+ if self._highlight_callback:
1430
+ self._append_to_file('{}t1 = time.monotonic()'.format(prefix))
1431
+ self.parse(statement, prefix, arg_map=arg_map)
1432
+ if self._highlight_callback:
1433
+ self._append_to_file('{}interval = time.monotonic() - t1'.format(prefix))
1434
+ self._append_to_file('{}if interval < 0.001:'.format(prefix))
1435
+ self._append_to_file('{} time.sleep(0.001 - interval)'.format(prefix))
1436
+ else:
1437
+ self._append_to_file('{}pass'.format(prefix))
1438
+
1439
+ # def handle_controls_for(self, block, prefix=''):
1440
+ # print(block.attrib.get('disabled', False))
1441
+
1442
+ def _handle_controls_whileUntil(self, block, prefix='', arg_map=None):
1443
+ field = self.get_node('field', root=block)
1444
+ if field.text == 'WHILE':
1445
+ value = self.get_node('value', root=block)
1446
+ expression = self.__get_condition_expression(value, arg_map=arg_map)
1447
+ self._append_to_file('{}while {} and not params[\'quit\']:'.format(prefix, expression))
1448
+ elif field.text == 'UNTIL':
1449
+ value = self.get_node('value', root=block)
1450
+ expression = self.__get_condition_expression(value, arg_map=arg_map)
1451
+ self._append_to_file('{}while not {} and not params[\'quit\']:'.format(prefix, expression))
1452
+ prefix = ' ' + prefix
1453
+ statement = self.get_node('statement', root=block)
1454
+ if statement:
1455
+ if self._highlight_callback:
1456
+ self._append_to_file('{}t1 = time.monotonic()'.format(prefix))
1457
+ self.parse(statement, prefix, arg_map=arg_map)
1458
+ if self._highlight_callback:
1459
+ self._append_to_file('{}interval = time.monotonic() - t1'.format(prefix))
1460
+ self._append_to_file('{}if interval < 0.001:'.format(prefix))
1461
+ self._append_to_file('{} time.sleep(0.001 - interval)'.format(prefix))
1462
+ else:
1463
+ self._append_to_file('{}pass'.format(prefix))
1464
+
1465
+ def _handle_loop_run_forever(self, block, prefix='', arg_map=None):
1466
+ self._append_to_file('{}while True:'.format(prefix))
1467
+ prefix = ' ' + prefix
1468
+ self._append_to_file('{}if params[\'quit\']:'.format(prefix))
1469
+ self._append_to_file('{} break'.format(prefix))
1470
+ statement = self.get_node('statement', root=block)
1471
+ if statement:
1472
+ if self._highlight_callback:
1473
+ self._append_to_file('{}t1 = time.monotonic()'.format(prefix))
1474
+ self.parse(statement, prefix, arg_map=arg_map)
1475
+ if self._highlight_callback:
1476
+ self._append_to_file('{}interval = time.monotonic() - t1'.format(prefix))
1477
+ self._append_to_file('{}if interval < 0.001:'.format(prefix))
1478
+ self._append_to_file('{} time.sleep(0.001 - interval)'.format(prefix))
1479
+ else:
1480
+ self._append_to_file('{}pass'.format(prefix))
1481
+
1482
+ def _handle_loop_break(self, block, prefix='', arg_map=None):
1483
+ self._append_to_file('{}break'.format(prefix))
1484
+
1485
+ def _handle_tool_comment(self, block, prefix='', arg_map=None):
1486
+ field = self.get_node('field', block)
1487
+ self._append_to_file('{}# {}'.format(prefix, field.text))
1488
+ statement = self.get_node('statement', block)
1489
+ if statement:
1490
+ self.parse(statement, prefix, arg_map=arg_map)
1491
+
1492
+ def _handle_tool_app_comment(self, block, prefix='', arg_map=None):
1493
+ field = self.get_node('field', block)
1494
+ self._append_to_file('{}# [APP] {}'.format(prefix, field.text))
1495
+ statement = self.get_node('statement', block)
1496
+ if statement:
1497
+ self.parse(statement, prefix, arg_map=arg_map)
1498
+
1499
+ def _handle_tool_remark(self, block, prefix='', arg_map=None):
1500
+ field = self.get_node('field', block)
1501
+ self._append_to_file('{}# {}'.format(prefix, field.text))
1502
+
1503
+ def _handle_controls_if(self, block, prefix='', arg_map=None):
1504
+ values = self.get_nodes('value', root=block)
1505
+ statements = self.get_nodes('statement', root=block)
1506
+ old_prefix = prefix
1507
+ has_if = False
1508
+ for i, value in enumerate(values):
1509
+ prefix = old_prefix
1510
+ expression = self.__get_condition_expression(value, arg_map=arg_map)
1511
+ if not has_if:
1512
+ has_if = True
1513
+ self._append_to_file('{}if {}:'.format(prefix, expression))
1514
+ else:
1515
+ self._append_to_file('{}elif {}:'.format(prefix, expression))
1516
+ old_prefix = prefix
1517
+ prefix = ' ' + prefix
1518
+ statement = None
1519
+ for st in statements:
1520
+ if st.attrib['name'][2:] == value.attrib['name'][2:]:
1521
+ statement = st
1522
+ break
1523
+ if statement:
1524
+ self.parse(statement, prefix, arg_map=arg_map)
1525
+ else:
1526
+ self._append_to_file('{}pass'.format(prefix))
1527
+ for st in statements:
1528
+ if st.attrib['name'] == 'ELSE':
1529
+ if has_if:
1530
+ self._append_to_file('{}else:'.format(old_prefix))
1531
+ self.parse(st, old_prefix if not has_if else ' ' + old_prefix, arg_map=arg_map)
1532
+ break
1533
+
1534
+ # value = self.get_node('value', root=block)
1535
+ # expression = self.__get_condition_expression(value)
1536
+ # self._append_to_file('{}if {}:'.format(prefix, expression))
1537
+ # old_prefix = prefix
1538
+ # prefix = ' ' + prefix
1539
+ # statement_if = self.get_nodes('statement', root=block, name='DO0')
1540
+ # statement_else = self.get_nodes('statement', root=block, name='ELSE')
1541
+ # if statement_if:
1542
+ # self.parse(statement_if[0], prefix)
1543
+ # if statement_else:
1544
+ # self._append_to_file('{}else:'.format(old_prefix))
1545
+ # self.parse(statement_else[0], prefix)
1546
+ # else:
1547
+ # self._append_to_file('{}pass'.format(prefix))
1548
+
1549
+ # statement = self.get_node('statement', root=block)
1550
+ # if statement:
1551
+ # self.parse(statement, prefix)
1552
+ # else:
1553
+ # self._append_to_file('{}pass'.format(prefix))
1554
+
1555
+ def __get_condition_expression(self, value_block, arg_map=None):
1556
+ block = self.get_node('block', value_block)
1557
+ if block is None:
1558
+ shadow = self.get_node('shadow', root=value_block)
1559
+ return self.get_node('field', root=shadow).text
1560
+ if block.attrib['type'] == 'logic_boolean':
1561
+ return str(self.get_node('field', block).text == 'TRUE')
1562
+ elif block.attrib['type'] == 'logic_compare':
1563
+ op = self._ops.get(self.get_node('field', block).text)
1564
+ cond_a = 0
1565
+ cond_b = 0
1566
+ values = self.get_nodes('value', block)
1567
+ if len(values) > 0:
1568
+ cond_a = self.__get_condition_expression(values[0], arg_map=arg_map)
1569
+ if len(values) > 1:
1570
+ cond_b = self.__get_condition_expression(values[1], arg_map=arg_map)
1571
+ return '{} {} {}'.format(cond_a, op, cond_b)
1572
+ elif block.attrib['type'] == 'logic_operation':
1573
+ op = self.get_node('field', block).text.lower()
1574
+ cond_a = False
1575
+ cond_b = False
1576
+ values = self.get_nodes('value', block)
1577
+ if len(values) > 0:
1578
+ cond_a = self.__get_condition_expression(values[0], arg_map=arg_map)
1579
+ if len(values) > 1:
1580
+ cond_b = self.__get_condition_expression(values[1], arg_map=arg_map)
1581
+ return '{} {} {}'.format(cond_a, op, cond_b)
1582
+ elif block.attrib['type'] == 'logic_negate':
1583
+ value = self.get_node('value', root=block)
1584
+ return 'not ({})'.format(self.__get_condition_expression(value, arg_map=arg_map))
1585
+ elif block.attrib['type'] == 'gpio_get_digital':
1586
+ io = self.get_node('field', block).text
1587
+ return 'arm.get_tgpio_digital({})[{}]'.format(io, 1)
1588
+ elif block.attrib['type'] == 'gpio_get_analog':
1589
+ io = self.get_node('field', block).text
1590
+ return 'arm.get_tgpio_analog({})[{}]'.format(io, 1)
1591
+ elif block.attrib['type'] == 'gpio_get_controller_digital':
1592
+ io = self.get_node('field', block).text
1593
+ return 'arm.get_cgpio_digital({})[{}]'.format(io, 1)
1594
+ elif block.attrib['type'] == 'gpio_get_controller_digital_di':
1595
+ io = self.get_node('field', block).text
1596
+ return 'arm.get_cgpio_digital({})[{}]'.format(io, 1)
1597
+ elif block.attrib['type'] == 'gpio_get_controller_analog':
1598
+ io = self.get_node('field', block).text
1599
+ return 'arm.get_cgpio_analog({})[{}]'.format(io, 1)
1600
+
1601
+ elif block.attrib['type'] == 'gpio_get_ci':
1602
+ io = self.get_node('field', block).text
1603
+ return 'params[\'events\'][\'gpio\'].values[\'cgpio\'][\'digital\'][{}] if \'gpio\' in params[\'events\'] else 1'.format(io)
1604
+ elif block.attrib['type'] == 'gpio_get_co':
1605
+ io = self.get_node('field', block).text
1606
+ return 'params[\'events\'][\'gpio\'].values[\'cgpio\'][\'digital_o\'][{}] if \'gpio\' in params[\'events\'] else 0'.format(io)
1607
+ elif block.attrib['type'] == 'gpio_get_ai':
1608
+ io = self.get_node('field', block).text
1609
+ return 'params[\'events\'][\'gpio\'].values[\'cgpio\'][\'analog\'][{}] if \'gpio\' in params[\'events\'] else 0'.format(io)
1610
+ elif block.attrib['type'] == 'gpio_get_ao':
1611
+ io = self.get_node('field', block).text
1612
+ return 'params[\'events\'][\'gpio\'].values[\'cgpio\'][\'analog_o\'][{}] if \'gpio\' in params[\'events\'] else 0'.format(io)
1613
+ elif block.attrib['type'] == 'gpio_match_controller_digitals_bin':
1614
+ bin_val = self.get_node('field', block).text
1615
+ return 'params[\'events\'][\'gpio\'].cgpio_digitals_is_matchs_bin(\'{}\') if \'gpio\' in params[\'events\'] else False'.format(
1616
+ bin_val)
1617
+
1618
+ elif block.attrib['type'] == 'get_suction_cup':
1619
+ return 'arm.get_suction_cup()[{}]'.format(1)
1620
+ elif block.attrib['type'] == 'check_air_pump_state':
1621
+ fields = self.get_nodes('field', root=block)
1622
+ state = 1 if fields[0].text == 'ON' else 0
1623
+ timeout = float(fields[1].text)
1624
+ return 'arm.arm.check_air_pump_state({}, timeout={})'.format(state, timeout)
1625
+ elif block.attrib['type'] == 'check_bio_gripper_is_catch':
1626
+ fields = self.get_nodes('field', root=block)
1627
+ timeout = float(fields[0].text)
1628
+ return 'arm.arm.check_bio_gripper_is_catch(timeout={}) == True'.format(timeout)
1629
+ elif block.attrib['type'] == 'check_robotiq_is_catch':
1630
+ fields = self.get_nodes('field', root=block)
1631
+ timeout = float(fields[0].text)
1632
+ return 'arm.arm.check_robotiq_is_catch(timeout={}) == True'.format(timeout)
1633
+ elif block.attrib['type'] == 'math_number':
1634
+ val = self.get_node('field', block).text
1635
+ return val
1636
+ elif block.attrib['type'] == 'math_arithmetic':
1637
+ field = self.get_node('field', block).text
1638
+ values = self.get_nodes('value', block)
1639
+ if len(values) > 1:
1640
+ val_a = self.__get_block_val(values[0], arg_map=arg_map)
1641
+ val_b = self.__get_block_val(values[1], arg_map=arg_map)
1642
+ if field == 'ADD':
1643
+ return '({} + {})'.format(val_a, val_b)
1644
+ elif field == 'MINUS':
1645
+ return '({} - {})'.format(val_a, val_b)
1646
+ elif field == 'MULTIPLY':
1647
+ return '({} * {})'.format(val_a, val_b)
1648
+ elif field == 'DIVIDE':
1649
+ return '({} / {})'.format(val_a, val_b)
1650
+ elif field == 'POWER':
1651
+ return 'pow({}, {})'.format(val_a, val_b)
1652
+ elif block.attrib['type'] == 'math_number_property':
1653
+ field = self.get_node('field', block).text
1654
+ values = self.get_nodes('value', block)
1655
+ if len(values) >= 1:
1656
+ val_a = self.__get_block_val(values[0], arg_map=arg_map)
1657
+
1658
+ if field == 'EVEN':
1659
+ # 偶数
1660
+ return '{} % 2 == 0'.format(val_a)
1661
+ elif field == 'ODD':
1662
+ # 奇数
1663
+ return '{} % 2 == 1'.format(val_a)
1664
+ elif field == 'PRIME':
1665
+ # 质数
1666
+ return 'utils.is_prime({})'.format(val_a)
1667
+ elif field == 'WHOLE':
1668
+ return '{} % 1 == 0'.format(val_a)
1669
+ elif field == 'POSITIVE':
1670
+ # 正数
1671
+ return '{} > 0'.format(val_a)
1672
+ elif field == 'NEGATIVE':
1673
+ # 负数
1674
+ return '{} < 0'.format(val_a)
1675
+ elif field == 'DIVISIBLE_BY':
1676
+ # 可被整除
1677
+ if len(values) > 1:
1678
+ val_b = self.__get_block_val(values[1], arg_map=arg_map)
1679
+ else:
1680
+ val_b = 0
1681
+ return '{} % {} == 0'.format(val_a, val_b)
1682
+ elif block.attrib['type'] == 'math_random_int':
1683
+ values = self.get_nodes('value', block)
1684
+ if len(values) > 1:
1685
+ val_a = self.__get_block_val(values[0], arg_map=arg_map)
1686
+ val_b = self.__get_block_val(values[1], arg_map=arg_map)
1687
+ return 'random.randint({}, {})'.format(val_a, val_b)
1688
+ elif block.attrib['type'] == 'math_round':
1689
+ field = self.get_node('field', block).text
1690
+ values = self.get_nodes('value', block)
1691
+ if len(values) >= 1:
1692
+ val_a = self.__get_block_val(values[0], arg_map=arg_map)
1693
+ if field == 'ROUND':
1694
+ # 四舍五入
1695
+ return 'round({})'.format(val_a)
1696
+ elif field == 'ROUNDUP':
1697
+ # 上舍入
1698
+ return 'math.ceil({})'.format(val_a)
1699
+ elif field == 'ROUNDDOWN':
1700
+ # 下舍入
1701
+ return 'math.floor({})'.format(val_a)
1702
+ elif block.attrib['type'] == 'math_single':
1703
+ # 算术函数
1704
+ field = self.get_node('field', block).text
1705
+ values = self.get_nodes('value', block)
1706
+ if len(values) >= 1:
1707
+ val_a = self.__get_block_val(values[0], arg_map=arg_map)
1708
+ if field == 'ROOT':
1709
+ # 平方根
1710
+ return 'math.sqrt({})'.format(val_a)
1711
+ elif field == 'ABS':
1712
+ # 绝对值
1713
+ return 'abs({})'.format(val_a)
1714
+ elif field == 'NEG':
1715
+ # 相反数
1716
+ return '-{}'.format(val_a)
1717
+ elif field == 'LN':
1718
+ # ln
1719
+ return 'math.log({})'.format(val_a)
1720
+ elif field == 'LOG10':
1721
+ # log10
1722
+ return '(math.log({}) / math.log(10))'.format(val_a)
1723
+ elif field == 'EXP':
1724
+ # exp
1725
+ return 'math.exp({})'.format(val_a)
1726
+ elif field == 'POW10':
1727
+ # 10的多少次方
1728
+ return 'math.pow(10, {})'.format(val_a)
1729
+ elif block.attrib['type'] == 'math_trig':
1730
+ # 三角函数
1731
+ field = self.get_node('field', block).text
1732
+ values = self.get_nodes('value', block)
1733
+ if len(values) >= 1:
1734
+ val_a = self.__get_block_val(values[0], arg_map=arg_map)
1735
+ if field == 'SIN':
1736
+ return 'math.sin({})'.format(val_a)
1737
+ elif field == 'COS':
1738
+ return 'math.cos({})'.format(val_a)
1739
+ elif field == 'TAN':
1740
+ return 'math.tan({})'.format(val_a)
1741
+ elif field == 'ASIN':
1742
+ return 'math.asin({})'.format(val_a)
1743
+ elif field == 'ACOS':
1744
+ return 'math.acos({})'.format(val_a)
1745
+ elif field == 'ATAN':
1746
+ return 'math.atan({})'.format(val_a)
1747
+ elif block.attrib['type'] == 'math_constant':
1748
+ # 常量
1749
+ field = self.get_node('field', block).text
1750
+ if field == 'PI':
1751
+ return 'math.pi'
1752
+ elif field == 'E':
1753
+ return 'math.e'
1754
+ elif field == 'GOLDEN_RATIO':
1755
+ return '(1 + math.sqrt(5)) / 2'
1756
+ elif field == 'SQRT2':
1757
+ return 'math.sqrt(2)'
1758
+ elif field == 'SQRT1_2':
1759
+ return 'math.sqrt(0.5)'
1760
+ elif field == 'INFINITY':
1761
+ return 'math.inf'
1762
+ elif block.attrib['type'] == 'math_modulo':
1763
+ values = self.get_nodes('value', block)
1764
+ if len(values) > 1:
1765
+ val_a = self.__get_block_val(values[0], arg_map=arg_map)
1766
+ val_b = self.__get_block_val(values[1], arg_map=arg_map)
1767
+ return '{} % {}'.format(val_a, val_b)
1768
+ elif block.attrib['type'] == 'math_constrain':
1769
+ values = self.get_nodes('value', block)
1770
+ if len(values) > 2:
1771
+ val_a = self.__get_block_val(values[0], arg_map=arg_map)
1772
+ val_b = self.__get_block_val(values[1], arg_map=arg_map)
1773
+ val_c = self.__get_block_val(values[2], arg_map=arg_map)
1774
+ return 'min(max({}, {}), {})'.format(val_a, val_b, val_c)
1775
+ # elif block.attrib['type'] == 'math_round':
1776
+ # pass
1777
+ elif block.attrib['type'] == 'variables_get':
1778
+ field = self.get_node('field', block).text
1779
+ # return '(params[\'variables\'].get(\'{}\', 0) if \'{}\' in locals_keys or \'{}\' not in locals() else {})'.format(field, field, field, field)
1780
+ if arg_map and field in arg_map:
1781
+ return '{}'.format(arg_map[field])
1782
+ else:
1783
+ return 'params[\'variables\'].get(\'{}\', 0)'.format(field)
1784
+ elif block.attrib['type'] == 'move_var':
1785
+ val = self.get_node('field', block).text
1786
+ return val
1787
+ elif block.attrib['type'] == 'tool_get_date':
1788
+ return 'datetime.datetime.now()'
1789
+ elif block.attrib['type'] == 'tool_combination':
1790
+ field = self.get_node('field', block).text
1791
+ values = self.get_nodes('value', block)
1792
+ var1 = self.__get_condition_expression(values[0], arg_map=arg_map)
1793
+ var2 = self.__get_condition_expression(values[1], arg_map=arg_map)
1794
+ return '\'{{}}{{}}{{}}\'.format({}, \'{}\', {})'.format(var1, field, var2)
1795
+ elif block.attrib['type'] == 'procedures_callreturn':
1796
+ mutation = self.get_node('mutation', block).attrib['name']
1797
+ if not mutation:
1798
+ mutation = '1'
1799
+ if mutation in self._funcs:
1800
+ name = self._funcs[mutation]
1801
+ else:
1802
+ name = 'function_{}'.format(self.func_index)
1803
+
1804
+ args = self.get_nodes('arg', root=self.get_node('mutation', block))
1805
+ values = self.get_nodes('value', root=block)
1806
+ if args and values and len(args) == len(values):
1807
+ return 'MyDef.{}({})'.format(name, ','.join(
1808
+ [self.__get_condition_expression(val, arg_map=arg_map) for val in values]))
1809
+ else:
1810
+ return 'MyDef.{}()'.format(name)
1811
+ # return 'MyDef.{}()'.format(name)
1812
+
1813
+ def __get_block_val(self, block, arg_map=None):
1814
+ block_v = self.get_node('block', root=block)
1815
+ if block_v is not None:
1816
+ val = self.__get_condition_expression(block, arg_map=arg_map)
1817
+ else:
1818
+ shadow = self.get_node('shadow', root=block)
1819
+ val = self.get_node('field', root=shadow).text
1820
+ return val
1821
+
1822
+ def _handle_set_line_track(self, block, prefix='', arg_map=None):
1823
+ fields = self.get_nodes('field', root=block)
1824
+ if fields is not None:
1825
+ pos = fields[0].text
1826
+ speed = fields[1].text
1827
+ wait = True
1828
+ else:
1829
+ values = self.get_nodes('value', root=block)
1830
+ pos = self.get_nodes('field', root=values[0], descendant=True)[0].text
1831
+ speed = self.get_nodes('field', root=values[1], descendant=True)[0].text
1832
+ wait = True
1833
+ if self._show_comment:
1834
+ self._append_to_file('{}# set line track position and '.format(prefix, 'wait' if wait else 'no wait'))
1835
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
1836
+ self._append_to_file('{} code = arm.set_linear_track_pos({}, speed={}, wait={}, auto_enable=True)'.format(prefix, pos, speed, wait))
1837
+ self._append_to_file('{} if code != 0:'.format(prefix))
1838
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
1839
+ self._append_to_file('{} pprint(\'set_linear_track_pos, code={{}}\'.format(code))'.format(prefix))
1840
+
1841
+ def _handle_set_line_track_origin(self, block, prefix='', arg_map=None):
1842
+ if self._show_comment:
1843
+ self._append_to_file('{}# set_line_track_origin(wait=True, auto_enable=True)'.format(prefix))
1844
+ self._append_to_file('{}if arm.error_code == 0 and not params[\'quit\']:'.format(prefix))
1845
+ self._append_to_file('{} code = arm.set_linear_track_back_origin(wait=True, auto_enable=True)'.format(prefix))
1846
+ self._append_to_file('{} code = arm.set_linear_track_enable(True)'.format(prefix))
1847
+ self._append_to_file('{} if code != 0:'.format(prefix))
1848
+ self._append_to_file('{} params[\'quit\'] = True'.format(prefix))
1849
+ self._append_to_file('{} pprint(\'line_track_back_origin, code={{}}\'.format(code))'.format(prefix))
1850
+
1851
+
1852
+
1853
+ if __name__ == '__main__':
1854
+ blockly = BlocklyTool('C:\\Users\\ufactory\\.UFACTORY\projects\\test\\xarm6\\app\\myapp\local_test_1\\app.xml')
1855
+ # blockly = BlocklyTool('C:\\Users\\ufactory\\.UFACTORY\projects\\test\\xarm6\\app\\myapp\\app_template\\app.xml')
1856
+ # blockly = BlocklyTool('C:\\Users\\ufactory\\.UFACTORY\projects\\test\\xarm6\\app\\myapp\\test_gpio\\app.xml')
1857
+ # blockly = BlocklyTool('C:\\Users\\ufactory\\.UFACTORY\projects\\test\\xarm7\\app\\myapp\\pour_water\\app.xml')
1858
+ # blockly = BlocklyTool('C:\\Users\\ufactory\\.UFACTORY\projects\\test\\xarm7\\app\\myapp\\233\\app.xml')
1859
+ import os
1860
+ target_path = os.path.join(os.path.expanduser('~'), '.UFACTORY', 'app', 'tmp')
1861
+ if not os.path.exists(target_path):
1862
+ os.makedirs(target_path)
1863
+ target_file = os.path.join(target_path, 'blockly_app.py')
1864
+ blockly.to_python(target_file, arm='192.168.1.145')