setRunwayReciprocal = prepare("UPDATE runway SET reciprocal=?2 WHERE rowid=?1");
setRunwayILS = prepare("UPDATE runway SET ils=?2 WHERE rowid=?1");
+ setNavaidColocated = prepare("UPDATE navaid SET colocated=?2 WHERE rowid=?1");
updateRunwayThreshold = prepare("UPDATE runway SET heading=?2, displaced_threshold=?3, stopway=?4 WHERE rowid=?1");
insertPositionedQuery = prepare("INSERT INTO positioned "
}
int rangeNm = sqlite3_column_int(loadNavaid, 0),
- freq = sqlite3_column_int(loadNavaid, 1);
+ freq = sqlite3_column_int(loadNavaid, 1);
double mulituse = sqlite3_column_double(loadNavaid, 2);
- //sqlite3_int64 colocated = sqlite3_column_int64(loadNavaid, 4);
+ PositionedID colocated = sqlite3_column_int64(loadNavaid, 4);
reset(loadNavaid);
-
- return new FGNavRecord(rowId, ty, id, name, pos, freq, rangeNm, mulituse, runway);
+
+ FGNavRecord* n = new FGNavRecord(rowId, ty, id, name, pos, freq, rangeNm, mulituse, runway);
+ if (colocated) {
+ n->setColocatedDME(colocated);
+ }
+
+ return n;
}
FGPositioned* loadParking(sqlite3_int64 rowId,
sqlite3_stmt_ptr insertPositionedQuery, insertAirport, insertTower, insertRunway,
insertCommStation, insertNavaid;
- sqlite3_stmt_ptr setAirportMetar, setRunwayReciprocal, setRunwayILS,
+ sqlite3_stmt_ptr setAirportMetar, setRunwayReciprocal, setRunwayILS, setNavaidColocated,
setAirportPos, updateRunwayThreshold, updateILS;
sqlite3_stmt_ptr removePOIQuery;
sqlite3_bind_int(d->insertNavaid, 3, range);
sqlite3_bind_double(d->insertNavaid, 4, multiuse);
sqlite3_bind_int64(d->insertNavaid, 5, runway);
+ sqlite3_bind_int64(d->insertNavaid, 6, 0);
return d->execInsert(d->insertNavaid);
}
+void NavDataCache::setNavaidColocated(PositionedID navaid, PositionedID colocatedDME)
+{
+ // Update DB entries...
+ sqlite3_bind_int64(d->setNavaidColocated, 1, navaid);
+ sqlite3_bind_int64(d->setNavaidColocated, 2, colocatedDME);
+ d->execUpdate(d->setNavaidColocated);
+
+ // ...and the in-memory copy of the navrecord
+ if (d->cache.find(navaid) != d->cache.end()) {
+ FGNavRecord* rec = (FGNavRecord*) d->cache[navaid].get();
+ rec->setColocatedDME(colocatedDME);
+ }
+}
+
void NavDataCache::updateILS(PositionedID ils, const SGGeod& newPos, double aHdg)
{
sqlite3_bind_int64(d->updateILS, 1, ils);
const std::string& name, const SGGeod& pos, int freq, int range, double multiuse,
PositionedID apt, PositionedID runway);
void updateILS(PositionedID ils, const SGGeod& newPos, double aHdg);
+
+
+ // Assign colocated DME to a navaid
+ void setNavaidColocated(PositionedID navaid, PositionedID colocatedDME);
PositionedID insertCommStation(FGPositioned::Type ty,
const std::string& name, const SGGeod& pos, int freq, int range,
* Given a runway and type, find the corresponding navaid (ILS / GS / OM)
*/
PositionedID findNavaidForRunway(PositionedID runway, FGPositioned::Type ty);
-
+
/**
* given a navaid name (or similar) from apt.dat / nav.dat, find the
* corresponding airport and runway IDs.
namespace flightgear
{
-
+
static PositionedID readNavFromStream(std::istream& aStream,
FGPositioned::Type type = FGPositioned::INVALID)
{
AirportRunwayPair arp;
FGRunway* runway = NULL;
-
- // FIXME - also relate DMEs, but only ILS/LOC DMEs - need a heuristic
- // on the DME naming string
+ PositionedID navaid_dme = 0;
+
+ if (type == FGPositioned::DME) {
+ FGPositioned::TypeFilter f(FGPositioned::INVALID);
+ if ( name.find("VOR-DME") != std::string::npos ) {
+ f.addType(FGPositioned::VOR);
+ } else if ( name.find("DME-ILS") != std::string::npos ) {
+ f.addType(FGPositioned::ILS);
+ f.addType(FGPositioned::LOC);
+ } else if ( name.find("VORTAC") != std::string::npos ) {
+ f.addType(FGPositioned::VOR);
+ } else if ( name.find("NDB-DME") != std::string::npos ) {
+ f.addType(FGPositioned::NDB);
+ } else if ( name.find("TACAN") != std::string::npos ) {
+ f.addType(FGPositioned::VOR);
+ }
+
+ if (f.maxType() > 0) {
+ FGPositionedRef ref = FGPositioned::findClosestWithIdent(ident, pos, &f);
+ if (ref.valid()) {
+ string_list dme_part = simgear::strutils::split(name , 0 ,1);
+ string_list navaid_part = simgear::strutils::split(ref.get()->name(), 0 ,1);
+
+ if ( simgear::strutils::uppercase(navaid_part[0]) == simgear::strutils::uppercase(dme_part[0]) ) {
+ navaid_dme = ref.get()->guid();
+ }
+ }
+ }
+ }
+
if ((type >= FGPositioned::ILS) && (type <= FGPositioned::GS)) {
arp = cache->findAirportRunway(name);
if (arp.second) {
if (isLoc) {
cache->setRunwayILS(arp.second, r);
}
+
+ if (navaid_dme) {
+ cache->setNavaidColocated(navaid_dme, r);
+ }
return r;
}