int main(int argc, char *argv[]){ //Check option values from command line. //checkOption(argc, argv); //Apply option values to simulation settings. simSetting(argc,argv); if((gFileSta=fopen("sta's buffer.txt", "w"))==NULL){ printf("File cannot open! 3"); exit(33); } staInfo *sta; sta = (staInfo*)malloc(sizeof(staInfo)*gSpec.numSta); apInfo ap; resultInfo result; //Intialize result information. initializeResult(&result); if(gSpec.fDebug==true){ debug(); //printf("End debug.\n"); //exit(99); } int numTx = 0; int trialID; bool fEmpty = false; for (trialID=0; trialID<gSpec.numTrial; trialID++){ srand(trialID); numTx = 0; fEmpty = false; initializeNodeInfo(sta, &ap); gElapsedTime = (double)gStd.difs; idle(sta, &ap, &numTx, &fEmpty); //Wrong? fEmpty=true? for(; gElapsedTime<gSpec.simTime*1000000;){ if(numTx==1){ //debugSta(&sta[7],7); txSuccess(sta, &ap, &numTx); fEmpty = true; for(int i=0; i<gSpec.numSta; i++){ if(sta[i].buffer[0].lengthMsdu!=0){ fEmpty = false; break; } } if(ap.buffer[0].lengthMsdu!=0){ fEmpty = false; } if(fEmpty==true){ idle(sta, &ap, &numTx, &fEmpty); }else{ afterSuccess(sta, &ap, &numTx); } }else{ txCollision(sta, &ap); afterCollision(sta, &ap, &numTx); } } simulationResult(sta, &ap, &result, trialID); } if(gSpec.fOutput==true){ fclose(gSpec.output); } fclose(gFileSta); free(sta); return 0; }
int AirsideSimulation::AirsideEventListInitialize( EventList* _eventlist) { PLACE_METHOD_TRACK_STRING(); if(!m_bInitialized) return FALSE; //flight init time CArrivalETAOffsetList vETAoffsetSet; vETAoffsetSet.SetAirportDatabase(m_pEngine->getTerminal()->m_pAirportDB); vETAoffsetSet.ReadData(m_nPrjID); ElapsedTime tMinTime = ElapsedTime::Max(); for (int i = 0; i < m_pEngine->m_simFlightSchedule.getCount();i++) //it should user the m_simFlightSchedule, it's the flight which has been filted { Flight * pFlt = m_pEngine->m_simFlightSchedule.getItem(i); pFlt->SetFlightIndex(i) ; // set the flight id to index , make the flight id is equal with the log entry. //add birth event to list AirsideFlightInSim * pFlightInSim = new AirsideFlightInSim(m_pEngine,pFlt, i); m_vFlights.push_back(pFlightInSim); pFlightInSim->SetOutput(m_pOuput); pFlightInSim->SetAirTrafficController(&m_AirTrafficController); pFlightInSim->SetPerformance(&m_FlightPerformanceManager); pFlightInSim->InitScheduleEndTime(m_pEngine->getTerminal()->flightSchedule->GetFlightScheduleEndTime()); //init vehicle service information CFlightServiceInformation* pServiceInfo = new CFlightServiceInformation(pFlightInSim); FlightTypeDetailsManager *pManager = m_pFlightServiceManager->GetFlightServiceManager(); FlightTypeDetailsItem *pItem = pManager->GetFlightDetailItem( pFlightInSim->GetLogEntry().GetAirsideDesc() ); if (pItem) { pServiceInfo->SetFltServiceLocations(pItem->GetRelativeLocations()); pServiceInfo->SetRingRoute(pItem->GetRingRoad()); } pFlightInSim->SetFlightServiceInformation(pServiceInfo); pFlightInSim->SetServiceRequestDispatcher(m_pVehicleRequestDispatcher); // //init arrival time pFlightInSim->InitBirth(vETAoffsetSet,m_simConfig); tMinTime = min( pFlightInSim->GetBirthTime(),tMinTime); CAirsideMobileElementEvent *fltbirth = NULL; if( m_simConfig.bOnlySimStand) { fltbirth = new FlightBirthTerminalEvent(pFlightInSim, m_Resource.GetAirportResource()->getStandResource()); } else { if (m_pEngine->IsOnboardSel()) fltbirth = new FlightBirthEvent(pFlightInSim,m_pEngine); else fltbirth = new FlightBirthEvent(pFlightInSim); } fltbirth->setTime(pFlightInSim->GetBirthTime()); fltbirth->addEvent(); //generate onboard flight close door event OnboardFlightGeneration(pFlightInSim); //Init Stand assignment register ALTObjectID standID; { StandInSim* pArrStand = NULL; StandInSim* pDepStand = NULL; StandInSim* pIntStand = NULL; ElapsedTime tArrOnTime; ElapsedTime tArrOffTime; ElapsedTime tDepOnTime; ElapsedTime tDepOffTime; ElapsedTime tIntOnTime; ElapsedTime tIntOffTime; if (pFlightInSim->IsArrival()) { standID = pFlightInSim->getArrStand(); pArrStand = m_Resource.GetAirportResource()->getStandResource()->GetStandByName(standID); if (pArrStand) { tArrOnTime = pFlightInSim->getArrTime(); tArrOffTime = tArrOnTime + pFlightInSim->getServiceTime(ARR_PARKING); pArrStand->GetStandAssignmentRegister()->StandAssignmentRecordInit(pFlightInSim, ARR_PARKING, tArrOnTime, tArrOffTime); if (!pFlightInSim->IsDeparture()) { WriteStandPlanLog(pFlightInSim, pArrStand, ARR_PARKING, tArrOnTime, tArrOffTime); } } } if (pFlightInSim->IsDeparture()) { standID = pFlightInSim->getDepStand(); pDepStand = m_Resource.GetAirportResource()->getStandResource()->GetStandByName(standID); if (pDepStand) { tDepOffTime = pFlightInSim->getDepTime(); tDepOnTime = tDepOffTime - pFlightInSim->getServiceTime(DEP_PARKING); pDepStand->GetStandAssignmentRegister()->StandAssignmentRecordInit(pFlightInSim, DEP_PARKING, tDepOnTime, tDepOffTime); if (!pFlightInSim->IsArrival()) { WriteStandPlanLog(pFlightInSim, pDepStand, DEP_PARKING, tDepOnTime, tDepOffTime); } } } if (!pFlightInSim->GetFlightInput()->getIntermediateStand().IsBlank()) { standID = pFlightInSim->GetFlightInput()->getIntermediateStand(); pIntStand = m_Resource.GetAirportResource()->getStandResource()->GetStandByName(standID); if (pIntStand) { ElapsedTime tIntOnTime = pFlightInSim->getArrTime() + pFlightInSim->getServiceTime(ARR_PARKING); ElapsedTime tIntOffTime = tIntOnTime + pFlightInSim->getServiceTime(INT_PARKING); pIntStand->GetStandAssignmentRegister()->StandAssignmentRecordInit(pFlightInSim, INT_PARKING, tIntOnTime, tIntOffTime); WriteStandPlanLog(pFlightInSim, pIntStand, INT_PARKING, tIntOnTime, tIntOffTime); } } if (pFlightInSim->IsArrival() && pFlightInSim->IsDeparture()) { if (pIntStand || pArrStand != pDepStand) { if (pArrStand) WriteStandPlanLog(pFlightInSim, pArrStand, ARR_PARKING, tArrOnTime, tArrOffTime); if (pDepStand) WriteStandPlanLog(pFlightInSim, pDepStand, DEP_PARKING, tDepOnTime, tDepOffTime); } else { if(pArrStand) WriteStandPlanLog(pFlightInSim, pArrStand, ARR_PARKING, tArrOnTime, tDepOffTime); } } } } if(m_simConfig.bOnlySimStand) { InitAirsideFlightExtraInfomation(); return TRUE; } CAirsideSimSettingClosure simSetting(m_nPrjID); simSetting.ReadData(); if (simSetting.IsItinerantFlight()) { AirsideItinerantFlightInSimGenerator itiFltGenrator(m_nPrjID, m_pEngine->getTerminal(), m_pEngine->getTerminal()->flightSchedule->getCount(), this); itiFltGenrator.GenerateFlight(m_pEngine); } int nGeneratorCount = (int)m_vFlights.size(); if(simSetting.IsTrainingFlight()) { AirsideCircuiteFlightInSimGenerator circuiteFlightGenerator(m_pEngine->getTerminal(),this,nGeneratorCount); circuiteFlightGenerator.GenerateCircuiteFlight(m_pEngine,m_pTrainFlightsManger); } InitAirsideFlightExtraInfomation(); //call this after all flight's info is prepared m_AirTrafficController.SetFlightList(m_vFlights); UpdateFlightWingSpanInfo(m_vFlights); m_bAllowCyclicGroundRoute = simSetting.AllowCyclicGroundRoute(); bool bVehicleService = simSetting.IsVehicleService(); m_pVehicleRequestDispatcher->SetVehicleService(bVehicleService); // int nVehicleBeginCount = 0; int nNextVehicleUnqiueID = 0; if (bVehicleService) { if(m_pVehicleSpecifications != NULL) delete m_pVehicleSpecifications; m_pVehicleSpecifications = new CVehicleSpecifications(); m_pVehicleSpecifications->ReadData(m_nPrjID); VehiclePoolResourceManager* pPoolRes = m_Resource.GetAirportResource()->getVehicleResource(); for (int i =0; i < pPoolRes->GetVehiclePoolCount(); i++) { VehiclePoolInSim* pPool = pPoolRes->GetVehiclePoolByIdx(i); if (pPool) { pPool->SetVehicleRequestDispatcher(m_pVehicleRequestDispatcher); pPool->SetVehiclePoolDeployment(m_pVehiclePoolsDeployment); int nPoolId = pPool->GetVehiclePoolID(); for (int j =0; j < m_pVehiclePoolsDeployment->GetVehicleTypeCount(); j++) { int nVehicleTypeID =m_pVehiclePoolsDeployment->GetVehicleTypeIDByIdx(j); int nCount = m_pVehiclePoolsDeployment->GetVehicleQuantityInPool(nVehicleTypeID,nPoolId); if (nCount > 0) { CVehicleSpecificationItem* pVehicleSpecItem = m_pVehicleSpecifications->GetVehicleItemByID(nVehicleTypeID); VehicleGeneration(nNextVehicleUnqiueID,nCount,pVehicleSpecItem,nPoolId,tMinTime,m_pVehicleSpecifications); } } } } } return TRUE; }