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)
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()