Exemple #1
0
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
Exemple #2
0
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]))
Exemple #3
0
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]))
Exemple #4
0
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