void FGRouteMgr::postinit()
{
SGPath path(_pathNode->getStringValue());
- if (path.exists()) {
+ 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());
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);
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;
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);
+}
+