void FGRouteMgr::postinit()
{
SGPath path(_pathNode->getStringValue());
- if (path.exists()) {
- SG_LOG(SG_AUTOPILOT, SG_INFO, "loading flight-plan from:" << path.str());
+ if (!path.isNull()) {
+ SG_LOG(SG_AUTOPILOT, SG_INFO, "loading flight-plan from: " << path.str());
loadRoute(path);
}
const SGGeod& pos(wp->position());
prop->setStringValue("id", wp->ident().c_str());
- //prop->setStringValue("name", wp.get_name().c_str());
prop->setDoubleValue("longitude-deg", pos.getLongitudeDeg());
prop->setDoubleValue("latitude-deg",pos.getLatitudeDeg());
double ft = wp->altitudeFt();
prop->setDoubleValue("altitude-m", ft * SG_FEET_TO_METER);
prop->setDoubleValue("altitude-ft", ft);
+ prop->setIntValue("flight-level", static_cast<int>(ft / 1000) * 10);
} else {
prop->setDoubleValue("altitude-m", -9999.9);
prop->setDoubleValue("altitude-ft", -9999.9);
return _route[index];
}
+SGPropertyNode_ptr FGRouteMgr::wayptNodeAtIndex(int index) const
+{
+ if ((index < 0) || (index >= numWaypts())) {
+ throw sg_range_exception("waypt index out of range", "FGRouteMgr::wayptAtIndex");
+ }
+
+ return mirror->getChild("wp", index);
+}
+
bool FGRouteMgr::saveRoute(const SGPath& path)
{
SG_LOG(SG_IO, SG_INFO, "Saving route to " << path.str());
writeProperties(path.str(), d, true /* write-all */);
return true;
} catch (sg_exception& e) {
- SG_LOG(SG_IO, SG_WARN, "failed to save flight-plan:" << e.getMessage());
+ SG_LOG(SG_IO, SG_ALERT, "Failed to save flight-plan '" << path.str() << "'. " << e.getMessage());
return false;
}
}
bool FGRouteMgr::loadRoute(const SGPath& path)
{
+ if (!path.exists())
+ {
+ SG_LOG(SG_IO, SG_ALERT, "Failed to load flight-plan '" << path.str()
+ << "'. The file does not exist.");
+ return false;
+ }
+
// deactivate route first
active->setBoolValue(false);
}
return true;
} catch (sg_exception& e) {
- SG_LOG(SG_IO, SG_WARN, "failed to load flight-plan (from '" << e.getOrigin()
- << "'):" << e.getMessage());
+ SG_LOG(SG_IO, SG_ALERT, "Failed to load flight-plan '" << e.getOrigin()
+ << "'. " << e.getMessage());
return false;
}
}
bool FGRouteMgr::loadPlainTextRoute(const SGPath& path)
{
- sg_gzifstream in(path.str().c_str());
- if (!in.is_open()) {
- return false;
- }
-
try {
+ sg_gzifstream in(path.str().c_str());
+ if (!in.is_open()) {
+ throw sg_io_exception("Cannot open file for reading.");
+ }
+
WayptVec wpts;
while (!in.eof()) {
string line;
WayptRef w = waypointFromString(line);
if (!w) {
- throw sg_io_exception("failed to create waypoint from line:" + line);
+ throw sg_io_exception("Failed to create waypoint from line '" + line + "'.");
}
wpts.push_back(w);
_route = wpts;
return true;
} catch (sg_exception& e) {
- SG_LOG(SG_IO, SG_WARN, "failed to load route from:" << path.str() << ":" << e.getMessage());
+ SG_LOG(SG_IO, SG_ALERT, "Failed to load route from: '" << path.str() << "'. " << e.getMessage());
return false;
}
}
arrivalChanged();
}
+
+FGAirportRef FGRouteMgr::departureAirport() const
+{
+ return _departure;
+}
+
+FGAirportRef FGRouteMgr::destinationAirport() const
+{
+ return _destination;
+}
+
+FGRunway* FGRouteMgr::departureRunway() const
+{
+ if (!_departure) {
+ return NULL;
+ }
+
+ string runwayId(departure->getStringValue("runway"));
+ if (!_departure->hasRunwayWithIdent(runwayId)) {
+ return NULL;
+ }
+
+ return _departure->getRunwayByIdent(runwayId);
+}
+
+FGRunway* FGRouteMgr::destinationRunway() const
+{
+ if (!_destination) {
+ return NULL;
+ }
+
+ string runwayId(destination->getStringValue("runway"));
+ if (!_destination->hasRunwayWithIdent(runwayId)) {
+ return NULL;
+ }
+
+ return _destination->getRunwayByIdent(runwayId);
+}
+