Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import socket
- # TODO handle exceptions everywhere
- # XXX describe/document usage
- # XXX create github repo
- # XXX send project to github
- # jakub.vojvoda@gmail.com
- # lukbej@gmail.com
- # enum@tutanota.com
- # kremes18@gmail.com
- class SocketElevatorController:
- def __init__(self):
- self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- # XXX except ConnectionRefusedError - tell user to launch server first
- self.sock.connect(("127.0.0.1", 4242))
- self.recvbuf = b""
- def shutdown(self):
- print( "Shutting down" )
- self.sock.close()
- def request_beep(self, time_step, current_floor, target_floor ):
- # in: type==beep, time step, current floor, target floor,
- # out: type==beep, time step, elevator number
- self.send_msg( str.encode("beep {} {} {}\n".format( time_step, current_floor, target_floor ) ) )
- reply = self.recv_msg_blocking()
- parts = reply.split()
- print( parts )
- print( parts[0] )
- if parts[0] != b"beep":
- print("Unexpected reply (incorrect message type)!")
- return None
- if len(parts) < 3:
- print("Unexpected reply (too few fields)!")
- return None
- try:
- return (int(parts[1]), int(parts[2]))
- except ValueError:
- print("Unexpected reply (unexpected data type)!")
- return None
- def request_update(self, time_step, elevator_states):
- # in: type==update, time step, [(elev_1_position,elev_1_state), ..., (elev_n_position, elev_n_state)]
- # out: type==update, time step, [(elev_1_position,elev_1_command), ..., (elev_n_position, elev_n_command)]
- states_str = " ".join([ "{} {}".format(pos, state) for (pos, state) in elevator_states])
- msg = str.encode("update {} {} {}\n".format(time_step, len(elevator_states), states_str) )
- self.send_msg( msg )
- reply = self.recv_msg_blocking()
- parts = reply.split()
- if parts[0] != b"update":
- print("Unexpected reply (incorrect message type)!")
- return None
- if len(parts) < 3:
- print("Unexpected reply (too few fields)!")
- return None
- try:
- time_step = int(parts[1])
- elev_count = int(parts[2])
- elev_commands = []
- if len(parts) < 3 + 2 * elev_count:
- print("Unexpected reply (too few fields)!")
- return None
- for i in range(elev_count):
- position = int(3 + i * 2)
- command = str(3 + i * 2 + 1)
- elev_commands.append( (position, command) )
- return (time_step, elev_commands)
- except ValueError:
- print("Unexpected reply (unexpected data type)!")
- return None
- def request_end(self):
- self.sock.sendall(b"Stop\n")
- def send_msg(self, msg):
- # TODO check that the msg ends with newline
- print( "Sending message: '{}'".format(msg) )
- self.sock.sendall( msg )
- def recv_msg_blocking(self):
- # TODO timeout
- while True:
- self.recvbuf += self.sock.recv(128)
- if b"\n" in self.recvbuf:
- (msg, newline, self.recvbuf) = self.recvbuf.partition(b"\n")
- print("Received message: '{}'".format(msg))
- return msg
- if __name__ == "__main__":
- api = SocketElevatorController()
- # going from 4 to 8 at time 1
- (time, assigned_elevator) = api.request_beep( 1, 4, 8 )
- # state of 4 elevators at time 1
- (time, elevator_commands) = api.request_update( 1, [(1, "is_closed"), (1, "moving_up"), (5, "moving_down"), (7, "is_open")] )
- api.request_end()
- api.shutdown()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement