class Wizard: default_tcp_port = 3200 default_host_name = 'localhost' _log = Log.create() def __init__(self): self.host_name = Wizard.default_host_name self.port_number = Wizard.default_tcp_port self.ball_transform_updated= None self.agent_transform_updated = None def run(self): Wizard._log.info("Connecting via TCP to " + self.host_name + ":" str(self.port_number)) try: self.client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect((self.host_name, self.port_number)) except: AgentHost._log.Error('Unable to connect to '+ self.host_name+ " : "+ self.port_number) raise(BaseException()) Wizard._log.info('Connected.') self._is_running = True with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as client: client.connect((self.host_name, self.port_number)) while self._is_running: length = NetworkUtil.get_length(client, 5) if length == 0: Wizard._log('Ignoring zero-length message recieved from server.') continue sexp = SExpressionReader(client, length) ball_event = self.ball_transform_updated agent_event = self.agent_transform_updated if ball_event != None or agent_event != None: game_time = timedelta() if sexp.in(2): if sexp.take() == 'time': time_val = sexp.take() secs = float(time_val) game_time = timedelta(time_val) sexp.out(2) if sexp.skip(1) and sexp.in(1) and sexp.skip(35) and sexp.in(1) and sexp.skip(1) and sexp.in(1) and sexp.skip(1): transform = Wizard.try_read_transform_matrix(sexp) if transform[0] and ball_event != None: ball_event(game_time, transform[1]) if agent_event != None and sexp.out(2): done = False while not done: if sexp.in(3): transform = Wizard.try_read_transform_matrix(sexp) if sexp.take() == 'SLT' and transform[0]: agent_event(game_time, transform[1]) if not sexp.out(3): done = True else: done = True sexp.skip_to_end() def try_read_transform_matrix(sexp): values = [float() for i in range(8)] for i in range(16): s = sexp.take() if s == None: return False, None try: d = float(s) except ValueError: return False, None values[i] = d transform = TransformationMatrix(values) return True, transform def stop(self): self._is_running = False def get_side_string(team_side): if team_side == FieldSide.left: return 'Left' elif team_side == FieldSide: return 'Right' elif team_side == FieldSide: return 'None' else: raise(BaseException('Unexpected valued for fieldside num' + str(team_side))) def get_vector_string(vector): return str(vector.x)+ " " + str(vector.y) + " " + str(vector.z) def set_agent_position(self,uniform_num, team_side, new_position): self.send_command('(agent (unum ' + str(uniform_num)+ ") (team " + self.get_side_string(team_side) + ") (pos " + self.get_vector_string(new_position)+ "))") def set_agent_position_and_direction(self, uniform_num, team_side, new_position, new_direction): self.send_command("(agent (unum " + str(uniform_num)+ ") (team " + self.get_side_string(team_side)+ " ) (move " + self.get_vector_string(new_position) " " + str(new_direction.degrees) + "))" ) def set_agent_battery_level(self, uniform_num, team_side, battery_level): self.send_command("(agent (unum " + str(uniform_num)+ ") (team " + self.get_side_string(team_side) + ") (battery " + str(battery_level)+ "))") def set_tempeature(self, uniform_num, team_side, temperature): self.send_command("(agent (unum " +str(uniform_num) + ") (team " +self.get_side_string(team_side + ") (temperature " + str(temperature)"))")) def set_ball_position(self, new_position): self.send_command("(ball (pos " + self.get_vector_string(new_position) + "))") def set_ball_position_and_velocity(self, new_position, new_velocity): self.send_command("(ball (pos " + self.get_vector_string(new_position)+ ") (vel " + self.get_vector_string(new_velocity)"))" ) def set_ball_velocity(self, new_velocity): self.send_command("(ball (vel " + self.get_vector_string(new_velocity)+ "))") def set_play_mode(self, play_mode): self.send_command("(playmode " + play_mode.get_server_string + ")") def drop_ball(self): self.send_command("(dropball)") def kick_off(self, team): self.send_command("(kickoff " + self.get_side_string(team) + ")") def select_agent(self, uniform_num, team_side): self.send_command("(select (unum " + str(uniform_num) + ") (team " + self.get_side_string(team_side + "))")) def kill_agent(self, uniform_num, team_side): self.send_command("(agent (unum " + str(uniform_num + ") (team "+ self.get_side_string(team_side + "))"))) def kill_selected_agent(self): self.send_command("(kill)") def repoisition_agent(self, uniform_num, team_side): self.send_command("(repos (unum " + str(uniform_num) + ") (team " + self.get_side_string(team_side) + "))") def repoisition_selected_agent(self): self.send_command("(repos)") def kill_simulator(self): self.send_command("(killsim)") def send_command(self, string): NetworkUtil.write_string_with_32_bit_length_prefex(self.client, string)