tag.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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.mutex.acquire()
  104. clients_threads = self.clients_threads
  105. self.mutex.release()
  106. for thread in clients_threads:
  107. thread.stop()
  108. self.runV = False
  109. class TagThread(threading.Thread):
  110. def __init__(self, ip, port, socket, server):
  111. threading.Thread.__init__(self)
  112. self.ip = ip
  113. self.port = port
  114. self.sock = socket
  115. self.points = 0
  116. self.robot = None
  117. self.bz = server.board_size
  118. self.server = server
  119. socket.settimeout(1)
  120. self.runV = True
  121. self.mutex = threading.Lock()
  122. self.start()
  123. def run(self):
  124. while self.runV:
  125. try:
  126. data = self.sock.recv(128).decode('ascii')
  127. except socket.timeout as err:
  128. continue
  129. except SocketError as e:
  130. self.robot = None
  131. break
  132. data = data.split(" ")
  133. try:
  134. # print (data)
  135. if data[0] == "SUB":
  136. idd, xsize, ysize, xtag, ytag = data[1].split(",")
  137. self.robot = Robot(int(idd), float(xsize), float(ysize), float(xtag), float(ytag))
  138. self.send("OK "+str(self.bz[0])+","+str(self.bz[1])+"\n")
  139. if data[0] == "P":
  140. posx, posy, curse = data[1].split(",")
  141. posx, posy, curse = float(posx), float(posy), float(curse)
  142. self.server.updatePosition(self.robot.idd, posx, posy, curse)
  143. except Exception as e:
  144. raise
  145. self.send("ERR\n")
  146. self.sock.close()
  147. def send(self, msg):
  148. self.mutex.acquire()
  149. self.sock.sendall(msg.encode('ascii'))
  150. self.mutex.release()
  151. def stop(self):
  152. self.runV = False
  153. class TagClient(threading.Thread):
  154. def __init__(self, ip, port):
  155. threading.Thread.__init__(self)
  156. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  157. server_address = (ip, port)
  158. sock.connect(server_address)
  159. sock.settimeout(1)
  160. self.sock = sock
  161. self.stopf = None
  162. self.startf = None
  163. self.runf = None
  164. self.position = None
  165. # info
  166. self.runing = False
  167. self.tag = None
  168. self.positions = []
  169. self.board = None
  170. self.mutex = threading.Lock()
  171. def info (self, idd, xsize, ysize, xtag, ytag):
  172. idd, xsize, ysize, xtag, ytag = str(idd), str(xsize), str(ysize), str(xtag), str(ytag)
  173. message = "SUB "+idd+","+xsize+","+ysize+","+xtag+","+ytag+"\n"
  174. self.sock.sendall(message.encode('ascii'))
  175. self.runV = True
  176. self.start()
  177. def run(self):
  178. data = ""
  179. while self.runV:
  180. try:
  181. data += self.sock.recv(256).decode('ascii')
  182. except socket.timeout as err:
  183. continue
  184. except SocketError as e:
  185. self.robot = None
  186. break
  187. if "\n" not in data:
  188. continue
  189. tmp = data.split("\n")
  190. if tmp[-1] != '':
  191. data = tmp[-1]
  192. tmp = tmp[0:-1]
  193. else:
  194. data = ""
  195. for d in tmp:
  196. d = d.split(" ")
  197. if d[0] == "OK":
  198. x, y = d[1].split(",")
  199. x, y = float(x), float(y)
  200. self.board = (x, y)
  201. elif d[0] == "P":
  202. posx, posy, course, idd, xsize, ysize, xtag, ytag = d[1].split(",")
  203. posx = float(posx)
  204. posy = float(posy)
  205. course = float(course)
  206. idd = int(idd)
  207. xsize = float(xsize)
  208. ysize = float(ysize)
  209. xtag = float(xtag)
  210. ytag = float(ytag)
  211. self.mutex.acquire()
  212. self.positions.append((posx, posy, course, idd, xsize, ysize, xtag, ytag))
  213. self.mutex.release()
  214. elif d[0] == "START":
  215. print(d)
  216. self.runing = True
  217. elif d[0] == "STOP":
  218. print(d)
  219. self.runing = False
  220. elif d[0] == "RUN":
  221. print(d)
  222. idd, interval = d[1].split(",")
  223. self.tag = (int(idd), float(interval)+time.time())
  224. self.sock.close()
  225. def getStatus(self):
  226. return self.runing
  227. def getBoard(self):
  228. return self.board
  229. def getPosition(self):
  230. i = self.positions
  231. self.mutex.acquire()
  232. self.positions = []
  233. self.mutex.release()
  234. return i
  235. def getTagInfo(self):
  236. return self.tag
  237. # Somente na simulacao
  238. def setPosition(self, px, py, course):
  239. message = "P "+str(px)+","+str(py)+","+str(course)+"\n"
  240. self.sock.sendall(message.encode('ascii'))
  241. def stop(self):
  242. self.runV = False