Advertisement
Guest User

elevators-sockets.py

a guest
Nov 22nd, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.76 KB | None | 0 0
  1. import socket
  2.  
  3. # TODO handle exceptions everywhere
  4.  
  5. # XXX describe/document usage
  6. # XXX create github repo
  7.  
  8. # XXX send project to github
  9. # jakub.vojvoda@gmail.com
  10. # lukbej@gmail.com
  11. # enum@tutanota.com
  12. # kremes18@gmail.com
  13.  
  14. class SocketElevatorController:
  15. def __init__(self):
  16. self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  17. # XXX except ConnectionRefusedError - tell user to launch server first
  18. self.sock.connect(("127.0.0.1", 4242))
  19. self.recvbuf = b""
  20.  
  21. def shutdown(self):
  22. print( "Shutting down" )
  23. self.sock.close()
  24.  
  25. def request_beep(self, time_step, current_floor, target_floor ):
  26. # in: type==beep, time step, current floor, target floor,
  27. # out: type==beep, time step, elevator number
  28. self.send_msg( str.encode("beep {} {} {}\n".format( time_step, current_floor, target_floor ) ) )
  29. reply = self.recv_msg_blocking()
  30. parts = reply.split()
  31. print( parts )
  32. print( parts[0] )
  33. if parts[0] != b"beep":
  34. print("Unexpected reply (incorrect message type)!")
  35. return None
  36. if len(parts) < 3:
  37. print("Unexpected reply (too few fields)!")
  38. return None
  39. try:
  40. return (int(parts[1]), int(parts[2]))
  41. except ValueError:
  42. print("Unexpected reply (unexpected data type)!")
  43. return None
  44.  
  45. def request_update(self, time_step, elevator_states):
  46. # in: type==update, time step, [(elev_1_position,elev_1_state), ..., (elev_n_position, elev_n_state)]
  47. # out: type==update, time step, [(elev_1_position,elev_1_command), ..., (elev_n_position, elev_n_command)]
  48. states_str = " ".join([ "{} {}".format(pos, state) for (pos, state) in elevator_states])
  49. msg = str.encode("update {} {} {}\n".format(time_step, len(elevator_states), states_str) )
  50. self.send_msg( msg )
  51. reply = self.recv_msg_blocking()
  52. parts = reply.split()
  53. if parts[0] != b"update":
  54. print("Unexpected reply (incorrect message type)!")
  55. return None
  56. if len(parts) < 3:
  57. print("Unexpected reply (too few fields)!")
  58. return None
  59. try:
  60. time_step = int(parts[1])
  61. elev_count = int(parts[2])
  62. elev_commands = []
  63. if len(parts) < 3 + 2 * elev_count:
  64. print("Unexpected reply (too few fields)!")
  65. return None
  66. for i in range(elev_count):
  67. position = int(3 + i * 2)
  68. command = str(3 + i * 2 + 1)
  69. elev_commands.append( (position, command) )
  70. return (time_step, elev_commands)
  71. except ValueError:
  72. print("Unexpected reply (unexpected data type)!")
  73. return None
  74.  
  75. def request_end(self):
  76. self.sock.sendall(b"Stop\n")
  77.  
  78. def send_msg(self, msg):
  79. # TODO check that the msg ends with newline
  80. print( "Sending message: '{}'".format(msg) )
  81. self.sock.sendall( msg )
  82.  
  83. def recv_msg_blocking(self):
  84. # TODO timeout
  85. while True:
  86. self.recvbuf += self.sock.recv(128)
  87. if b"\n" in self.recvbuf:
  88. (msg, newline, self.recvbuf) = self.recvbuf.partition(b"\n")
  89. print("Received message: '{}'".format(msg))
  90. return msg
  91.  
  92. if __name__ == "__main__":
  93. api = SocketElevatorController()
  94. # going from 4 to 8 at time 1
  95. (time, assigned_elevator) = api.request_beep( 1, 4, 8 )
  96. # state of 4 elevators at time 1
  97. (time, elevator_commands) = api.request_update( 1, [(1, "is_closed"), (1, "moving_up"), (5, "moving_down"), (7, "is_open")] )
  98.  
  99. api.request_end()
  100. api.shutdown()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement