コード例 #1
0
    def __init__(self):
        self.available_boards = register.BOARDS
        self.board_serial_port = Port()
        self.board = None
        self.is_connected = False
        self.last_percentage_print = 0
        self.is_windows = os.name == 'nt'

        self.config_dir = os.path.expanduser('~') + '/.gogoreal'
        if not os.path.isdir(self.config_dir):
            os.mkdir(self.config_dir)
コード例 #2
0
class GoGoRealInterface(object):

    def __init__(self):
        self.available_boards = register.BOARDS
        self.board_serial_port = Port()
        self.board = None
        self.is_connected = False
        self.last_percentage_print = 0
        self.is_windows = os.name == 'nt'

        self.config_dir = os.path.expanduser('~') + '/.gogoreal'
        if not os.path.isdir(self.config_dir):
            os.mkdir(self.config_dir)

    def available_boards_names(self):
        return self.available_boards.keys()

    def connect(self, port=None, board_name=None):
        if port is None and board_name is None:
            for port in self.board_serial_port.port_list():
                if self.board_serial_port.open(port):
                    for board in self.available_boards.values():
                        self.board = board()
                        if self.board.connect(self.board_serial_port):
                            self.is_connected = True
                            self.motors_groups = [(chr(x+ord('A')), False) for x in range(self.board.number_of_motors)]
                            return self.is_connected
                self.board_serial_port.close()
        else:
            if board_name is None:
                if self.board_serial_port.open(port):
                    for board in self.available_boards.values():
                        self.board = board()
                        if self.board.connect(self.board_serial_port):
                            self.is_connected = True
                            self.motors_groups = [(chr(x+ord('A')), False) for x in range(self.board.number_of_motors)]
                            return self.is_connected
            elif port is None:
                for port in self.board_serial_port.port_list():
                    if self.board_serial_port.open(port):
                        self.board = self.available_boards[board_name]()
                        if self.board.connect(self.board_serial_port):
                            self.is_connected = True
                            self.motors_groups = [(chr(x+ord('A')), False) for x in range(self.board.number_of_motors)]
                            return self.is_connected
                    self.board_serial_port.close()
            if self.board_serial_port.open(port):
                self.board = self.available_boards[board_name]()
                if self.board.connect(self.board_serial_port):
                    self.is_connected = True
                    self.motors_groups = [(chr(x+ord('A')), False) for x in range(self.board.number_of_motors)]
                    return self.is_connected
            self.board_serial_port.close()
        return False

    def set_group_motor(self, group, motors):
        if self.is_connected:
            self.motors_groups[group] = (motors, self.motors_groups[group][1])

    def beep(self):
        if self.is_connected:
            self.board.beep()

    def run_logo_code(self):
        if self.is_connected:
            self.board.run_logo_code()

    def run_logo_code_at_turn_on(self, enable):
        if self.is_connected:
            self.board.run_logo_code_at_turn_on(enable)

    def led_on(self):
        if self.is_connected:
            self.board.led_on()

    def led_off(self):
        if self.is_connected:
            self.board.led_off()

    def read_sensor(self, sensor):
        if self.is_connected:
            sensor_value = self.board.read_sensor(sensor)
            if sensor_value > 0:
                return sensor_value
            else:
                return 0

    def disconnect(self):
        if self.is_connected:
            self.board_serial_port.close()

    def available_ports(self):
        return self.board_serial_port.port_list()

    def current_board_name(self):
        if self.is_connected:
            return self.board.name_and_version()

    def set_motors_on(self, group):
        if self.is_connected:
            self.motors_groups[group] = (self.motors_groups[group][0], True)
            self.board.set_motors_on(self.motors_groups[group][0])

    def set_motors_off(self, group):
        if self.is_connected:
            self.motors_groups[group] = (self.motors_groups[group][0], False)
            self.board.set_motors_off(self.motors_groups[group][0])

    def set_motors_power(self, group, power, not_wait_motor_on=False):
        if self.is_connected and (not_wait_motor_on or self.motors_groups[group][1]):
            self.board.set_motors_power(self.motors_groups[group][0], power)

    def set_motors_direction(self, group, way, not_wait_motor_on=False):
        if self.is_connected and (not_wait_motor_on or self.motors_groups[group][1]):
            self.board.set_motors_direction(self.motors_groups[group][0], way)

    def set_motors_servo(self, group, not_wait_motor_on=False):
        if self.is_connected and (not_wait_motor_on or self.motors_groups[group][1]):
            self.board.set_motors_servo(self.motors_groups[group][0])

    def set_motors_angle(self, group, angle, not_wait_motor_on=False):
        if self.is_connected and (not_wait_motor_on or self.motors_groups[group][1]):
            self.board.set_motors_angle(self.motors_groups[group][0], angle)

    def motors_power_max_min(self):
        return self.board.motors_power_max_min()

    def write_logo_code(self, logo_code):
        if self.is_connected:
            compiled_logo_code = compiler.analisarCodigo(logo_code, self.config_dir)
            self.board.write_logo_code(compiled_logo_code)

    def update_firmware(self, board, port, firmware_path, update_progress):
        if self.is_windows:
            try:
                port = int(port[-1]) - 1
            except ValueError:
                print 'Error!! Invalid Port.'
        if not os.path.isfile(firmware_path):
            print 'Error!! Invalid Hex File.'
        elif not self.board_serial_port.open(port):
            print 'Error!! Could not open port.'
        else:
            board = self.available_boards[board]()
            board.update_firmware(self.board_serial_port, firmware_path, update_progress)
        self.board_serial_port.close()

    def print_update_progress(self, percentage):
        if percentage == 100:
            sys.stdout.write(u'\nConcluído.\n')
            sys.stdout.flush()
            return
        if percentage - self.last_percentage_print < 1.0:
            return
        self.last_percentage_print = percentage
        sys.stdout.write('\r'+'Fazendo update do Firmware: ' + str(int(percentage)) + '%')
        sys.stdout.flush()

    def parse_args(self):
        new_epilog = 'List of avalible boards:\n'
        for each in self.available_boards:
            new_epilog += '"'+each+'"\n'
        new_epilog += '\nList of avalible ports:\n'
        for port in self.board_serial_port.port_list():
            if self.is_windows:
                port = 'Com'+str(port+1)
            new_epilog += '"'+port+'"\n'
        epilog = new_epilog + '\n\n' + commands_examples

        parser = argparse.ArgumentParser(description='GoGo Real - Robotics for Kids',
                                         epilog=epilog,
                                         formatter_class=argparse.RawDescriptionHelpFormatter)
        parser.add_argument('-u', nargs=3, metavar=('port', 'board', 'firmware'), type=str, help='Update Firmware')
        return parser.parse_args()

    def process_command_line(self):
        args = self.parse_args()
        if args.u is not None:
            self.update_firmware(args.u[0], args.u[1], args.u[2], self.print_update_progress)

    def reserved_words(self):
        return compiler.reserved.keys()