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)
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)