Bug Report – xArm 5 Unexpected Looping Motion (v2.6.0 & v2.7.0)

Hi Maulana,

Please share the Blockly or Python script with us. What is the current firmware version?
Can this be reproduced every time, or is it random?

Best regards,
Minna

I’m using firmware v2.6.0 and using Blockly. But because I can’t provide the Blockly script, I changed it to Python. I have 2 Python scripts.

import sys
import math
import time
import queue
import datetime
import random
import traceback
import threading
from xarm import version
from xarm.wrapper import XArmAPI


class RobotMain(object):
    """Robot Main Class"""
    def __init__(self, robot, **kwargs):
        self.alive = True
        self._arm = robot
        self._ignore_exit_state = False
        self._tcp_speed = 100
        self._tcp_acc = 2000
        self._angle_speed = 20
        self._angle_acc = 500
        self._vars = {}
        self._funcs = {}
        self._robot_init()

    def _start_run_blockly(self, fileName, times):
       for i in range(times):
           code = self._arm.run_blockly_app(fileName, init=False, is_exec=True, axis_type=[self._arm.axis, self._arm.device_type])

    # Robot init
    def _robot_init(self):
        self._arm.clean_warn()
        self._arm.clean_error()
        self._arm.motion_enable(True)
        self._arm.set_mode(0)
        self._arm.set_state(0)
        time.sleep(1)
        self._arm.register_error_warn_changed_callback(self._error_warn_changed_callback)
        self._arm.register_state_changed_callback(self._state_changed_callback)

    # Register error/warn changed callback
    def _error_warn_changed_callback(self, data):
        if data and data['error_code'] != 0:
            self.alive = False
            self.pprint('err={}, quit'.format(data['error_code']))
            self._arm.release_error_warn_changed_callback(self._error_warn_changed_callback)

    # Register state changed callback
    def _state_changed_callback(self, data):
        if not self._ignore_exit_state and data and data['state'] == 4:
            self.alive = False
            self.pprint('state=4, quit')
            self._arm.release_state_changed_callback(self._state_changed_callback)

    def _check_code(self, code, label):
        if not self.is_alive or code != 0:
            self.alive = False
            ret1 = self._arm.get_state()
            ret2 = self._arm.get_err_warn_code()
            self.pprint('{}, code={}, connected={}, state={}, error={}, ret1={}. ret2={}'.format(label, code, self._arm.connected, self._arm.state, self._arm.error_code, ret1, ret2))
        return self.is_alive

    @staticmethod
    def pprint(*args, **kwargs):
        try:
            stack_tuple = traceback.extract_stack(limit=2)[0]
            print('[{}][{}] {}'.format(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), stack_tuple[1], ' '.join(map(str, args))))
        except:
            print(*args, **kwargs)

    @property
    def arm(self):
        return self._arm

    @property
    def VARS(self):
        return self._vars

    @property
    def FUNCS(self):
        return self._funcs

    @property
    def is_alive(self):
        if self.alive and self._arm.connected and self._arm.error_code == 0:
            if self._ignore_exit_state:
                return True
            if self._arm.state == 5:
                cnt = 0
                while self._arm.state == 5 and cnt < 5:
                    cnt += 1
                    time.sleep(0.1)
            return self._arm.state < 4
        else:
            return False

    # Robot Main Run
    def run(self):
        try:
            code = self._arm.set_bio_gripper_enable(True)
            if not self._check_code(code, 'set_bio_gripper_enable'):
                return
            code = self._arm.set_bio_gripper_position(pos=150, speed=3000, force=100, wait=True)
            if not self._check_code(code, 'open_bio_gripper'):
                return
            self._angle_speed = 100
            self._angle_acc = 50
            code = self._arm.set_servo_angle(angle=[168.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=1.0)
            if not self._check_code(code, 'set_servo_angle'):
                return
            code = self._arm.set_servo_angle(angle=[226.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=1.0)
            if not self._check_code(code, 'set_servo_angle'):
                return
            code = self._arm.set_servo_angle(angle=[230.1, 11.4, -18.3, -82.0, -90.5], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=1.0)
            if not self._check_code(code, 'set_servo_angle'):
                return
            code = self._arm.set_servo_angle(angle=[269.4, 8.0, -19.4, -77.6, -89.8], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=1.0)
            if not self._check_code(code, 'set_servo_angle'):
                return
            code = self._arm.set_bio_gripper_position(pos=73, speed=3000, force=100, wait=True)
            if not self._check_code(code, 'open_bio_gripper'):
                return
            if self._arm.arm.check_bio_gripper_is_catch(timeout=3.0):
                code = self._arm.set_servo_angle(angle=[269.4, 8.0, -19.4, -77.6, -50.7], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=1.0)
                if not self._check_code(code, 'set_servo_angle'):
                    return
                code = self._arm.set_servo_angle(angle=[226.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=1.0)
                if not self._check_code(code, 'set_servo_angle'):
                    return
                self._start_run_blockly(fileName="scan_caping", times=1)
            else:
                code = self._arm.set_bio_gripper_position(pos=150, speed=3000, force=100, wait=True)
                if not self._check_code(code, 'open_bio_gripper'):
                    return
                code = self._arm.set_servo_angle(angle=[269.6, 32.0, -60.9, -60.1, -89.8], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=1.0)
                if not self._check_code(code, 'set_servo_angle'):
                    return
                code = self._arm.set_bio_gripper_position(pos=72, speed=3000, force=100, wait=True)
                if not self._check_code(code, 'open_bio_gripper'):
                    return
                if self._arm.arm.check_bio_gripper_is_catch(timeout=3.0):
                    code = self._arm.set_servo_angle(angle=[269.6, 32.0, -60.9, -60.1, -50.7], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=1.0)
                    if not self._check_code(code, 'set_servo_angle'):
                        return
                    code = self._arm.set_servo_angle(angle=[226.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=1.0)
                    if not self._check_code(code, 'set_servo_angle'):
                        return
                    self._start_run_blockly(fileName="scan_caping", times=1)
                else:
                    code = self._arm.set_bio_gripper_position(pos=150, speed=3000, force=100, wait=True)
                    if not self._check_code(code, 'open_bio_gripper'):
                        return
                    code = self._arm.set_servo_angle(angle=[269.8, 69.4, -130.9, -25.9, -89.7], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=1.0)
                    if not self._check_code(code, 'set_servo_angle'):
                        return
                    code = self._arm.set_bio_gripper_position(pos=74, speed=3000, force=100, wait=True)
                    if not self._check_code(code, 'open_bio_gripper'):
                        return
                    if self._arm.arm.check_bio_gripper_is_catch(timeout=3.0):
                        code = self._arm.set_servo_angle(angle=[269.8, 69.4, -130.9, -25.9, -50.7], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=1.0)
                        if not self._check_code(code, 'set_servo_angle'):
                            return
                        code = self._arm.set_servo_angle(angle=[226.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=1.0)
                        if not self._check_code(code, 'set_servo_angle'):
                            return
                        self._start_run_blockly(fileName="scan_caping", times=1)
                    else:
                        code = self._arm.set_bio_gripper_position(pos=150, speed=3000, force=100, wait=True)
                        if not self._check_code(code, 'open_bio_gripper'):
                            return
                        code = self._arm.set_servo_angle(angle=[247.6, 46.2, -86.6, -49.6, -89.8], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=1.0)
                        if not self._check_code(code, 'set_servo_angle'):
                            return
                        code = self._arm.set_servo_angle(angle=[226.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=1.0)
                        if not self._check_code(code, 'set_servo_angle'):
                            return
                        code = self._arm.set_servo_angle(angle=[168.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=1.0)
                        if not self._check_code(code, 'set_servo_angle'):
                            return
        except Exception as e:
            self.pprint('MainException: {}'.format(e))
        finally:
            self.alive = False
            self._arm.release_error_warn_changed_callback(self._error_warn_changed_callback)
            self._arm.release_state_changed_callback(self._state_changed_callback)


if __name__ == '__main__':
    RobotMain.pprint('xArm-Python-SDK Version:{}'.format(version.__version__))
    arm = XArmAPI('192.168.1.224', baud_checkset=False)
    time.sleep(0.5)
    robot_main = RobotMain(arm)
    robot_main.run()
import sys
import math
import time
import queue
import datetime
import random
import traceback
import threading
from xarm import version
from xarm.wrapper import XArmAPI


class RobotMain(object):
    """Robot Main Class"""
    def __init__(self, robot, **kwargs):
        self.alive = True
        self._arm = robot
        self._ignore_exit_state = False
        self._tcp_speed = 100
        self._tcp_acc = 2000
        self._angle_speed = 20
        self._angle_acc = 500
        self._vars = {}
        self._funcs = {}
        self._robot_init()
        self._cgpio_digital_callbacks = []
        self._cgpio_state = None
        self._callback_in_thread = kwargs.get('callback_in_thread', True)
        self._callback_que = queue.Queue()
        gpio_t = threading.Thread(target=self._listen_gpio_thread, daemon=True)
        gpio_t.start()
        callback_t = threading.Thread(target=self._event_callback_handle_thread, daemon=True)
        callback_t.start()

    def _event_callback_handle_thread(self):
        while self.alive:
            try:
                callback = self._callback_que.get(timeout=1)
                callback() if not self._callback_in_thread else threading.Thread(target=callback, daemon=True).start()
            except queue.Empty:
                pass
            except Exception as e:
                self.pprint(e)

    def _listen_gpio_thread(self):
        _, values = self._arm.get_cgpio_state()
        cgpio_digitals = [values[3] >> i & 0x0001 if values[10][i] in [0, 255] else 1 for i in range(len(values[10]))] if _ == 0 else [0] * 16
        while self.alive:
            _, values = self._arm.get_cgpio_state()
            if _ == 0 and self._cgpio_state is not None and self._cgpio_state != values:
                digitals = [values[3] >> i & 0x0001 if values[10][i] in [0, 255] else 1 for i in range(len(values[10]))]
                for item in self._cgpio_digital_callbacks:
                    for io in range(len(digitals)):
                        if item['io'] == io and eval('{} {} {}'.format(digitals[io], item['op'], item['trigger'])) and not eval('{} {} {}'.format(cgpio_digitals[io], item['op'], item['trigger'])):
                            self._callback_que.put(item['callback'])
                cgpio_digitals = digitals
            self._cgpio_state = values if _ == 0 else self._cgpio_state
            time.sleep(0.01)

    def _start_run_blockly(self, fileName, times):
       for i in range(times):
           code = self._arm.run_blockly_app(fileName, init=False, is_exec=True, axis_type=[self._arm.axis, self._arm.device_type])

    # Robot init
    def _robot_init(self):
        self._arm.clean_warn()
        self._arm.clean_error()
        self._arm.motion_enable(True)
        self._arm.set_mode(0)
        self._arm.set_state(0)
        time.sleep(1)
        self._arm.register_error_warn_changed_callback(self._error_warn_changed_callback)
        self._arm.register_state_changed_callback(self._state_changed_callback)

    # Register error/warn changed callback
    def _error_warn_changed_callback(self, data):
        if data and data['error_code'] != 0:
            self.alive = False
            self.pprint('err={}, quit'.format(data['error_code']))
            self._arm.release_error_warn_changed_callback(self._error_warn_changed_callback)

    # Register state changed callback
    def _state_changed_callback(self, data):
        if not self._ignore_exit_state and data and data['state'] == 4:
            self.alive = False
            self.pprint('state=4, quit')
            self._arm.release_state_changed_callback(self._state_changed_callback)

    def _check_code(self, code, label):
        if not self.is_alive or code != 0:
            self.alive = False
            ret1 = self._arm.get_state()
            ret2 = self._arm.get_err_warn_code()
            self.pprint('{}, code={}, connected={}, state={}, error={}, ret1={}. ret2={}'.format(label, code, self._arm.connected, self._arm.state, self._arm.error_code, ret1, ret2))
        return self.is_alive

    @staticmethod
    def pprint(*args, **kwargs):
        try:
            stack_tuple = traceback.extract_stack(limit=2)[0]
            print('[{}][{}] {}'.format(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), stack_tuple[1], ' '.join(map(str, args))))
        except:
            print(*args, **kwargs)

    @property
    def arm(self):
        return self._arm

    @property
    def VARS(self):
        return self._vars

    @property
    def FUNCS(self):
        return self._funcs

    @property
    def is_alive(self):
        if self.alive and self._arm.connected and self._arm.error_code == 0:
            if self._ignore_exit_state:
                return True
            if self._arm.state == 5:
                cnt = 0
                while self._arm.state == 5 and cnt < 5:
                    cnt += 1
                    time.sleep(0.1)
            return self._arm.state < 4
        else:
            return False

    # Define Contoller GPIO-5 DIGITAL is LOW callback
    def controller_gpio_5_digital_is_changed_callback_1(self):
        self._angle_speed = 80
        self._angle_acc = 50
        code = self._arm.set_bio_gripper_enable(True)
        if not self._check_code(code, 'set_bio_gripper_enable'):
            return
        code = self._arm.set_servo_angle(angle=[168.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        code = self._arm.set_servo_angle(angle=[166.2, 51.2, -72.3, 19.8, -11.0], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        code = self._arm.set_bio_gripper_position(pos=77, speed=4000, force=100, wait=False)
        if not self._check_code(code, 'open_bio_gripper'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_servo_angle(angle=[166.7, 50.1, -72.5, 21.1, -10.5], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_servo_angle(angle=[168.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_servo_angle(angle=[89.1, -46.7, 8.2, 38.5, -0.8], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_servo_angle(angle=[89.1, 32.7, -53.7, 20.8, 0.2], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_bio_gripper_position(pos=150, speed=4000, force=100, wait=False)
        if not self._check_code(code, 'open_bio_gripper'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_servo_angle(angle=[89.1, -46.7, 8.2, 38.5, -0.8], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return

    # Define Contoller GPIO-6 DIGITAL is LOW callback
    def controller_gpio_6_digital_is_changed_callback_2(self):
        self._angle_speed = 100
        self._angle_acc = 50
        code = self._arm.set_bio_gripper_enable(True)
        if not self._check_code(code, 'set_bio_gripper_enable'):
            return
        code = self._arm.set_servo_angle(angle=[168.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_servo_angle(angle=[166.2, 51.2, -72.3, 19.8, -11.0], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_bio_gripper_position(pos=78, speed=4000, force=100, wait=True)
        if not self._check_code(code, 'open_bio_gripper'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_servo_angle(angle=[166.7, 50.1, -72.5, 21.1, -10.5], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_servo_angle(angle=[168.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_servo_angle(angle=[117.7, -46.7, 8.0, 38.5, -0.8], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_servo_angle(angle=[116.1, 25.2, -72.4, 47.2, -0.8], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_bio_gripper_position(pos=150, speed=4000, force=100, wait=False)
        if not self._check_code(code, 'open_bio_gripper'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_servo_angle(angle=[117.7, -46.7, 8.0, 38.5, -0.8], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        self._start_run_blockly(fileName="botol_to_scanner", times=1)

    # Define Contoller GPIO-7 DIGITAL is LOW callback
    def controller_gpio_7_digital_is_changed_callback_3(self):
        self._angle_speed = 100
        self._angle_acc = 50
        code = self._arm.set_bio_gripper_enable(True)
        if not self._check_code(code, 'set_bio_gripper_enable'):
            return
        code = self._arm.set_servo_angle(angle=[89.1, -46.7, 8.2, 38.5, -0.8], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_servo_angle(angle=[89.1, 32.7, -53.7, 20.8, 0.2], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_bio_gripper_position(pos=77, speed=4000, force=100, wait=False)
        if not self._check_code(code, 'open_bio_gripper'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_servo_angle(angle=[89.1, -46.7, 8.2, 38.5, -0.8], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_servo_angle(angle=[28.1, -46.7, 8.2, 38.5, -4.7], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=1.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_servo_angle(angle=[41.6, 21.6, -48.9, 25.6, 44.4], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_bio_gripper_position(pos=150, speed=4000, force=100, wait=False)
        if not self._check_code(code, 'open_bio_gripper'):
            return
        for i in range(10):
            time.sleep(0.1)
            if not self.is_alive:
                return
        code = self._arm.set_servo_angle(angle=[28.1, -46.7, 8.2, 38.5, -4.7], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
        if not self._check_code(code, 'set_servo_angle'):
            return

    # Robot Main Run
    def run(self):
        try:
            self._angle_speed = 100
            self._angle_acc = 50
            code = self._arm.set_bio_gripper_enable(True)
            if not self._check_code(code, 'set_bio_gripper_enable'):
                return
            code = self._arm.set_servo_angle(angle=[220.4, 17.7, -24.5, 7.0, -28.0], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
            if not self._check_code(code, 'set_servo_angle'):
                return
            for i in range(10):
                time.sleep(0.1)
                if not self.is_alive:
                    return
            if self._arm.arm.get_cgpio_li_state([1, 1, 1, 1, 0, 1, 1, 1], timeout=3.0, is_ci=True):
                code = self._arm.set_position(*[-341.7, -160.2, 7.0, 180.0, 0.2, 169.6], speed=self._tcp_speed, mvacc=self._tcp_acc, radius=0.0, wait=True)
                if not self._check_code(code, 'set_position'):
                    return
                for i in range(10):
                    time.sleep(0.1)
                    if not self.is_alive:
                        return
                code = self._arm.set_servo_angle(angle=[168.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                if not self._check_code(code, 'set_servo_angle'):
                    return
                for i in range(10):
                    time.sleep(0.1)
                    if not self.is_alive:
                        return
                code = self._arm.set_servo_angle(angle=[167.0, 49.8, -71.9, 20.8, -10.2], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                if not self._check_code(code, 'set_servo_angle'):
                    return
                for i in range(10):
                    time.sleep(0.1)
                    if not self.is_alive:
                        return
                code = self._arm.set_bio_gripper_position(pos=150, speed=4000, force=100, wait=True)
                if not self._check_code(code, 'open_bio_gripper'):
                    return
                for i in range(10):
                    time.sleep(0.1)
                    if not self.is_alive:
                        return
                code = self._arm.set_servo_angle(angle=[168.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                if not self._check_code(code, 'set_servo_angle'):
                    return
            elif self._arm.arm.get_cgpio_li_state([1, 1, 1, 1, 1, 1, 1, 1], timeout=3.0, is_ci=True):
                code = self._arm.set_position(*[-252.4, -452.4, 34.8, 180.0, 0.3, 172.9], speed=self._tcp_speed, mvacc=self._tcp_acc, radius=0.0, wait=True)
                if not self._check_code(code, 'set_position'):
                    return
                for i in range(10):
                    time.sleep(0.1)
                    if not self.is_alive:
                        return
                if self._arm.arm.get_cgpio_li_state([1, 1, 1, 1, 0, 1, 1, 1], timeout=3.0, is_ci=True):
                    code = self._arm.set_position(*[-341.7, -160.2, 7.0, 180.0, 0.2, 169.6], speed=self._tcp_speed, mvacc=self._tcp_acc, radius=0.0, wait=True)
                    if not self._check_code(code, 'set_position'):
                        return
                    for i in range(10):
                        time.sleep(0.1)
                        if not self.is_alive:
                            return
                    code = self._arm.set_servo_angle(angle=[168.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                    if not self._check_code(code, 'set_servo_angle'):
                        return
                    for i in range(10):
                        time.sleep(0.1)
                        if not self.is_alive:
                            return
                    code = self._arm.set_servo_angle(angle=[167.0, 49.8, -71.9, 20.8, -10.2], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                    if not self._check_code(code, 'set_servo_angle'):
                        return
                    for i in range(10):
                        time.sleep(0.1)
                        if not self.is_alive:
                            return
                    code = self._arm.set_bio_gripper_position(pos=150, speed=4000, force=100, wait=False)
                    if not self._check_code(code, 'open_bio_gripper'):
                        return
                    for i in range(10):
                        time.sleep(0.1)
                        if not self.is_alive:
                            return
                    code = self._arm.set_servo_angle(angle=[168.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                    if not self._check_code(code, 'set_servo_angle'):
                        return
                elif self._arm.arm.get_cgpio_li_state([1, 1, 1, 1, 1, 1, 1, 1], timeout=3.0, is_ci=True):
                    code = self._arm.set_position(*[-287.3, -491.2, 34.8, 180.0, 0.3, 96.0], speed=self._tcp_speed, mvacc=self._tcp_acc, radius=0.0, wait=True)
                    if not self._check_code(code, 'set_position'):
                        return
                    for i in range(10):
                        time.sleep(0.1)
                        if not self.is_alive:
                            return
                    if self._arm.arm.get_cgpio_li_state([1, 1, 1, 1, 0, 1, 1, 1], timeout=3.0, is_ci=True):
                        code = self._arm.set_position(*[-341.7, -160.2, 7.0, 180.0, 0.2, 169.6], speed=self._tcp_speed, mvacc=self._tcp_acc, radius=0.0, wait=True)
                        if not self._check_code(code, 'set_position'):
                            return
                        for i in range(10):
                            time.sleep(0.1)
                            if not self.is_alive:
                                return
                        code = self._arm.set_servo_angle(angle=[168.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                        if not self._check_code(code, 'set_servo_angle'):
                            return
                        for i in range(10):
                            time.sleep(0.1)
                            if not self.is_alive:
                                return
                        code = self._arm.set_servo_angle(angle=[167.0, 49.8, -71.9, 20.8, -10.2], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                        if not self._check_code(code, 'set_servo_angle'):
                            return
                        for i in range(10):
                            time.sleep(0.1)
                            if not self.is_alive:
                                return
                        code = self._arm.set_bio_gripper_position(pos=150, speed=4000, force=100, wait=False)
                        if not self._check_code(code, 'open_bio_gripper'):
                            return
                        for i in range(10):
                            time.sleep(0.1)
                            if not self.is_alive:
                                return
                        code = self._arm.set_servo_angle(angle=[168.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                        if not self._check_code(code, 'set_servo_angle'):
                            return
                    elif self._arm.arm.get_cgpio_li_state([1, 1, 1, 1, 1, 1, 1, 1], timeout=3.0, is_ci=True):
                        code = self._arm.set_position(*[-311.2, -366.2, 34.8, 180.0, 0.0, -111.6], speed=self._tcp_speed, mvacc=self._tcp_acc, radius=0.0, wait=True)
                        if not self._check_code(code, 'set_position'):
                            return
                        for i in range(10):
                            time.sleep(0.1)
                            if not self.is_alive:
                                return
                        code = self._arm.set_position(*[-365.6, -330.2, 34.8, 180.0, -0.4, -66.0], speed=self._tcp_speed, mvacc=self._tcp_acc, radius=0.0, wait=True)
                        if not self._check_code(code, 'set_position'):
                            return
                        for i in range(10):
                            time.sleep(0.1)
                            if not self.is_alive:
                                return
                        if self._arm.arm.get_cgpio_li_state([1, 1, 1, 1, 0, 1, 1, 1], timeout=3.0, is_ci=True):
                            code = self._arm.set_position(*[-341.7, -160.2, 7.0, 180.0, 0.2, 169.6], speed=self._tcp_speed, mvacc=self._tcp_acc, radius=0.0, wait=True)
                            if not self._check_code(code, 'set_position'):
                                return
                            for i in range(10):
                                time.sleep(0.1)
                                if not self.is_alive:
                                    return
                            code = self._arm.set_servo_angle(angle=[168.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                            if not self._check_code(code, 'set_servo_angle'):
                                return
                            for i in range(10):
                                time.sleep(0.1)
                                if not self.is_alive:
                                    return
                            code = self._arm.set_servo_angle(angle=[167.0, 49.8, -71.9, 20.8, -10.2], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                            if not self._check_code(code, 'set_servo_angle'):
                                return
                            for i in range(10):
                                time.sleep(0.1)
                                if not self.is_alive:
                                    return
                            code = self._arm.set_bio_gripper_position(pos=150, speed=4000, force=100, wait=False)
                            if not self._check_code(code, 'open_bio_gripper'):
                                return
                            for i in range(10):
                                time.sleep(0.1)
                                if not self.is_alive:
                                    return
                            code = self._arm.set_servo_angle(angle=[168.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                            if not self._check_code(code, 'set_servo_angle'):
                                return
                        elif self._arm.arm.get_cgpio_li_state([1, 1, 1, 1, 1, 1, 1, 1], timeout=3.0, is_ci=True):
                            code = self._arm.set_position(*[-425.1, -411.1, 34.8, 180.0, -0.4, -12.7], speed=self._tcp_speed, mvacc=self._tcp_acc, radius=0.0, wait=True)
                            if not self._check_code(code, 'set_position'):
                                return
                            for i in range(10):
                                time.sleep(0.1)
                                if not self.is_alive:
                                    return
                            if self._arm.arm.get_cgpio_li_state([1, 1, 1, 1, 0, 1, 1, 1], timeout=3.0, is_ci=True):
                                code = self._arm.set_position(*[-341.7, -160.2, 7.0, 180.0, 0.2, 169.6], speed=self._tcp_speed, mvacc=self._tcp_acc, radius=0.0, wait=True)
                                if not self._check_code(code, 'set_position'):
                                    return
                                for i in range(10):
                                    time.sleep(0.1)
                                    if not self.is_alive:
                                        return
                                code = self._arm.set_servo_angle(angle=[168.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                                if not self._check_code(code, 'set_servo_angle'):
                                    return
                                for i in range(10):
                                    time.sleep(0.1)
                                    if not self.is_alive:
                                        return
                                code = self._arm.set_servo_angle(angle=[167.0, 49.8, -71.9, 20.8, -10.2], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                                if not self._check_code(code, 'set_servo_angle'):
                                    return
                                for i in range(10):
                                    time.sleep(0.1)
                                    if not self.is_alive:
                                        return
                                code = self._arm.set_bio_gripper_position(pos=150, speed=4000, force=100, wait=False)
                                if not self._check_code(code, 'open_bio_gripper'):
                                    return
                                for i in range(10):
                                    time.sleep(0.1)
                                    if not self.is_alive:
                                        return
                                code = self._arm.set_servo_angle(angle=[168.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                                if not self._check_code(code, 'set_servo_angle'):
                                    return
                            else:
                                code = self._arm.set_position(*[-341.7, -160.2, 7.0, 180.0, 0.2, 169.6], speed=self._tcp_speed, mvacc=self._tcp_acc, radius=0.0, wait=True)
                                if not self._check_code(code, 'set_position'):
                                    return
                                for i in range(10):
                                    time.sleep(0.1)
                                    if not self.is_alive:
                                        return
                                code = self._arm.set_servo_angle(angle=[168.3, 21.7, -0.3, -21.4, -1.6], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                                if not self._check_code(code, 'set_servo_angle'):
                                    return
                                for i in range(10):
                                    time.sleep(0.1)
                                    if not self.is_alive:
                                        return
                                code = self._arm.set_servo_angle(angle=[125.6, -46.7, 8.2, 38.5, -0.8], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                                if not self._check_code(code, 'set_servo_angle'):
                                    return
                                for i in range(10):
                                    time.sleep(0.1)
                                    if not self.is_alive:
                                        return
                                code = self._arm.set_servo_angle(angle=[128.1, 30.0, -70.6, 38.5, -0.8], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                                if not self._check_code(code, 'set_servo_angle'):
                                    return
                                for i in range(10):
                                    time.sleep(0.1)
                                    if not self.is_alive:
                                        return
                                code = self._arm.set_bio_gripper_position(pos=150, speed=4000, force=100, wait=False)
                                if not self._check_code(code, 'open_bio_gripper'):
                                    return
                                for i in range(10):
                                    time.sleep(0.1)
                                    if not self.is_alive:
                                        return
                                code = self._arm.set_servo_angle(angle=[125.6, -46.7, 8.2, 38.5, -0.8], speed=self._angle_speed, mvacc=self._angle_acc, wait=True, radius=0.0)
                                if not self._check_code(code, 'set_servo_angle'):
                                    return
                                self._start_run_blockly(fileName="botol_to_scanner", times=1)
            self._cgpio_digital_callbacks.append({'io': 5, 'trigger': 0, 'op': '==', 'callback': self.controller_gpio_5_digital_is_changed_callback_1})
            self._cgpio_digital_callbacks.append({'io': 6, 'trigger': 0, 'op': '==', 'callback': self.controller_gpio_6_digital_is_changed_callback_2})
            self._cgpio_digital_callbacks.append({'io': 7, 'trigger': 0, 'op': '==', 'callback': self.controller_gpio_7_digital_is_changed_callback_3})
            # Event Loop
            while self.is_alive:
                time.sleep(0.5)
        except Exception as e:
            self.pprint('MainException: {}'.format(e))
        finally:
            self.alive = False
            self._arm.release_error_warn_changed_callback(self._error_warn_changed_callback)
            self._arm.release_state_changed_callback(self._state_changed_callback)


if __name__ == '__main__':
    RobotMain.pprint('xArm-Python-SDK Version:{}'.format(version.__version__))
    arm = XArmAPI('192.168.1.224', baud_checkset=False)
    time.sleep(0.5)
    robot_main = RobotMain(arm)
    robot_main.run()