#else
while ( ! in.eof() ) {
#endif
-
- FGILS ils;
- in >> ils;
- if ( ils.get_ilstype() == '[' ) {
+
+ FGILS *ils = new FGILS;
+ in >> (*ils);
+ if ( ils->get_ilstype() == '[' ) {
break;
}
cout << " locfreq = " << ils.get_locfreq() << endl;
cout << " locident = " << ils.get_locident() << endl << endl; */
- ilslist[ils.get_locfreq()].push_back(ils);
+ ilslist[ils->get_locfreq()].push_back(ils);
in >> skipcomment;
/* if ( ils.get_locfreq() < min ) {
} */
// update the marker beacon list
- if ( fabs(ils.get_omlon()) > SG_EPSILON ||
- fabs(ils.get_omlat()) > SG_EPSILON ) {
- current_beacons->add( ils.get_omlon(), ils.get_omlat(),
- ils.get_gselev(), FGMkrBeacon::OUTER );
+ if ( fabs(ils->get_omlon()) > SG_EPSILON ||
+ fabs(ils->get_omlat()) > SG_EPSILON ) {
+ current_beacons->add( ils->get_omlon(), ils->get_omlat(),
+ ils->get_gselev(), FGMkrBeacon::OUTER );
}
- if ( fabs(ils.get_mmlon()) > SG_EPSILON ||
- fabs(ils.get_mmlat()) > SG_EPSILON ) {
- current_beacons->add( ils.get_mmlon(), ils.get_mmlat(),
- ils.get_gselev(), FGMkrBeacon::MIDDLE );
+ if ( fabs(ils->get_mmlon()) > SG_EPSILON ||
+ fabs(ils->get_mmlat()) > SG_EPSILON ) {
+ current_beacons->add( ils->get_mmlon(), ils->get_mmlat(),
+ ils->get_gselev(), FGMkrBeacon::MIDDLE );
}
- if ( fabs(ils.get_imlon()) > SG_EPSILON ||
- fabs(ils.get_imlat()) > SG_EPSILON ) {
- current_beacons->add( ils.get_imlon(), ils.get_imlat(),
- ils.get_gselev(), FGMkrBeacon::INNER );
+ if ( fabs(ils->get_imlon()) > SG_EPSILON ||
+ fabs(ils->get_imlat()) > SG_EPSILON ) {
+ current_beacons->add( ils->get_imlon(), ils->get_imlat(),
+ ils->get_gselev(), FGMkrBeacon::INNER );
}
}
}
-// query the database for the specified frequency, lon and lat are in
-// degrees, elev is in meters
-bool FGILSList::query( double lon, double lat, double elev, double freq,
- FGILS *ils )
+// Query the database for the specified frequency. It is assumed that
+// there will be multiple stations with matching frequencies so a
+// position must be specified. Lon and lat are in degrees, elev is in
+// meters.
+FGILS *FGILSList::findByFreq( double freq,
+ double lon, double lat, double elev )
{
- ils_list_type stations = ilslist[(int)(freq*100.0 + 0.5)];
+ FGILS *ils = NULL;
- ils_list_iterator current = stations.begin();
- ils_list_iterator last = stations.end();
+ ils_list_type stations = ilslist[(int)(freq*100.0 + 0.5)];
double best_angle = 362.0;
- bool found_one = false;
// double az1, az2, s;
Point3D aircraft = sgGeodToCart( Point3D(lon, lat, elev) );
Point3D station;
- double d;
- for ( ; current != last ; ++current ) {
+ double d2;
+ for ( unsigned int i = 1; i < stations.size(); ++i ) {
// cout << " testing " << current->get_locident() << endl;
- station = Point3D(current->get_x(),
- current->get_y(),
- current->get_z());
+ station = Point3D(stations[i]->get_x(),
+ stations[i]->get_y(),
+ stations[i]->get_z());
// cout << " aircraft = " << aircraft << " station = " << station
// << endl;
- d = aircraft.distance3Dsquared( station );
+ d2 = aircraft.distance3Dsquared( station );
// cout << " distance = " << d << " ("
// << FG_ILS_DEFAULT_RANGE * SG_NM_TO_METER
// * FG_ILS_DEFAULT_RANGE * SG_NM_TO_METER
// cout << " dist = " << s << endl;
// match up to twice the published range so we can model
- // reduced signal strength
- if ( d < (2* FG_ILS_DEFAULT_RANGE * SG_NM_TO_METER
- * 2 * FG_ILS_DEFAULT_RANGE * SG_NM_TO_METER) ) {
-
- found_one = true;
+ // reduced signal strength. The assumption is that there will
+ // be maximum of two possbile stations of a particular
+ // frequency in range. If two exist, one will be associated
+ // with each end of the runway. In this case, pick the
+ // station pointing most directly at us.
+ if ( d2 < (2* FG_ILS_DEFAULT_RANGE * SG_NM_TO_METER
+ * 2 * FG_ILS_DEFAULT_RANGE * SG_NM_TO_METER) ) {
// Get our bearing from this station.
double reciprocal_bearing, dummy;
double a_lat_deg = lat * SGD_RADIANS_TO_DEGREES;
double a_lon_deg = lon * SGD_RADIANS_TO_DEGREES;
// Locator beam direction
- double s_ils_deg = current->get_locheading() - 180.0;
+ double s_ils_deg = stations[i]->get_locheading() - 180.0;
if ( s_ils_deg < 0.0 ) { s_ils_deg += 360.0; }
double angle_to_beam_deg;
// printf("**ALI geting geo_inverse_wgs_84 with elev = %.2f, a.lat = %.2f, a.lon = %.2f,
- // s.lat = %.2f, s.lon = %.2f\n", elev,a_lat_deg,a_lon_deg,current->get_loclat(),current->get_loclon());
+ // s.lat = %.2f, s.lon = %.2f\n", elev,a_lat_deg,a_lon_deg,stations[i]->get_loclat(),stations[i]->get_loclon());
- geo_inverse_wgs_84( elev, current->get_loclat(),
- current->get_loclon(), a_lat_deg, a_lon_deg,
+ geo_inverse_wgs_84( elev, stations[i]->get_loclat(),
+ stations[i]->get_loclon(), a_lat_deg, a_lon_deg,
&reciprocal_bearing, &dummy, &dummy );
angle_to_beam_deg = fabs(reciprocal_bearing - s_ils_deg);
if ( angle_to_beam_deg <= best_angle ) {
- *ils = *current;
+ *ils = *stations[i];
best_angle = angle_to_beam_deg;
}
}
}
- return found_one;
+ return ils;
}