tag.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import socket
  2. import sys
  3. import threading
  4. import numpy as np
  5. from socket import error as SocketError
  6. from robot import Robot
  7. class TagServer(threading.Thread):
  8. def __init__(self, port, board_size):
  9. threading.Thread.__init__(self)
  10. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  11. server_address = ('0.0.0.0', port)
  12. print ('Starting up on %s port %s' % server_address)
  13. sock.bind(server_address)
  14. sock.listen(1)
  15. sock.settimeout(1)
  16. self.sock = sock
  17. self.clients_threads = []
  18. self.tag = None
  19. self.board_size = board_size
  20. self.runV = True
  21. self.start()
  22. def updatePosition (self, idd, posx, posy, course):
  23. for thread in self.clients_threads:
  24. if thread.robot is not None and thread.robot.idd == idd:
  25. msg = "P "
  26. msg = msg + str(posx)+","
  27. msg = msg + str(posy)+","
  28. msg = msg + str(course)+","
  29. msg = msg + str(thread.robot.idd)+","
  30. msg = msg + str(thread.robot.xsize)+","
  31. msg = msg + str(thread.robot.ysize)+","
  32. msg = msg + str(thread.robot.xtag)+","
  33. msg = msg + str(thread.robot.ytag)
  34. thread.robot.posx = posx
  35. thread.robot.posy = posy
  36. thread.robot.course = course
  37. self.brodcast(msg)
  38. # check for collision
  39. for i in self.robots():
  40. if i != self.tag:
  41. continue
  42. for j in self.robots():
  43. if i == j:
  44. continue
  45. if i.intersect(j):
  46. self.tag = j
  47. self.brodcast("RUN "+str(self.tag.id)+" 10")
  48. def startGame (self):
  49. self.brodcast("STOP")
  50. def startGame (self):
  51. self.brodcast("START")
  52. if self.tag is None:
  53. tag = np.random.choice(self.robots(), 1)
  54. if len(tag) == 1:
  55. self.tag = tag
  56. self.brodcast("RUN "+str(self.tag.id)+" 10")
  57. return True
  58. return False
  59. def brodcast(self, msg):
  60. for thread in self.clients_threads:
  61. if thread.robot is not None:
  62. thread.send(msg+"\n")
  63. def run(self):
  64. while self.runV:
  65. try:
  66. (clientsock, (ip, port)) = self.sock.accept()
  67. newthread = TagThread(ip, port, clientsock, self)
  68. self.clients_threads.append(newthread)
  69. except socket.timeout as err:
  70. pass
  71. self.sock.close()
  72. def robots(self):
  73. r = []
  74. for thread in self.clients_threads:
  75. if thread.robot is not None:
  76. r.append(thread.robot)
  77. return r
  78. def stop(self):
  79. for thread in self.clients_threads:
  80. thread.stop()
  81. self.runV = False
  82. class TagThread(threading.Thread):
  83. def __init__(self, ip, port, socket, server):
  84. threading.Thread.__init__(self)
  85. self.ip = ip
  86. self.port = port
  87. self.sock = socket
  88. self.points = 0
  89. self.robot = None
  90. self.bz = server.board_size
  91. self.server = server
  92. socket.settimeout(1)
  93. self.runV = True
  94. self.start()
  95. def run(self):
  96. while self.runV:
  97. try:
  98. data = self.sock.recv(64).decode('ascii')
  99. except socket.timeout as err:
  100. continue
  101. except SocketError as e:
  102. self.robot = None
  103. break
  104. data = data.split(" ")
  105. try:
  106. if data[0] == "SUB":
  107. idd, xsize, ysize, xtag, ytag = data[1].split(",")
  108. self.robot = Robot(int(idd), float(xsize), float(ysize), float(xtag), float(ytag))
  109. self.send("OK "+str(self.bz[0])+","+str(self.bz[1])+"\n")
  110. if data[0] == "P":
  111. posx, posy, curse = data[1].split(",")
  112. posx, posy, curse = float(posx), float(posy), float(curse)
  113. self.server.updatePosition(self.robot.idd, posx, posy, curse)
  114. except Exception as e:
  115. print(e)
  116. self.send("ERR\n")
  117. self.sock.close()
  118. def send(self, msg):
  119. self.sock.sendall(msg.encode('ascii'))
  120. def stop(self):
  121. self.runV = False
  122. class TagClient(threading.Thread):
  123. def __init__(sself, ip, port):
  124. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  125. server_address = (ip, port)
  126. sock.connect(server_address)
  127. self.sock = sock
  128. self.stop = None
  129. self.start = None
  130. self.tagger = None
  131. self.position = None
  132. def info (self, idd, xsize, ysize, xtag, ytag):
  133. message = "SUB "+idd+","+xsize+","+ysize+","+xtag+","+ytag+"\n"
  134. self.sock.sendall(message.encode('ascii'))
  135. self.start()
  136. def run(self):
  137. while True:
  138. try:
  139. data = self.sock.recv(64).decode('ascii')
  140. except SocketError as e:
  141. self.robot = None
  142. break
  143. data = data.split("\n")[0].split(" ")
  144. if data[0] == "OK":
  145. self.board_size = self.position(data[1].split(","))
  146. print("SUB OK")
  147. elif data[0] == "P" and self.position is not None:
  148. self.position(data[1].split(","))
  149. def stopCallback (self, function):
  150. self.stop = function
  151. def startCallback (self, function):
  152. self.start = function
  153. def taggerCallback (self, function):
  154. self.tagger = function
  155. def positionCallback (self, function):
  156. self.position = function
  157. def boardinfoCallback (self, function):
  158. self.boardinfo = function
  159. # Somente na simulacao
  160. def setPosition(px, py):
  161. message = "P "+px+","+py+"\n"
  162. self.sock.sendall(message.encode('ascii'))