예제 #1
0
파일: cohdaDSRC.py 프로젝트: motrom/carstop
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()