示例#1
0
    def run(self):
        """
        checks whether it's time to created another flight
        """
        # timer de schedule do sistema
        lf_tim_rrbn = self.dct_config["tim.rrbn"]

        # enquanto não inicia...
        while not gdata.G_KEEP_RUN:
            # aguarda 1 seg
            time.sleep(1)

        # inicia o recebimento de mensagens de pista
        self.__sck_rcv_trks.start()

        # tempo inicial em segundos
        lf_now = time.time()

        # loop
        while gdata.G_KEEP_RUN:
            # item da queue de entrada
            llst_data = self.__q_rcv_trks.get()
            # cdbg.M_DBG.debug("llst_data: (%s)" % str(llst_data))

            # queue tem dados ?
            if llst_data:
                # mensagem de status de aeronave ?
                if gdefs.D_MSG_NEW == int(llst_data[0]):
                    # callsign
                    ls_callsign = llst_data[10]
                    # cdbg.M_DBG.debug("run:callsign:[{}]".format(llst_data[10]))

                    # trava a lista de vôos
                    gdata.G_LCK_FLIGHT.acquire()

                    try:
                        # aeronave já está no dicionário ?
                        if ls_callsign in self.dct_flight:
                            # atualiza os dados da aeronave
                            self.dct_flight[ls_callsign].update_data(
                                llst_data[1:])

                        # senão, aeronave nova...
                        else:
                            # create new aircraft
                            self.dct_flight[ls_callsign] = canv.CAircraftVisil(
                                self, llst_data[1:])
                            assert self.dct_flight[ls_callsign]

                    finally:
                        # libera a lista de vôos
                        gdata.G_LCK_FLIGHT.release()

                    # cria um evento de atualização de aeronave
                    l_evt = evtfly.CFlightUpdate(ls_callsign)
                    assert l_evt

                    # dissemina o evento
                    self.event.post(l_evt)

                # mensagem de eliminação de aeronave ?
                elif gdefs.D_MSG_KLL == int(llst_data[0]):
                    # cria um evento de eliminação de aeronave
                    l_evt = evtfly.CFlightKill(llst_data[1])
                    assert l_evt

                    # dissemina o evento
                    self.event.post(l_evt)

                # senão, mensagem não reconhecida ou não tratada
                else:
                    # logger
                    l_log = logging.getLogger("CEmulaVisil::run")
                    l_log.setLevel(logging.WARNING)
                    l_log.warning(
                        "<E01: mensagem não reconhecida ou não tratada.")

            # salva o tempo anterior
            lf_ant = lf_now

            # tempo atual em segundos
            lf_now = time.time()

            # tempo final em segundos e calcula o tempo decorrido
            lf_dif = lf_now - lf_ant

            # esta adiantado ?
            if lf_tim_rrbn > lf_dif:
                # permite o scheduler (1/10th)
                time.sleep(lf_tim_rrbn - lf_dif)
示例#2
0
    def __msg_trk(self, flst_data):
        """
        checks whether it's time to created another flight

        @param flst_data: mensagem de status
        """
        # clear to go
        assert self.__sck_http is not None
        assert self.dct_config is not None
        assert self.dct_flight is not None
        assert self.__dct_prf is not None

        # callsign da aeronave
        ls_callsign = flst_data[10]

        # trava a lista de vôos
        gdata.G_LCK_FLIGHT.acquire()

        try:
            # aeronave já está no dicionário ?
            if ls_callsign in self.dct_flight:
                # atualiza os dados da aeronave
                self.dct_flight[ls_callsign].update_data(flst_data[1:])

            # senão, aeronave nova...
            else:
                # create new aircraft
                self.dct_flight[ls_callsign] = canv.CAircraftVisil(
                    self, flst_data[1:])
                assert self.dct_flight[ls_callsign]

        finally:
            # libera a lista de vôos
            gdata.G_LCK_FLIGHT.release()

        # indicativo da performance
        ls_prf_ind = flst_data[11]

        # performance não está no dicionário ?
        if self.__dct_prf.get(ls_prf_ind, None) is None:
            # monta o request da performance
            ls_req = "data/prf.json?{}".format(ls_prf_ind)

            # get server address
            l_srv = self.dct_config.get("srv.addr", None)

            if l_srv is not None:
                # dados de performance do servidor
                l_prf = self.__sck_http.get_data(l_srv, ls_req)

                if (l_prf is not None) and (l_prf != ""):
                    # salva a performance no dicionário
                    self.__dct_prf[ls_prf_ind] = json.loads(l_prf)

                # senão, não achou no servidor...
                else:
                    # logger
                    l_log = logging.getLogger("CEmulaPiloto::__msg_trk")
                    l_log.setLevel(logging.WARNING)
                    l_log.error(
                        u"<E01: performance({}) não existe no servidor.".
                        format(ls_prf_ind))

            # senão, não achou endereço do servidor
            else:
                # logger
                l_log = logging.getLogger("CEmulaPiloto::__msg_trk")
                l_log.setLevel(logging.WARNING)
                l_log.warning(u"<E02: srv.addr não existe na configuração.")

        # cria um evento de atualização de aeronave
        l_evt = evtfly.CFlightUpdate(ls_callsign)
        assert l_evt

        # dissemina o evento
        self.event.post(l_evt)