tag.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  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. import time
  8. run_time = 5
  9. class TagServer(threading.Thread):
  10. def __init__(self, port, board_size):
  11. threading.Thread.__init__(self)
  12. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  13. server_address = ('0.0.0.0', port)
  14. print ('Starting up on %s port %s' % server_address)
  15. sock.bind(server_address)
  16. sock.listen(1)
  17. sock.settimeout(1)
  18. self.sock = sock
  19. self.clients_threads = []
  20. self.tag = None
  21. self.board_size = board_size
  22. self.paused = True
  23. self.runV = True
  24. self.last = 0
  25. self.mutex = threading.Lock()
  26. self.mutex2 = threading.Lock()
  27. self.start()
  28. def updatePosition (self, idd, posx, posy, course):
  29. self.mutex.acquire()
  30. clients_threads = self.clients_threads
  31. self.mutex.release()
  32. for thread in clients_threads:
  33. if thread.robot is not None and thread.robot.idd == idd:
  34. msg = "P "
  35. msg = msg + str(posx)+","
  36. msg = msg + str(posy)+","
  37. msg = msg + str(course)+","
  38. msg = msg + str(thread.robot.idd)+","
  39. msg = msg + str(thread.robot.xsize)+","
  40. msg = msg + str(thread.robot.ysize)+","
  41. msg = msg + str(thread.robot.xtag)+","
  42. msg = msg + str(thread.robot.ytag)
  43. thread.robot.posx = posx
  44. thread.robot.posy = posy
  45. thread.robot.course = course
  46. self.brodcast(msg)
  47. # check for collision
  48. self.mutex2.acquire()
  49. for i in self.robots():
  50. if i != self.tag:
  51. continue
  52. for j in self.robots():
  53. if i == j:
  54. continue
  55. if i.intersect(j):
  56. if self.last + run_time <= time.time():
  57. print(i.idd, " pegou ", j.idd)
  58. self.tag = j
  59. self.brodcast("RUN "+str(self.tag.idd)+","+str(run_time))
  60. self.last = time.time()
  61. break
  62. self.mutex2.release()
  63. def stopGame (self):
  64. self.paused = True
  65. self.brodcast("STOP")
  66. def startGame (self):
  67. self.brodcast("START")
  68. r = self.robots()
  69. if len(r) >= 1:
  70. tag = np.random.choice(r, 1)
  71. self.tag = tag[0]
  72. self.paused = False
  73. self.brodcast("RUN "+str(self.tag.idd)+","+str(run_time))
  74. def brodcast(self, msg):
  75. self.mutex.acquire()
  76. clients_threads = self.clients_threads
  77. self.mutex.release()
  78. for thread in clients_threads:
  79. if thread.robot is not None:
  80. thread.send(msg+"\n")
  81. def run(self):
  82. while self.runV:
  83. try:
  84. (clientsock, (ip, port)) = self.sock.accept()
  85. newthread = TagThread(ip, port, clientsock, self)
  86. self.mutex.acquire()
  87. self.clients_threads.append(newthread)
  88. self.mutex.release()
  89. self.stopGame()
  90. except socket.timeout as err:
  91. pass
  92. self.sock.close()
  93. def robots(self):
  94. r = []
  95. self.mutex.acquire()
  96. clients_threads = self.clients_threads
  97. self.mutex.release()
  98. for thread in clients_threads:
  99. if thread.robot is not None:
  100. r.append(thread.robot)
  101. return r
  102. def stop(self):
  103. self.brodcast("STOP")
  104. self.mutex.acquire()
  105. clients_threads = self.clients_threads
  106. self.mutex.release()
  107. for thread in clients_threads:
  108. thread.stop()
  109. self.runV = False
  110. class TagThread(threading.Thread):
  111. def __init__(self, ip, port, socket, server):
  112. threading.Thread.__init__(self)
  113. self.ip = ip
  114. self.port = port
  115. self.sock = socket
  116. self.points = 0
  117. self.robot = None
  118. self.bz = server.board_size
  119. self.server = server
  120. socket.settimeout(1)
  121. self.runV = True
  122. self.mutex = threading.Lock()
  123. self.start()
  124. def run(self):
  125. while self.runV:
  126. try:
  127. data = self.sock.recv(128).decode('ascii')
  128. except socket.timeout as err:
  129. continue
  130. except SocketError as e:
  131. self.robot = None
  132. break
  133. data = data.split(" ")
  134. try:
  135. # print (data)
  136. if data[0] == "SUB":
  137. idd, xsize, ysize, xtag, ytag = data[1].split(",")
  138. self.robot = Robot(int(idd), float(xsize), float(ysize), float(xtag), float(ytag))
  139. self.send("OK "+str(self.bz[0])+","+str(self.bz[1])+"\n")
  140. if data[0] == "P":
  141. posx, posy, curse = data[1].split(",")
  142. posx, posy, curse = float(posx), float(posy), float(curse)
  143. self.server.updatePosition(self.robot.idd, posx, posy, curse)
  144. except Exception as e:
  145. raise
  146. self.send("ERR\n")
  147. self.sock.close()
  148. def send(self, msg):
  149. self.mutex.acquire()
  150. self.sock.sendall(msg.encode('ascii'))
  151. self.mutex.release()
  152. def stop(self):
  153. self.runV = False
  154. class TagClient(threading.Thread):
  155. def __init__(self, ip, port):
  156. threading.Thread.__init__(self)
  157. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  158. server_address = (ip, port)
  159. sock.connect(server_address)
  160. sock.settimeout(1)
  161. self.sock = sock
  162. self.stopf = None
  163. self.startf = None
  164. self.runf = None
  165. self.position = None
  166. # info
  167. self.runing = False
  168. self.tag = None
  169. self.positions = []
  170. self.board = None
  171. self.mutex = threading.Lock()
  172. def info (self, idd, xsize, ysize, xtag, ytag):
  173. idd, xsize, ysize, xtag, ytag = str(idd), str(xsize), str(ysize), str(xtag), str(ytag)
  174. message = "SUB "+idd+","+xsize+","+ysize+","+xtag+","+ytag+"\n"
  175. self.sock.sendall(message.encode('ascii'))
  176. self.runV = True
  177. self.start()
  178. def run(self):
  179. data = ""
  180. while self.runV:
  181. try:
  182. data += self.sock.recv(256).decode('ascii')
  183. except socket.timeout as err:
  184. continue
  185. except SocketError as e:
  186. self.robot = None
  187. break
  188. if "\n" not in data:
  189. continue
  190. tmp = data.split("\n")
  191. if tmp[-1] != '':
  192. data = tmp[-1]
  193. tmp = tmp[0:-1]
  194. else:
  195. data = ""
  196. for d in tmp:
  197. d = d.split(" ")
  198. if d[0] == "OK":
  199. x, y = d[1].split(",")
  200. x, y = float(x), float(y)
  201. self.board = (x, y)
  202. elif d[0] == "P":
  203. posx, posy, course, idd, xsize, ysize, xtag, ytag = d[1].split(",")
  204. posx = float(posx)
  205. posy = float(posy)
  206. course = float(course)
  207. idd = int(idd)
  208. xsize = float(xsize)
  209. ysize = float(ysize)
  210. xtag = float(xtag)
  211. ytag = float(ytag)
  212. self.mutex.acquire()
  213. self.positions.append((posx, posy, course, idd, xsize, ysize, xtag, ytag))
  214. self.mutex.release()
  215. elif d[0] == "START":
  216. print(d)
  217. self.runing = True
  218. elif d[0] == "STOP":
  219. print(d)
  220. self.runing = False
  221. elif d[0] == "RUN":
  222. print(d)
  223. idd, interval = d[1].split(",")
  224. self.tag = (int(idd), float(interval)+time.time())
  225. elif d[0] == "QUIT":
  226. self.stop()
  227. self.sock.close()
  228. def getStatus(self):
  229. return self.runing
  230. def getBoard(self):
  231. return self.board
  232. def getPosition(self):
  233. i = self.positions
  234. self.mutex.acquire()
  235. self.positions = []
  236. self.mutex.release()
  237. return i
  238. def getTagInfo(self):
  239. return self.tag
  240. # Somente na simulacao
  241. def setPosition(self, px, py, course):
  242. message = "P "+str(px)+","+str(py)+","+str(course)+"\n"
  243. self.sock.sendall(message.encode('ascii'))
  244. def stop(self):
  245. self.runV = False