tag.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  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("QUIT")
  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. try:
  151. self.sock.sendall(msg.encode('ascii'))
  152. except SocketError as e:
  153. pass
  154. self.mutex.release()
  155. def stop(self):
  156. self.runV = False
  157. class TagClient(threading.Thread):
  158. def __init__(self, ip, port):
  159. threading.Thread.__init__(self)
  160. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  161. server_address = (ip, port)
  162. sock.connect(server_address)
  163. sock.settimeout(1)
  164. self.sock = sock
  165. self.stopf = None
  166. self.startf = None
  167. self.runf = None
  168. self.position = None
  169. # info
  170. self.runing = False
  171. self.tag = None
  172. self.positions = []
  173. self.board = None
  174. self.quit = False
  175. self.mutex = threading.Lock()
  176. def info (self, idd, xsize, ysize, xtag, ytag):
  177. idd, xsize, ysize, xtag, ytag = str(idd), str(xsize), str(ysize), str(xtag), str(ytag)
  178. message = "SUB "+idd+","+xsize+","+ysize+","+xtag+","+ytag+"\n"
  179. self.sock.sendall(message.encode('ascii'))
  180. self.runV = True
  181. self.start()
  182. def run(self):
  183. data = ""
  184. while self.runV:
  185. try:
  186. data += self.sock.recv(256).decode('ascii')
  187. except socket.timeout as err:
  188. continue
  189. except SocketError as e:
  190. self.robot = None
  191. break
  192. if "\n" not in data:
  193. continue
  194. tmp = data.split("\n")
  195. if tmp[-1] != '':
  196. data = tmp[-1]
  197. tmp = tmp[0:-1]
  198. else:
  199. data = ""
  200. for d in tmp:
  201. d = d.split(" ")
  202. if d[0] == "OK":
  203. x, y = d[1].split(",")
  204. x, y = float(x), float(y)
  205. self.board = (x, y)
  206. elif d[0] == "P":
  207. posx, posy, course, idd, xsize, ysize, xtag, ytag = d[1].split(",")
  208. posx = float(posx)
  209. posy = float(posy)
  210. course = float(course)
  211. idd = int(idd)
  212. xsize = float(xsize)
  213. ysize = float(ysize)
  214. xtag = float(xtag)
  215. ytag = float(ytag)
  216. self.mutex.acquire()
  217. self.positions.append((posx, posy, course, idd, xsize, ysize, xtag, ytag))
  218. self.mutex.release()
  219. elif d[0] == "START":
  220. print(d)
  221. self.runing = True
  222. elif d[0] == "STOP":
  223. print(d)
  224. self.runing = False
  225. elif d[0] == "RUN":
  226. print(d)
  227. idd, interval = d[1].split(",")
  228. self.tag = (int(idd), float(interval)+time.time())
  229. elif d[0] == "QUIT":
  230. print(d)
  231. self.stop()
  232. self.sock.close()
  233. self.quit = True
  234. def getStatus(self):
  235. return self.runing
  236. def getBoard(self):
  237. return self.board
  238. def getPosition(self):
  239. i = self.positions
  240. self.mutex.acquire()
  241. self.positions = []
  242. self.mutex.release()
  243. return i
  244. def getTagInfo(self):
  245. return self.tag
  246. # Somente na simulacao
  247. def setPosition(self, px, py, course):
  248. message = "P "+str(px)+","+str(py)+","+str(course)+"\n"
  249. self.sock.sendall(message.encode('ascii'))
  250. def stop(self):
  251. self.runV = False