Exemplo da Aimsun Next Micro API 8¶
Exemplo de Controle (Prioridade de Ônibus em um Cruzamento)¶
Este exemplo mostra como usar a função da Aimsun Next API para gerenciar o plano de controle de modo que os ônibus que se aproximam de um cruzamento tenham sinal verde ao chegarem ao cruzamento. Uma vez que o ônibus sai do cruzamento, o plano de controle é restabelecido ao estado em que a chamada do ônibus foi detectada.
Versão em C++¶
#include "AKIProxie.h"
#include "CIProxie.h"
#include "ANGConProxie.h"
#include "AAPI.h"
#include <stdio.h>
double previousPhaseIndex, previousPhaseTime;
// Os procedimentos podem ser modificados pelo usuário
int AAPILoad()
{   
    return 0;
}
int AAPIInit()
{   
    ANGConnEnableVehiclesInBatch(true);
    previousPhaseIndex = -1;
    previousPhaseTime = -1; 
    return 0;
}
int AAPISimulationReady()
{
    return 0;
}
int AAPIManage(double time, double timeSta, double timeTrans, double acycle)
{
    return 0;
}
int AAPIPostManage(double time, double timeSta, double timeTrans, double acycle)
{ 
    int busPhase = 3;
    int intersection = 203;
    int busCallDetector = 383;
    int busExitDetector = 378;
    //obter a posição interna do ônibus
    int busVehiclePosition = AKIVehGetVehTypeInternalPosition( 9 );
    int currentPhase = ECIGetCurrentPhase( intersection );
    //verificar presença do ônibus no busCallDetector 
    if( AKIDetGetCounterCyclebyId( busCallDetector, busVehiclePosition ) > 0 && currentPhase != busPhase && previousPhaseIndex == -1){
        AKIPrintString( "ônibus detectado");            
        #mudar o controle para a fase do ônibus
        previousPhaseIndex = currentPhase;
        previousPhaseTime = time - ECIGetStartingTimePhase( intersection );
        ECIChangeDirectPhase( intersection, busPhase, timeSta, time, acycle, 0 );
    }   
    //verificar presença do ônibus no busExitDetector
    if( AKIDetGetCounterCyclebyId( busExitDetector, busVehiclePosition ) > 0 ){     
        //voltar para a fase anterior
        if( previousPhaseIndex > 0 ){
            AKIPrintString( "voltar para o estado anterior");               
            ECIChangeDirectPhase( intersection, previousPhaseIndex, timeSta, time, acycle, previousPhaseTime);
            previousPhaseIndex = -1;
            previousPhaseTime = -1; 
        }
    }
    return 0;
}
int AAPIFinish()
{
    return 0;
}
int AAPIUnLoad()
{
    return 0;
}
Versão em Python¶
from AAPI import *
def AAPILoad(): 
    return 0
def AAPIInit(): 
    return 0
def AAPISimulationReady():
    return 0
def AAPIManage(time, timeSta, timeTrans, acycle):   
    return 0
def AAPIPostManage(time, timeSta, timeTrans, acycle):
    global previousPhaseIndex
    global previousPhaseTime
    busPhase = 3
    intersection = 203
    busCallDetector = 383
    busExitDetector = 378
    #obter a posição interna do ônibus
    busVehiclePosition = AKIVehGetVehTypeInternalPosition( 9 )
    currentPhase = ECIGetCurrentPhase( intersection )
    #verificar presença do ônibus no busCallDetector 
    if AKIDetGetCounterCyclebyId( busCallDetector, busVehiclePosition ) > 0 and currentPhase != busPhase and previousPhaseIndex == -1:
        print "ônibus detectado"                    
        #mudar o controle para a fase do ônibus
        previousPhaseIndex = currentPhase
        previousPhaseTime = time - ECIGetStartingTimePhase( intersection )
        ECIChangeDirectPhase( intersection, busPhase, timeSta, time, acycle, 0 )
    #verificar presença do ônibus no busExitDetector
    if AKIDetGetCounterCyclebyId( busExitDetector, busVehiclePosition ) > 0:        
        #voltar para a fase anterior
        if previousPhaseIndex > 0:
            print "voltar para o estado anterior"                   
            ECIChangeDirectPhase( intersection, previousPhaseIndex, timeSta, time, acycle, previousPhaseTime)
            previousPhaseIndex = -1
            previousPhaseTime = -1
    return 0
def AAPIFinish():   
    return 0
def AAPIUnLoad():   
    return 0
previousPhaseIndex = -1
previousPhaseTime = -1