Skip to content

Commit 45f82f9

Browse files
committed
Merge branch 'develop' of 192.168.1.19:vinman/xArm-Python-SDK into develop
2 parents 7573aa4 + 967bb68 commit 45f82f9

File tree

3 files changed

+66
-6
lines changed

3 files changed

+66
-6
lines changed

xarm/tools/blockly/_blockly_handler.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,13 @@ def __init__(self, xml_path):
2929
self._listen_tgpio_analog = False
3030
self._listen_cgpio_state = False
3131
self._listen_count = False
32+
self._listen_holding = False
3233
self._tgpio_digital_callbacks = []
3334
self._tgpio_analog_callbacks = []
3435
self._cgpio_digital_callbacks = []
3536
self._cgpio_analog_callbacks = []
3637
self._count_callbacks= []
38+
self._holding_callbacks= []
3739

3840
self.is_run_linear_track = False
3941
self._is_run_blockly = False
@@ -783,7 +785,34 @@ def __handle_gpio_event(self, gpio_type, block, indent=0, arg_map=None):
783785
trigger = fields[2].text
784786
self._cgpio_analog_callbacks.append(name)
785787
self._append_main_code('self._cgpio_analog_callbacks.append({{\'io\': {}, \'trigger\': {}, \'op\': \'{}\', \'callback\': self.{}}})'.format(io, trigger, op, name), indent=indent+2)
788+
789+
def _handle_event_get_holding_condition(self, block, indent=0, arg_map=None):
790+
fields = self._get_nodes('field', root=block)
791+
addr = int(fields[0].text.replace(' ', '').replace('0x','').replace(',','').replace('\xa0', ''), 16)
792+
trigger = int(fields[1].text.replace(' ', '').replace('0x','').replace(',','').replace('\xa0', ''), 16)
786793

794+
num = 1
795+
796+
self._is_main_run_code = False
797+
num = len(self._holding_callbacks) + 1
798+
name = 'holding_is_changed_callback_{}'.format(num)
799+
self._append_main_code('# Define Holding Registers {} Value is {} callback'.format(
800+
addr, trigger), indent=1)
801+
802+
self._append_main_code('def {}(self):'.format(name), indent=1)
803+
statement = self._get_node('statement', root=block)
804+
if statement:
805+
self._parse_block(statement, indent, arg_map=arg_map)
806+
else:
807+
self._append_main_code('pass', indent=indent + 3)
808+
self._append_main_code('')
809+
810+
self._is_main_run_code = True
811+
self._holding_callbacks.append(name)
812+
self._append_main_code(
813+
'self._holding_callbacks.append({{\'trigger\': \'{}\', \'addr\': \'{}\', \'callback\': self.{}}})'.format(
814+
trigger, addr, name), indent=indent + 2)
815+
787816
def __handle_count_event(self, count_type, block, indent=0, arg_map=None):
788817
fields = self._get_nodes('field', root=block)
789818
op = fields[0].text

xarm/tools/blockly/_blockly_tool.py

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def _init_robot_main_run_codes(self):
9191

9292
def _finish_robot_main_run_codes(self, error_exit=True, stop_exit=True):
9393
if self._listen_tgpio_digital or self._listen_tgpio_analog or self._listen_cgpio_state \
94-
or len(self._tgpio_digital_callbacks) or len(self._tgpio_analog_callbacks) or len(self._cgpio_digital_callbacks) or len(self._cgpio_analog_callbacks):
94+
or len(self._tgpio_digital_callbacks) or len(self._tgpio_analog_callbacks) or len(self._cgpio_digital_callbacks) or len(self._cgpio_analog_callbacks) or len(self._count_callbacks) or len(self._holding_callbacks):
9595
self._append_main_code(' # Event Loop', indent=-1)
9696
self._append_main_code(' while self.is_alive:', indent=-1)
9797
self._append_main_code(' time.sleep(0.5)', indent=-1)
@@ -153,14 +153,18 @@ def _init_robot_main_class_codes(self, init=True, wait_seconds=1, mode=0, state=
153153
self._append_main_init_code(' self._cgpio_analog_callbacks = []')
154154
if len(self._count_callbacks):
155155
self._append_main_init_code(' self._count_callbacks = []')
156+
if len(self._holding_callbacks):
157+
self._append_main_init_code(' self._holding_callbacks = []')
156158
if self._listen_cgpio_state or len(self._cgpio_digital_callbacks) or len(self._cgpio_analog_callbacks):
157159
self._append_main_init_code(' self._cgpio_state = None')
158160

159161
if self._listen_count or len(self._count_callbacks):
160162
self._append_main_init_code(' self._counter_val = None')
161-
163+
if self._listen_holding or len(self._holding_callbacks):
164+
self._append_main_init_code(' self._holding_dict = {}')
165+
162166
if len(self._tgpio_digital_callbacks) or len(self._tgpio_analog_callbacks) or len(self._cgpio_digital_callbacks) or len(self._cgpio_analog_callbacks)\
163-
or len(self._count_callbacks):
167+
or len(self._count_callbacks) or len(self._holding_callbacks):
164168
self._append_main_init_code(' self._callback_in_thread = kwargs.get(\'callback_in_thread\', True)')
165169
self._append_main_init_code(' self._callback_que = queue.Queue()')
166170

@@ -170,20 +174,26 @@ def _init_robot_main_class_codes(self, init=True, wait_seconds=1, mode=0, state=
170174
self._append_main_init_code(' gpio_t.start()')
171175

172176
if len(self._tgpio_digital_callbacks) or len(self._tgpio_analog_callbacks) or len(self._cgpio_digital_callbacks) or len(self._cgpio_analog_callbacks)\
173-
or len(self._count_callbacks):
177+
or len(self._count_callbacks) or len(self._holding_callbacks):
174178
self._append_main_init_code(' callback_t = threading.Thread(target=self._event_callback_handle_thread, daemon=True)')
175179
self._append_main_init_code(' callback_t.start()')
176180

177181
if self._listen_count or len(self._count_callbacks):
178182
self._append_main_init_code(
179183
' count_t = threading.Thread(target=self._listen_count_thread, daemon=True)')
180184
self._append_main_init_code(' count_t.start()')
181-
185+
186+
if self._holding_callbacks or len(self._holding_callbacks):
187+
self._append_main_init_code(
188+
' holding_t = threading.Thread(target=self._listen_holding_thread, daemon=True)')
189+
self._append_main_init_code(' holding_t.start()')
190+
182191
self._append_main_init_code('')
183192

184193
self.__define_callback_thread_func()
185194
self.__define_listen_gpio_thread_func()
186195
self.__define_listen_count_thread_func()
196+
self.__define_listen_holding_registers_thread_func()
187197
self.__define_run_blockly_func()
188198
self.__define_robot_init_func(init=init, wait_seconds=wait_seconds, mode=mode, state=state, error_exit=error_exit, stop_exit=stop_exit)
189199
self.__define_error_warn_changed_callback_func(error_exit=error_exit)
@@ -238,7 +248,7 @@ def __define_property(self):
238248

239249
def __define_callback_thread_func(self):
240250
# Define callback thread function
241-
if len(self._tgpio_digital_callbacks) or len(self._tgpio_analog_callbacks) or len(self._cgpio_digital_callbacks) or len(self._cgpio_analog_callbacks) or len(self._count_callbacks):
251+
if len(self._tgpio_digital_callbacks) or len(self._tgpio_analog_callbacks) or len(self._cgpio_digital_callbacks) or len(self._cgpio_analog_callbacks) or len(self._count_callbacks) or len(self._holding_callbacks):
242252
self._append_main_init_code(' def _event_callback_handle_thread(self):')
243253
self._append_main_init_code(' while self.alive:')
244254
self._append_main_init_code(' try:')
@@ -328,6 +338,23 @@ def __define_listen_count_thread_func(self):
328338
self._append_main_init_code(' self._callback_que.put(item[\'callback\'])')
329339
self._append_main_init_code(' self._counter_val = values')
330340
self._append_main_init_code(' time.sleep(0.01)\n')
341+
342+
def __define_listen_holding_registers_thread_func(self):
343+
# Define listen holding registers value thread function
344+
if self._listen_holding or len(self._holding_callbacks):
345+
self._append_main_init_code(' def _listen_holding_thread(self):')
346+
347+
self._append_main_init_code(' while self.alive:')
348+
self._append_main_init_code(' for index, item in enumerate(self._holding_callbacks):')
349+
self._append_main_init_code(' for i in range(2):')
350+
self._append_main_init_code(' _, values = self._arm.read_holding_registers(int(item[\'addr\']), 1)')
351+
self._append_main_init_code(
352+
' if _ == 0 and self._holding_dict.get(index, None) is not None:')
353+
self._append_main_init_code(
354+
' if eval(\'{} == {}\'.format(values[0], item[\'trigger\'])) and not eval(\'{} == {}\'.format(self._holding_dict[index], item[\'trigger\'])):')
355+
self._append_main_init_code(' self._callback_que.put(item[\'callback\'])')
356+
self._append_main_init_code(' self._holding_dict[index] = values[0] if _ == 0 else self._holding_dict.get(index, None)')
357+
self._append_main_init_code(' time.sleep(0.01)\n')
331358

332359
def __define_run_blockly_func(self):
333360
if self._is_run_blockly and not self._is_exec:

xarm/x3/xarm.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1259,6 +1259,10 @@ def __handle_gcode_h(num):
12591259
ret = self.set_servo_zero(servo_id=servo_id)
12601260
elif num == 106: # H106 get_servo_debug_msg, ex: H106
12611261
ret = self.get_servo_debug_msg()
1262+
elif num == 114: # H114 servo_error_addr_r32, ex H114 I{id} D{addr}
1263+
servo_id = gcode_p.get_id_num(command, default=0)
1264+
addr = gcode_p.get_addr(command)
1265+
ret = self.arm_cmd.servo_error_addr_r32(axis=servo_id, addr=addr)
12621266
else:
12631267
logger.debug('command {} is not exist'.format(command))
12641268
ret = APIState.CMD_NOT_EXIST, 'command {} is not exist'.format(command)

0 commit comments

Comments
 (0)