126 SG_LOG(SG_ATC, SG_ALERT,
127 "AI error: updating aircraft without traffic record at " << SG_ORIGIN);
130 (*i)->setPositionAndHeading(geod.getLatitudeDeg(), geod.getLongitudeDeg(), heading, speed, alt,
AILeg::UNKNOWN);
135 int state = (*i)->getState();
139 if (!(*i)->getAircraft() || !(*i)->getAircraft()->getTrafficRef()) {
140 SG_LOG(SG_ATC, SG_ALERT,
"AI traffic: updating aircraft without traffic ref");
146 time_t startTime = (*i)->getAircraft()->getTrafficRef()->getDepartureTime();
147 time_t now =
globals->get_time_params()->get_cur_time();
150 if (((startTime - now) > 60 && (startTime - now)%60 == 0) ||
151 ((startTime - now) < 60 && (startTime - now) > 0)) {
152 SG_LOG(SG_ATC, SG_BULK, (*i)->getAircraft()->getTrafficRef()->getCallSign() <<
" is scheduled to depart in " << startTime - now <<
" seconds. Available = " <<
available <<
" at parking " <<
getGateName((*i)->getAircraft()));
160 if (now >(startTime + 0)) {
163 if (now >(startTime + 60)) {
166 if (now >(startTime + 80)) {
169 if (now >(startTime + 100)) {
172 if (now >(startTime + 130)) {
175 if (now >(startTime + 140)) {
178 if (now >(startTime + 150)) {
181 if (now >(startTime + 180)) {
186 if (now > startTime + 200) {
187 if ((*i)->pushBackAllowed() && !pushbackBlocked) {
188 (*i)->allowRepeatedTransmissions();
193 if ((*i)->allowTransmissions()) {
196 (*i)->suppressRepeatedTransmissions();
204 (*i)->setHoldPosition(
false);
225 SGMaterialLib *matlib =
globals->get_matlib();
228 globals->get_scenery()->get_scene_graph()->removeChild(
group);
239 SG_LOG(SG_ATC, SG_BULK,
"Rendering startup controller");
240 group =
new osg::Group;
249 time_t now =
globals->get_time_params()->get_cur_time();
252 if ((*i)->isActive(300)) {
254 int pos = (*i)->getCurrentPosition();
255 SG_LOG(SG_ATC, SG_BULK,
"rendering for " << (*i)->getAircraft()->getCallSign() <<
"pos = " << pos);
258 SGGeod start = (*i)->getPos();
259 SGGeod end (segment->
getEnd()->geod());
261 double length = SGGeodesy::distanceM(start, end);
265 SGGeodesy::inverse(start, end, heading, az2, length);
266 double coveredDistance = length * 0.5;
268 SGGeodesy::direct(start, heading, coveredDistance, center, az2);
269 SG_LOG(SG_ATC, SG_BULK,
"Active Aircraft : Centerpoint = (" << center.getLatitudeDeg() <<
", " << center.getLongitudeDeg() <<
"). Heading = " << heading);
273 osg::MatrixTransform *obj_trans =
new osg::MatrixTransform;
274 obj_trans->setDataVariance(osg::Object::STATIC);
276 double elevationStart;
278 elevationStart =
fgGetDouble(
"/position/ground-elev-m");
280 elevationStart = ((*i)->getAircraft()->_getAltitude() * SG_FEET_TO_METER);
282 double elevationEnd = segment->
getEnd()->getElevationM();
283 if ((elevationEnd == 0) || (elevationEnd ==
parent->getElevation())) {
284 SGGeod center2 = end;
285 center2.setElevationM(SG_MAX_ELEVATION_M);
291 elevationEnd =
parent->getElevation();
293 segment->
getEnd()->setElevation(elevationEnd);
296 double elevationMean = (elevationStart + elevationEnd) / 2.0;
297 double elevDiff = elevationEnd - elevationStart;
299 double slope = atan2(elevDiff, length) * SGD_RADIANS_TO_DEGREES;
301 SG_LOG(SG_ATC, SG_BULK,
"1. Using mean elevation : " << elevationMean <<
" and " << slope);
303 WorldCoordinate( obj_pos, center.getLatitudeDeg(), center.getLongitudeDeg(), elevationMean + 0.5 + dx, -(heading), slope );
306 obj_trans->setMatrix( obj_pos );
309 float width = length /2.0;
310 osg::Vec3 corner(-width, 0, 0.25f);
311 osg::Vec3 widthVec(2*width + 1, 0, 0);
312 osg::Vec3 heightVec(0, 1, 0);
313 osg::Geometry* geometry;
314 geometry = osg::createTexturedQuadGeometry(corner, widthVec, heightVec);
315 simgear::EffectGeode* geode =
new simgear::EffectGeode;
316 geode->setName(
"test");
317 geode->addDrawable(geometry);
321 mat = matlib->find(
"UnidirectionalTaperRed", center);
323 mat = matlib->find(
"UnidirectionalTaperGreen", center);
326 geode->setEffect(mat->get_effect());
327 obj_trans->addChild(geode);
330 group->addChild( obj_trans );
333 SG_LOG(SG_ATC, SG_DEBUG,
"BIG FAT WARNING: current position is here : " << pos);
335 for (
intVecIterator j = (*i)->getIntentions().begin(); j != (*i)->getIntentions().end(); ++j) {
339 SG_LOG(SG_ATC, SG_BULK,
"rendering for " << (*i)->getAircraft()->getCallSign() <<
"intention = " << k);
340 osg::MatrixTransform *obj_trans =
new osg::MatrixTransform;
341 obj_trans->setDataVariance(osg::Object::STATIC);
344 double elevationStart = segment->
getStart()->getElevationM();
345 double elevationEnd = segment->
getEnd ()->getElevationM();
346 if ((elevationStart == 0) || (elevationStart ==
parent->getElevation())) {
347 SGGeod center2 = segment->
getStart()->geod();
348 center2.setElevationM(SG_MAX_ELEVATION_M);
354 elevationStart =
parent->getElevation();
356 segment->
getStart()->setElevation(elevationStart);
358 if ((elevationEnd == 0) || (elevationEnd ==
parent->getElevation())) {
359 SGGeod center2 = segment->
getEnd()->geod();
360 center2.setElevationM(SG_MAX_ELEVATION_M);
366 elevationEnd =
parent->getElevation();
368 segment->
getEnd()->setElevation(elevationEnd);
371 double elevationMean = (elevationStart + elevationEnd) / 2.0;
372 double elevDiff = elevationEnd - elevationStart;
374 double slope = atan2(elevDiff, length) * SGD_RADIANS_TO_DEGREES;
376 SG_LOG(SG_ATC, SG_BULK,
"2. Using mean elevation : " << elevationMean <<
" and " << slope);
380 segCenter.getLongitudeDeg(), elevationMean + 0.5 + dx, -(segment->
getHeading()), slope );
384 obj_trans->setMatrix( obj_pos );
388 osg::Vec3 corner(-width, 0, 0.25f);
389 osg::Vec3 widthVec(2*width + 1, 0, 0);
390 osg::Vec3 heightVec(0, 1, 0);
391 osg::Geometry* geometry;
392 geometry = osg::createTexturedQuadGeometry(corner, widthVec, heightVec);
393 simgear::EffectGeode* geode =
new simgear::EffectGeode;
394 geode->setName(
"test");
395 geode->addDrawable(geometry);
399 mat = matlib->find(
"UnidirectionalTaperRed", segCenter);
401 mat = matlib->find(
"UnidirectionalTaperGreen", segCenter);
404 geode->setEffect(mat->get_effect());
405 obj_trans->addChild(geode);
408 group->addChild( obj_trans );
410 SG_LOG(SG_ATC, SG_DEBUG,
"BIG FAT WARNING: k is here : " << pos);
416 globals->get_scenery()->get_scene_graph()->addChild(
group);