tag.py 9.8 KB

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