def __obtem_pouso(f_atv, f_apx): """ obtém o Pouso @param f_atv: pointer to aeronave @param f_apx: pointer to aproximação @return True se encontrou o Pouso, senão False (inexistente) """ # check input assert f_atv assert f_apx # pista de pouso ok ? if (f_apx.ptr_apx_pis is not None) and (f_apx.ptr_apx_pis.v_pst_ok): # ângulo mínimo para o pouso # i_pst_rumo (mlabru) lf_ang = abs(f_atv.f_trf_pro_atu - f_apx.ptr_apx_pis.f_pst_true) # tem condições de fazer pouso direto ? if lf_ang <= 15.: # inicia a nova fase na aproximação f_atv.en_atv_fase = ldefs.E_FASE_APXALINHAR # estabelece a proa a ser atingida (rumo da pista) # i_pst_rumo (mlabru) f_atv.f_atv_pro_dem = f_apx.ptr_apx_pis.f_pst_true # inicia a curva pelo menor lado scrv.sentido_curva(f_atv) # pointer do aeródromo f_atv.ptr_atv_aer = f_apx.ptr_apx_aer # pointer da pista f_atv.ptr_atv_pst = f_apx.ptr_apx_pis # coloca em procedimento de pouso f_atv.en_trf_fnc_ope = ldefs.E_POUSO # volta para fase inicial do procedimento de aproximação OU fase inicial do pouso f_atv.en_atv_fase = ldefs.E_FASE_ZERO # retorna sucesso na pesquisa return True # retorna condição de falha na pesquisa return False
def prc_orbita(f_atv, f_cine_data, f_stk_context, ff_delta_t): """ DOCUMENT ME! @param f_atv: pointer para struct aeronaves @param f_cine_data: dados da cinemática @param f_stk_context: pointer para pilha @param ff_delta_t: tempo decorrido desde a última atualização """ # check input assert f_atv assert f_cine_data assert f_stk_context is not None # aeronave ativa ? if (not f_atv.v_atv_ok) or (ldefs.E_ATIVA != f_atv.en_trf_est_atv): # logger l_log = logging.getLogger("prc_orbita") l_log.setLevel(logging.ERROR) l_log.error(u"<E01: aeronave não ativa.") # aeronave não ativa. cai fora... return # performance existe ? if (f_atv.ptr_trf_prf is None) or (not f_atv.ptr_trf_prf.v_prf_ok): # logger l_log = logging.getLogger("prc_orbita") l_log.setLevel(logging.ERROR) l_log.error(u"<E02: performance não existe.") # performance não existe. cai fora... return # aeronave abaixo de 14000ft ? if (f_atv.f_trf_alt_atu <= M_14000FT) and (f_atv.f_trf_vel_atu > M_VEL_MAX): # velocidade máxima é de 230KT f_atv.f_atv_vel_dem = M_VEL_MAX # preparação de dados ? if ldefs.E_FASE_ZERO == f_atv.en_atv_fase: # checa condição de cancelamento, caso tenha sido comandado pelo piloto if __check_cancel_orbita(f_atv): # break return # direciona ao ponto de orbita !!!REVER!!! if dp.prc_dir_ponto(f_atv, f_cine_data.f_pto_x, f_cine_data.f_pto_y, f_cine_data): # determina qual o setor de entrada na orbita f_atv.en_atv_fase = __setor_entrada(f_atv) # valida proa para perna de afastamento # f_esp_rumo (mlabru) f_cine_data.f_afasta = M_ESP_RUMO - 180. # normaliza proa para perna de afastamento if f_cine_data.f_afasta < 0.: f_cine_data.f_afasta += 360. # limita a razão de subida/descida na orbita em no máximo 1000FT/MIN !!!REVER!!! if f_atv.f_atv_raz_sub > M_RAZ_SUB: # salva a razão atual f_cine_data.f_raz_sub_des = f_atv.f_atv_raz_sub # limita a razão f_atv.f_atv_raz_sub = M_RAZ_SUB # seguir na perna de aproximação em direção oposta (perna de afastamento) elif ldefs.E_FASE_SETOR1 == f_atv.en_atv_fase: # ajusta a razão de curva em relação ao sentido da orbita if ldefs.E_DIREITA == M_ESP_SENT_CURVA: # curva pela direita (positivo) f_atv.f_atv_raz_crv = -abs(f_atv.f_atv_raz_crv) # senão,... else: # curva pela esquerda (negativo) f_atv.f_atv_raz_crv = abs(f_atv.f_atv_raz_crv) # inicia dados da orbita na pilha f_cine_data.i_setor_ent = 1 f_cine_data.i_bloqueio_fixo = 1 # seguir numa paralela no sentido "oposto" da perna de aproximação f_atv.f_atv_pro_dem = f_cine_data.f_afasta # obtém o tempo limite na perna de aproximação considerando o limite de 14000FT f_cine_data.h_tempo = 90. if (f_atv.f_trf_alt_atu > M_14000FT) else 50. # sinaliza nova fase f_atv.en_atv_fase = ldefs.E_FASE_TEMPO # seguir no rumo perna de afastamento defasado de 30 graus elif ldefs.E_FASE_SETOR2 == f_atv.en_atv_fase: # curva pela direita ? if ldefs.E_DIREITA == M_ESP_SENT_CURVA: # calcula a nova proa de demanda f_atv.f_atv_pro_dem = f_cine_data.f_afasta - 30. # normaliza if f_atv.f_atv_pro_dem < 0.: f_atv.f_atv_pro_dem += 360. # senão, curva pela esquerda else: # calcula a nova proa de demanda f_atv.f_atv_pro_dem = f_cine_data.f_afasta + 30. # normaliza if f_atv.f_atv_pro_dem > 360.: f_atv.f_atv_pro_dem -= 360. # razão de curva pelo menor lado scrv.sentido_curva(f_atv) # tempo na defasagem (1 minuto e meio no limite de 14000FT) f_cine_data.h_tempo = 90. if (f_atv.f_trf_alt_atu > M_14000FT) else 60. # sinaliza nova fase f_atv.en_atv_fase = ldefs.E_FASE_TEMPOSETOR # entrada pelo setor 3 elif ldefs.E_FASE_SETOR3 == f_atv.en_atv_fase: # entrada pelo setor 3 f_atv.f_atv_pro_dem = f_cine_data.f_afasta # entra na órbita f_atv.en_atv_fase = ldefs.E_FASE_CRVAFASTA # curva pela esquerda ? if ldefs.E_ESQUERDA == M_ESP_SENT_CURVA: # curva pela esquerda (negativa) f_atv.f_atv_raz_crv = -abs(f_atv.f_atv_raz_crv) # senão, curva pela direita else: # curva pela direita (positiva) f_atv.f_atv_raz_crv = abs(f_atv.f_atv_raz_crv) # permanência na perna de aproximação elif ldefs.E_FASE_TEMPO == f_atv.en_atv_fase: # permanece na perna de aproximação ? if f_cine_data.h_tempo > 0.: # decrementa o tempo na perna f_cine_data.h_tempo -= ff_delta_t # senão, estorou o tempo else: # nova fase f_atv.en_atv_fase = ldefs.E_FASE_VOLTA # permanência nos 30 graus do rumo para o setor 2 elif ldefs.E_FASE_TEMPOSETOR == f_atv.en_atv_fase: # permanece nos 30 graus ? if f_cine_data.h_tempo > 0.: # decrementa o tempo na perna f_cine_data.h_tempo -= ff_delta_t # senão, estorou o tempo else: # nova fase f_atv.en_atv_fase = ldefs.E_FASE_VOLTA # fase volta ? elif ldefs.E_FASE_VOLTA == f_atv.en_atv_fase: # calcula distância da aeronave ao ponto (x, y) lf_coord_x = f_cine_data.f_pto_x - f_atv.f_trf_x lf_coord_y = f_cine_data.f_pto_y - f_atv.f_trf_y # calcula distância linear da aeronave ao ponto lf_dst_anv_pto = math.sqrt((lf_coord_x ** 2) + (lf_coord_y ** 2)) # calcula nova proa de demanda f_atv.f_atv_pro_dem = cpd.calc_proa_demanda(lf_coord_x, lf_coord_y) # calcula novo sentido de curva scrv.sentido_curva(f_atv) # aeronave atingiu o fixo de orbita ? (distância ao ponto <= passo da aeronave) if lf_dst_anv_pto <= math.sqrt((f_cine_data.f_delta_x ** 2) + (f_cine_data.f_delta_y ** 2)): # checa condição de cancelamento e ajusta a razão if __check_cancel_orbita(f_atv): # ajusta a razão de subida/descida f_atv.f_atv_raz_sub = f_atv.f_prf_raz_des_crz # break return # função operacional anterior era aproximação ? if ldefs.E_APROXIMACAO == f_atv.en_trf_fnc_ope_ant: # aeronave chegou na altitude do fixo de orbita ? if f_atv.f_trf_alt_atu == f_atv.f_atv_alt_dem: # existe algo na pilha ? if len(f_stk_context) > 0: # desempilha o contexto f_atv.en_trf_fnc_ope, f_atv.en_atv_fase, f_atv.ptr_trf_prc, f_atv.ptr_atv_brk, f_cine_data.i_brk_ndx = f_stk_context.pop() # velocidade e proa f_atv.f_atv_vel_dem = f_atv.ptr_trf_prf.f_prf_vel_apx # f_esp_rumo (mlabru) f_atv.f_atv_pro_dem = M_ESP_RUMO # calcula novo sentido de curva scrv.sentido_curva(f_atv) # razão de subida f_atv.f_atv_raz_sub = f_cine_data.f_raz_sub_des # break return # aprumar no rumo da orbita (sentido afastamento) f_atv.f_atv_pro_dem = f_cine_data.f_afasta # entrar na órbita f_atv.en_atv_fase = ldefs.E_FASE_CRVAFASTA f_cine_data.i_setor_ent = 0 f_cine_data.i_bloqueio_fixo = 0 # orbita a direita ? if ldefs.E_DIREITA == M_ESP_SENT_CURVA: if (1 == f_cine_data.i_setor_ent) and (1 == f_cine_data.i_bloqueio_fixo): # ajusta a razão de curva f_atv.f_atv_raz_crv = -abs(f_atv.f_atv_raz_crv) else: # ajusta a razão de curva f_atv.f_atv_raz_crv = abs(f_atv.f_atv_raz_crv) # senão, orbita a esquerda else: if (1 == f_cine_data.i_setor_ent) and (1 == f_cine_data.i_bloqueio_fixo): # ajusta a razão de curva f_atv.f_atv_raz_crv = abs(f_atv.f_atv_raz_crv) else: # ajusta a razão de curva f_atv.f_atv_raz_crv = -abs(f_atv.f_atv_raz_crv) # fase curva de afastamento ? elif ldefs.E_FASE_CRVAFASTA == f_atv.en_atv_fase: # já aprumou ? if f_atv.f_trf_pro_atu == f_atv.f_atv_pro_dem: # obtém o tempo (limite de 14000FT) f_cine_data.h_tempo = 90. if (f_atv.f_trf_alt_atu > M_14000FT) else 50. # sinaliza nova fase f_atv.en_atv_fase = ldefs.E_FASE_TEMPO # senão,... else: # logger l_log = logging.getLogger("prc_orbita::prc_orbita") l_log.setLevel(logging.ERROR) l_log.error("<E06: fase [{}/{}] da orbita não identificada.".format(f_atv.en_atv_fase, ldefs.DCT_FASE[f_atv.en_atv_fase]))
def prc_trajetoria(f_atv, f_cine_data, f_stk_context): """ @param f_atv: pointer to struct aeronave @param f_cine_data: kinematics data @param f_stk_context: pointer to stack """ # check input assert f_atv assert f_cine_data assert f_stk_context is not None # active flight ? if (not f_atv.v_atv_ok) or (ldefs.E_ATIVA != f_atv.en_trf_est_atv): # logger l_log = logging.getLogger("prc_trajetoria") l_log.setLevel(logging.ERROR) l_log.error(u"prc_trajetoria:<E01: aeronave não ativa.") # cai fora... return # pointer to trajetória l_trj = f_atv.ptr_trf_prc # trajetória ok ? if (l_trj is None) or (not l_trj.v_prc_ok): # logger l_log = logging.getLogger("prc_trajetoria") l_log.setLevel(logging.ERROR) l_log.error(u"<E02: trajetória inexistente. aeronave:[{}/{}].".format( f_atv.i_trf_id, f_atv.s_trf_ind)) # trajetória not found, abort procedure abnd.abort_prc(f_atv) # return return # fase de iniciação ? if ldefs.E_FASE_ZERO == f_atv.en_atv_fase: # reseta o flag altitude/velocidade para iniciar uma nova trajetória f_atv.i_atv_change_alt_vel = 0 # inicia o index de breakpoints f_cine_data.i_brk_ndx = 0 # inicia com dados do primeiro breakpoint l_brk = f_atv.ptr_atv_brk = l_trj.lst_trj_brk[0] # breakpoint ok ? if (l_brk is None) or not l_brk.v_brk_ok: # logger l_log = logging.getLogger("prc_trajetoria") l_log.setLevel(logging.ERROR) l_log.error( u"<E03: trajetória/breakpoint inexistente. aeronave:[{}/{}] fase:[{}]." .format(f_atv.i_trf_id, f_atv.s_trf_ind, ldefs.DCT_FASE[f_atv.en_atv_fase])) # não encontrou o breakpoint, abort procedure abnd.abort_prc(f_atv) # return return # obtém dados do breakpoint da trajetória obrk.obtem_brk(f_atv, l_brk, f_cine_data) # fase de direção ao ponto ? elif ldefs.E_FASE_DIRPONTO == f_atv.en_atv_fase: # obter dados do breakpoint da trajetória l_brk = f_atv.ptr_atv_brk # breakpoint ok ? if (l_brk is None) or not l_brk.v_brk_ok: # logger l_log = logging.getLogger("prc_trajetoria") l_log.setLevel(logging.ERROR) l_log.error( u"<E04: trajetória/breakpoint inexistente. aeronave:[{}/{}] fase:[{}]." .format(f_atv.i_trf_id, f_atv.s_trf_ind, ldefs.DCT_FASE[f_atv.en_atv_fase])) # não encontrou o breakpoint, abort procedure abnd.abort_prc(f_atv) # return return # obtém as coordenadas do ponto a ser bloqueado lf_brk_x = f_cine_data.f_coord_x_brk lf_brk_y = f_cine_data.f_coord_y_brk # M_LOG.debug("prc_trajetoria:stk.f_brk_x:[{}] stk.f_brk_y:[{}]".format(f_cine_data.f_coord_x_brk, f_cine_data.f_coord_y_brk)) '''# tratamento para vôo lateral # foi comandado na pilotagem vôo lateral ? if f_atv.f_atv_dst_vlat > 0.: lf_radial = 0. # calcula a radial if 'D' == f_atv.c_atv_dir_vlat: lf_radial = 180. else: lf_radial = 0. if lf_radial <= 90.: lf_radial = 90. - lf_radial else: lf_radial = 450. - lf_radial # converte para radianos lf_radial = math.radians(lf_radial) # calcula as coordenadas x e y relativo ao fixo lf_brk_x = f_atv.f_atv_dst_vlat * math.cos(lf_radial) lf_brk_y = f_atv.f_atv_dst_vlat * math.sin(lf_radial) # calcula a projeção do ponto a ser deslocado "nnn NM" à direita ou à esquerda lf_brk_x = lf_brk_x + l_brk.f_brk_x lf_brk_y = lf_brk_y + l_brk.f_brk_y ''' # faz o direcionamento ao breakpoint if dp.prc_dir_ponto(f_atv, lf_brk_x, lf_brk_y, f_cine_data): # ao bloquear o breakpoint, tem um procedimento associado ? if not tass.trata_associado(f_atv, l_brk, f_cine_data.i_brk_ndx, f_stk_context): # não tem procedimento associado, muda de fase f_atv.en_atv_fase = ldefs.E_FASE_BREAKPOINT # fase rumo/altitude ? elif ldefs.E_FASE_RUMOALT == f_atv.en_atv_fase: # dados do breakpoint da trajetória l_brk = f_atv.ptr_atv_brk # breakpoint ok ? if (l_brk is None) or not l_brk.v_brk_ok: # logger l_log = logging.getLogger("prc_trajetoria") l_log.setLevel(logging.ERROR) l_log.error( u"<E05: trajetória/breakpoint inexistente. aeronave:[{}/{}] fase:[{}]." .format(f_atv.i_trf_id, f_atv.s_trf_ind, ldefs.DCT_FASE[f_atv.en_atv_fase])) # não encontrou o breakpoint, abort procedure abnd.abort_prc(f_atv) # return return # proa e a altitude estão estabilizadas ? if (f_atv.f_trf_pro_atu == f_atv.f_atv_pro_dem) and (f_atv.f_trf_alt_atu == f_atv.f_atv_alt_dem): # não existe procedimento associado ? if not tass.trata_associado(f_atv, f_cine_data.i_brk_ndx, f_stk_context): # muda de fase f_atv.en_atv_fase = ldefs.E_FASE_BREAKPOINT # fase de breakpoint ? elif ldefs.E_FASE_BREAKPOINT == f_atv.en_atv_fase: # é o último breakpoint da trajetoria atual ? if f_atv.ptr_atv_brk == l_trj.lst_trj_brk[-1]: # reset flag altitude/velocidade f_atv.i_atv_change_alt_vel = 0 # não tem dados na pilha ? if not tass.restaura_associado(f_atv, f_cine_data, f_stk_context): # qual a proa que a aeroanve deve seguir após bloquear o último breakpoint ? # trajetória tem proa ? if l_trj.f_trj_proa > 0.: # demanda é a proa da trajetória f_atv.f_atv_pro_dem = l_trj.f_trj_proa # otherwise, trajetória NÃO tem proa... else: # demanda é a proa atual f_atv.f_atv_pro_dem = f_atv.f_trf_pro_atu # força a curva pelo menor lado scrv.sentido_curva(f_atv) # otherwise, tem dados na pilha... else: # o procedimento restaurado NÃO é trajetória ? if ldefs.E_TRAJETORIA != f_atv.en_trf_fnc_ope: # logger # M_LOG.info(u"prc_trajetoria:<E06: procedimento restaurado NÃO é trajetória.") # return return # dados da trajetória anterior l_trj = f_atv.ptr_trf_prc # é o último ponto da trajetoria anterior ? if f_atv.ptr_atv_brk._pNext is None: # bloqueou o último ponto da trajetória anterior, força procedimento manual abnd.abort_prc(f_atv) # qual proa a aeroanve deve seguir após bloquear o último breakpoint ? # trajetória tem proa ? if l_trj.f_trj_proa > 0.: # demanda é a proa da trajetória f_atv.f_atv_pro_dem = l_trj.f_trj_proa # otherwise, trajetória NÃO tem proa... else: # demanda é a proa atual f_atv.f_atv_pro_dem = f_atv.f_trf_pro_atu # força a curva pelo menor lado scrv.sentido_curva(f_atv) # otherwise, não é o último breakpoint da trajetória anterior else: # aponta para o próximo breakpoint da trajetória l_brk = f_atv.ptr_atv_brk = f_atv.ptr_atv_brk._pNext # breakpoint ok ? if (l_brk is None) or not l_brk.v_brk_ok: # logger l_log = logging.getLogger("prc_trajetoria") l_log.setLevel(logging.ERROR) l_log.error( u"<E07: trajetória anterior não é último ponto. aeronave:[{}/{}] fase:[{}]." .format(f_atv.i_trf_id, f_atv.s_trf_ind, ldefs.DCT_FASE[f_atv.en_atv_fase])) # não encontrou o breakpoint, abort procedure abnd.abort_prc(f_atv) # return return # obtém dados do breakpoint da trajetória anterior obrk.obtem_brk(f_atv, l_brk, f_cine_data) # otherwise, não é o último breakpoint else: # próximo breakpoint f_cine_data.i_brk_ndx += 1 # aponta para o próximo breakpoint l_brk = f_atv.ptr_atv_brk = l_trj.lst_trj_brk[ f_cine_data.i_brk_ndx] # breakpoint ok ? if (l_brk is None) or not l_brk.v_brk_ok: # logger l_log = logging.getLogger("prc_trajetoria") l_log.setLevel(logging.ERROR) l_log.error( u"<E08: trajetória/breakpoint inexistente. aeronave:[{}/{}] fase:[{}]." .format(f_atv.i_trf_id, f_atv.s_trf_ind, ldefs.DCT_FASE[f_atv.en_atv_fase])) # não encontrou o breakpoint, abort procedure abnd.abort_prc(f_atv) # return return # obtém dados do breakpoint atual obrk.obtem_brk(f_atv, l_brk, f_cine_data) # fase de direcionamento a um fixo ? elif ldefs.E_FASE_DIRFIXO == f_atv.en_atv_fase: # reseta o flag altitude/velocidade para iniciar uma nova trajetória f_atv.i_atv_change_alt_vel = 0 # aponta para o breakpoint l_brk = f_atv.ptr_atv_brk # breakpoint ok ? if (l_brk is None) or not l_brk.v_brk_ok: # logger l_log = logging.getLogger("prc_trajetoria") l_log.setLevel(logging.ERROR) l_log.error( u"<E09: trajetória/breakpoint inexistente. aeronave:[{}/{}] fase:[{}]." .format(f_atv.i_trf_id, f_atv.s_trf_ind, ldefs.DCT_FASE[f_atv.en_atv_fase])) # não encontrou o breakpoint, abort procedure abnd.abort_prc(f_atv) # return return # obtém dados do breakpoint atual obrk.obtem_brk(f_atv, l_brk, f_cine_data) # otherwise, erro na valor da fase else: # logger l_log = logging.getLogger("prc_trajetoria") l_log.setLevel(logging.ERROR) l_log.error( u"<E10: fase na trajetória não identificada. fase:[{}].".format( ldefs.DCT_FASE[f_atv.en_atv_fase]))
def __ckeck_ok(f_atv, f_cine_data): """ verifica condições da aeronave para o direcionamento ao fixo @param f_atv: ponteiro para aeronave @param f_cine_data: ponteiro para pilha """ # check input assert f_atv assert f_cine_data # active flight ? if (not f_atv.v_atv_ok) or (ldefs.E_ATIVA != f_atv.en_trf_est_atv): # logger l_log = logging.getLogger("prc_dir_fixo::__check_ok") l_log.setLevel(logging.ERROR) l_log.error("<E01: aeronave não ativa.") # cai fora... return # aponta para o fixo a ser interceptado e valida ponteiro l_fix = f_atv.ptr_atv_fix_prc # M_LOG.debug("prc_dir_fixo::ptr_atv_fix_prc:[{}/{}].".format(f_atv.ptr_atv_fix_prc.i_fix_id, f_atv.ptr_atv_fix_prc.s_fix_desc)) if (l_fix is None) or (not l_fix.v_fix_ok): # logger l_log = logging.getLogger("prc_dir_fixo::__ckeck_ok") l_log.setLevel(logging.ERROR) l_log.error(u"<E02: fixo inexistente. aeronave:[{}/{}].".format( f_atv.i_trf_id, f_atv.s_trf_ind)) # não encontrou o fixo, força a aeronave abandonar o procedimento abnd.abort_prc(f_atv) # return return # VOR ? if ldefs.E_VOR == l_fix.en_fix_tipo: # calcula raio do cone de tolerância l_fix.f_fix_rcone = f_atv.f_trf_alt_atu * math.tan(math.radians(30)) # otherwise, outro tipo de fixo else: # calcula raio do cone de tolerância l_fix.f_fix_rcone = f_atv.f_trf_alt_atu * math.tan(math.radians(40)) # distância ao fixo <= raio do cone (ver DadosDinâmicos) if f_atv.f_atv_dst_fix <= l_fix.f_fix_rcone: # sinaliza que aeronave atingiu o ponto através raio do cone f_cine_data.v_interceptou_fixo = True # coloca em manual f_atv.en_trf_fnc_ope = ldefs.E_MANUAL # volta a fase de verificar condições f_atv.en_atv_fase = ldefs.E_FASE_ZERO # return interceptou o fixo return # calcula distância da aeronave ao fixo (x, y) lf_dst_x = f_cine_data.f_dst_anv_fix_x**2 lf_dst_y = f_cine_data.f_dst_anv_fix_y**2 # calcula distância do "passo" da aeronave (x, y) lf_dlt_x = f_cine_data.f_delta_x**2 lf_dlt_y = f_cine_data.f_delta_y**2 # aeronave atingiu fixo ? (distância <= passo da aeronave) if math.sqrt(lf_dst_x + lf_dst_y) <= math.sqrt(lf_dlt_x + lf_dlt_y): # considera que a aeronave atingiu o fixo pelas coordenadas x, y f_cine_data.v_interceptou_fixo = True # coloca em manual f_atv.en_trf_fnc_ope = ldefs.E_MANUAL # volta a fase de verificar condições f_atv.en_atv_fase = ldefs.E_FASE_ZERO # return interceptou o fixo return # calcula nova proa de demanda f_atv.f_atv_pro_dem = cpd.calc_proa_demanda(f_cine_data.f_dst_anv_fix_x, f_cine_data.f_dst_anv_fix_y) # calcula sentido de curva pelo menor ângulo scrv.sentido_curva(f_atv) # ajusta a razão de curva da aeronave razc.calc_razao_curva(f_atv, l_fix.f_fix_x, l_fix.f_fix_y, f_cine_data) # nova fase de processamento f_atv.en_atv_fase = ldefs.E_FASE_DIRFIXO