71 trans_num =
globals->get_props()->getNode(
"/sim/atc/transmission-num",
true);
78 bool onGround =
fgGetBool(
"/sim/presets/onground");
80 string curAirport =
fgGetString(
"/sim/presets/airport-id");
81 string parking =
fgGetString(
"/sim/presets/parkpos");
83 _routeManagerDestinationAirportNode =
globals->get_props()->getNode(
"/autopilot/route-manager/destination/airport",
true);
84 destination = _routeManagerDestinationAirportNode->getStringValue();
88 string callsign = userAircraft->getCallSign();
92 double aircraftRadius = 40;
95 if (destination.empty()) {
96 destination = curAirport;
102 userAircraftTrafficRef->setFlightType(
"gate");
105 userAircraftScheduledFlight->setDepartureAirport(curAirport);
106 userAircraftScheduledFlight->setArrivalAirport(destination);
107 userAircraftScheduledFlight->initializeAirports();
108 userAircraftScheduledFlight->setFlightRules(
"IFR");
109 userAircraftScheduledFlight->setCallSign(callsign);
111 userAircraftTrafficRef->assign(userAircraftScheduledFlight.get());
112 std::unique_ptr<FGAIFlightPlan> fp ;
113 userAircraft->setTrafficRef(userAircraftTrafficRef.get());
121 if (dcs && onGround) {
125 if (parking ==
"AVAILABLE") {
126 double radius =
fgGetDouble(
"/sim/dimensions/radius-m");
128 pk = dcs->getAvailableParking(radius,
string(),
string(),
string());
139 return a->getRadius() > b->getRadius();
142 fgSetString(
"/sim/presets/parkpos", pkl.front()->getName());
145 }
else if (!parking.empty()) {
146 pk = dcs->getAvailableParkingByName(parking);
150 dcs->setParkingAvailable(pk.
parking(),
false);
152 controller = dcs->getStartupController();
153 int stationFreq = dcs->getGroundFrequency(1);
156 SG_LOG(SG_ATC, SG_DEBUG,
"Setting radio frequency to : " << stationFreq);
157 fgSetDouble(
"/instrumentation/comm[0]/frequencies/selected-mhz", ((
double) stationFreq / 100.0));
167 if (!(fp->createPushBack(userAircraft,
180 }
else if (!runway.empty()) {
183 controller = dcs->getTowerController();
184 int stationFreq = dcs->getTowerFrequency(2);
187 SG_LOG(SG_ATC, SG_DEBUG,
"Setting radio frequency to inair frequency : " << stationFreq);
188 fgSetDouble(
"/instrumentation/comm[0]/frequencies/selected-mhz", ((
double) stationFreq / 100.0));
192 string fltType =
"ga";
193 fp->setRunway(runway);
194 fp->createTakeOff(userAircraft,
false, dcs->parent(), userAircraft->getGeodPos(), 0, fltType);
203 userAircraft->FGAIBase::setFlightPlan(std::move(fp));
204 controller =
nullptr;
206 initSucceeded =
true;
210 if (fp && !fp->empty()) {
211 fp->getLastWaypoint()->setName( fp->getLastWaypoint()->getName() +
string(
"legend"));
214 controller =
nullptr;
224 userAircraft->FGAIBase::setFlightPlan(std::move(fp));
230 controller->announcePosition(userAircraft->getID(), plan,
232 userAircraft->_getLatitude(),
233 userAircraft->_getLongitude(),
234 userAircraft->_getHeading(),
235 userAircraft->getSpeed(),
236 userAircraft->getAltitude(),
237 aircraftRadius, leg, userAircraft);
239 initSucceeded =
true;
309 FGAIAircraft* user_ai_ac = aiManager->getUserAircraft();
313 string result = _routeManagerDestinationAirportNode->getStringValue();
315 if (destination != result && result !=
"") {
316 destination = result;
317 userAircraftScheduledFlight->setArrivalAirport(destination);
318 userAircraftScheduledFlight->initializeAirports();
319 userAircraftTrafficRef->clearAllFlights();
320 userAircraftTrafficRef->assign(userAircraftScheduledFlight.get());
322 auto userAircraft = aiManager->getUserAircraft();
323 userAircraft->setTrafficRef(userAircraftTrafficRef.get());
339 SG_LOG(SG_ATC, SG_DEBUG,
"Size of waypoint queue " << size);
340 for (
int i = 0;
i < size;
i++) {
345 SG_LOG(SG_ATC, SG_BULK,
"[done ]");
348 SG_LOG(SG_ATC, SG_BULK,
"[done ]");
352 SG_LOG(SG_ATC, SG_BULK,
"User aircraft currently at leg : " << fp->
getLeg());
367 SG_LOG(SG_ATC, SG_BULK,
"Currently under control of " << controller->getName());
371 controller->updateAircraftInformation(user_ai_ac->getID(),
372 user_ai_ac->getGeodPos(),
373 user_ai_ac->_getHeading(),
374 user_ai_ac->getSpeed(),
375 user_ai_ac->getAltitude(), time);
380 if (userAircraftTrafficRef->getDepartureAirport()->getDynamics())
381 controller = userAircraftTrafficRef->getDepartureAirport()->getDynamics()->getStartupController();
384 if (userAircraftTrafficRef->getDepartureAirport()->getDynamics()->getGroundController()->exists())
385 controller = userAircraftTrafficRef->getDepartureAirport()->getDynamics()->getGroundController();
388 if (userAircraftTrafficRef->getDepartureAirport()->getDynamics()) {
389 controller = userAircraftTrafficRef->getDepartureAirport()->getDynamics()->getTowerController();
391 SG_LOG(SG_AI, SG_BULK,
"Error: Could not find Dynamics at airport : " << userAircraftTrafficRef->getDepartureAirport()->getId());
407 SG_LOG(SG_AI, SG_BULK,
"Will be signing off user ai " << user_ai_ac->getID() <<
" from " << prevController->getName());
409 controller =
nullptr;
413 if ((controller != prevController) && prevController && !user_ai_ac->getDie()) {
415 prevController->signOff(user_ai_ac->getID());
417 prevController = controller;
429 int n = trans_num->getIntValue();
432 SG_LOG(SG_ATC, SG_DEBUG,
"Toggling ground network visibility " << networkVisible);
433 networkVisible = !networkVisible;
434 trans_num->setIntValue(-1);
438 if ((controller != prevController) && (prevController)) {
439 prevController->render(
false);
444 controller->render(networkVisible);
445 if (networkVisible) {
446 SG_LOG(SG_ATC, SG_BULK,
"Adding ground network to the scenegraph::update");
451 prevController = controller;
455 for (
AtcVecIterator atc = activeStations.begin(); atc != activeStations.end(); ++atc) {
456 (*atc)->update(time);