class DSRC(Process): def __init__(self, port): Process.__init__(self) self.conn = RxConnector(port, 'UDP') self.queue = Queue() def __enter__(self): return self.queue def run(self): my_last_time = 0 my_last_msg = None times = [] msgs = [] ids = [] updated = [] while True: news = self.conn.recv(1024, .2) assert news != '', "DSRC connection stopped" rcv, msg_id, tmp_id, snd_time, lat, lon, elevation, accuracy,\ extra = parsemessage(news) lat *= 10.**-7 lon *= 10.**-7 if lat < 90 and lon < 180: x, y = utm.from_latlon(lat, lon)[:2] if rcv == 0: if snd_time > my_last_time or snd_time < my_last_time - 50: my_last_msg = (x, y, extra) my_last_time = snd_time # send current messages output = [ (1, vid, msg[0], msg[1], msg[2]) for vid, msg, update in zip(ids, msgs, updated) if update ] output.append((0, 0, my_last_msg[0], my_last_msg[1], my_last_msg[2])) self.queue.add(output) else: found = False for idx, current_id in enumerate(ids): if current_id == tmp_id: if snd_time > times[ idx] or snd_time < times[idx] - 50: msgs[idx] = (x, y, extra) times[idx] = snd_time updated[idx] = True found = True break if not found: times.append(snd_time) ids.append(msg_id) msgs.append((x, y, extra)) updated[idx].append(True) def terminate(self): self.conn.__exit__() self.queue.close() super(DSRC, self).terminate() def __exit__(self, errtype=None, errval=None, traceback=None): self.terminate()