X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Ffg_props.cxx;h=975a8a48cfe5dc4fa7923bdd1e2d795d45b955bc;hb=0c00cd3c6d34e4e167457897a274864cb7236da6;hp=a5726b79b00b7e7ad44d76565dc0acf9e971b9ca;hpb=1aff92ce4994cb487fff0ca8ac303a8a98738759;p=flightgear.git diff --git a/src/Main/fg_props.cxx b/src/Main/fg_props.cxx index a5726b79b..975a8a48c 100644 --- a/src/Main/fg_props.cxx +++ b/src/Main/fg_props.cxx @@ -28,27 +28,19 @@ #include #include -#include #include #include +#include #include -#include -#include #include #include "globals.hxx" #include "fg_props.hxx" - -static bool winding_ccw = true; // FIXME: temporary - -static bool fdm_data_logging = false; // FIXME: temporary - static bool frozen = false; // FIXME: temporary using std::string; - //////////////////////////////////////////////////////////////////////// // Default property bindings (not yet handled by any module). //////////////////////////////////////////////////////////////////////// @@ -77,7 +69,15 @@ LogClassMapping log_class_mappings [] = { LogClassMapping(SG_CLIPPER, "clipper"), LogClassMapping(SG_NETWORK, "network"), LogClassMapping(SG_INSTR, "instrumentation"), + LogClassMapping(SG_ATC, "atc"), + LogClassMapping(SG_NASAL, "nasal"), LogClassMapping(SG_SYSTEMS, "systems"), + LogClassMapping(SG_AI, "ai"), + LogClassMapping(SG_ENVIRONMENT, "environment"), + LogClassMapping(SG_SOUND, "sound"), + LogClassMapping(SG_NAVAID, "navaid"), + LogClassMapping(SG_GUI, "gui"), + LogClassMapping(SG_TERRASYNC, "terrasync"), LogClassMapping(SG_UNDEFD, "") }; @@ -95,7 +95,7 @@ string loggingResult; static const char * getLoggingClasses () { - sgDebugClass classes = logbuf::get_log_classes(); + sgDebugClass classes = sglog().get_log_classes(); loggingResult.clear(); for (int i = 0; log_class_mappings[i].c != SG_UNDEFD; i++) { if ((classes&log_class_mappings[i].c) > 0) { @@ -111,10 +111,10 @@ getLoggingClasses () static void addLoggingClass (const string &name) { - sgDebugClass classes = logbuf::get_log_classes(); + sgDebugClass classes = sglog().get_log_classes(); for (int i = 0; log_class_mappings[i].c != SG_UNDEFD; i++) { if (name == log_class_mappings[i].name) { - logbuf::set_log_classes(sgDebugClass(classes|log_class_mappings[i].c)); + sglog().set_log_classes(sgDebugClass(classes|log_class_mappings[i].c)); return; } } @@ -125,11 +125,11 @@ addLoggingClass (const string &name) /** * Set the logging classes. */ -static void +void setLoggingClasses (const char * c) { string classes = c; - logbuf::set_log_classes(SG_NONE); + sglog().set_log_classes(SG_NONE); if (classes == "none") { SG_LOG(SG_GENERAL, SG_INFO, "Disabled all logging classes"); @@ -137,7 +137,7 @@ setLoggingClasses (const char * c) } if (classes.empty() || classes == "all") { // default - logbuf::set_log_classes(SG_ALL); + sglog().set_log_classes(SG_ALL); SG_LOG(SG_GENERAL, SG_INFO, "Enabled all logging classes: " << getLoggingClasses()); return; @@ -145,12 +145,16 @@ setLoggingClasses (const char * c) string rest = classes; string name = ""; - int sep = rest.find('|'); - while (sep > 0) { + string::size_type sep = rest.find('|'); + if (sep == string::npos) + sep = rest.find(','); + while (sep != string::npos) { name = rest.substr(0, sep); rest = rest.substr(sep+1); addLoggingClass(name); sep = rest.find('|'); + if (sep == string::npos) + sep = rest.find(','); } addLoggingClass(rest); SG_LOG(SG_GENERAL, SG_INFO, "Set logging classes to " @@ -164,7 +168,7 @@ setLoggingClasses (const char * c) static const char * getLoggingPriority () { - switch (logbuf::get_log_priority()) { + switch (sglog().get_log_priority()) { case SG_BULK: return "bulk"; case SG_DEBUG: @@ -177,7 +181,7 @@ getLoggingPriority () return "alert"; default: SG_LOG(SG_GENERAL, SG_WARN, "Internal: Unknown logging priority number: " - << logbuf::get_log_priority()); + << sglog().get_log_priority()); return "unknown"; } } @@ -186,22 +190,22 @@ getLoggingPriority () /** * Set the logging priority. */ -static void +void setLoggingPriority (const char * p) { if (p == 0) return; string priority = p; if (priority == "bulk") { - logbuf::set_log_priority(SG_BULK); + sglog().set_log_priority(SG_BULK); } else if (priority == "debug") { - logbuf::set_log_priority(SG_DEBUG); + sglog().set_log_priority(SG_DEBUG); } else if (priority.empty() || priority == "info") { // default - logbuf::set_log_priority(SG_INFO); + sglog().set_log_priority(SG_INFO); } else if (priority == "warn") { - logbuf::set_log_priority(SG_WARN); + sglog().set_log_priority(SG_WARN); } else if (priority == "alert") { - logbuf::set_log_priority(SG_ALERT); + sglog().set_log_priority(SG_ALERT); } else { SG_LOG(SG_GENERAL, SG_WARN, "Unknown logging priority " << priority); } @@ -228,7 +232,7 @@ setFreeze (bool f) frozen = f; // Stop sound on a pause - SGSoundMgr *smgr = globals->get_soundmgr(); + SGSoundMgr *smgr = globals->get_subsystem(); if ( smgr != NULL ) { if ( f ) { smgr->suspend(); @@ -236,6 +240,9 @@ setFreeze (bool f) smgr->resume(); } } + + // Pause the particle system + simgear::Particles::setFrozen(f); } @@ -256,7 +263,14 @@ static const char * getDateString () { static char buf[64]; // FIXME - struct tm * t = globals->get_time_params()->getGmt(); + + SGTime * st = globals->get_time_params(); + if (!st) { + buf[0] = 0; + return buf; + } + + struct tm * t = st->getGmt(); sprintf(buf, "%.4d-%.2d-%.2dT%.2d:%.2d:%.2d", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); @@ -270,9 +284,6 @@ getDateString () static void setDateString (const char * date_string) { - static const SGPropertyNode *cur_time_override - = fgGetNode("/sim/time/cur-time-override", true); - SGTime * st = globals->get_time_params(); struct tm * current_time = st->getGmt(); struct tm new_time; @@ -298,16 +309,13 @@ setDateString (const char * date_string) // values, one way or another. new_time.tm_year -= 1900; new_time.tm_mon -= 1; - // Now, tell flight gear to use // the new time. This was far // too difficult, by the way. long int warp = mktime(&new_time) - mktime(current_time) + globals->get_warp(); - double lon = current_aircraft.fdm_state->get_Longitude(); - double lat = current_aircraft.fdm_state->get_Latitude(); - globals->set_warp(warp); - st->update(lon, lat, cur_time_override->getLongValue(), warp); + + fgSetInt("/sim/time/warp", warp); } /** @@ -317,42 +325,27 @@ static const char * getGMTString () { static char buf[16]; - struct tm *t = globals->get_time_params()->getGmt(); + SGTime * st = globals->get_time_params(); + if (!st) { + buf[0] = 0; + return buf; + } + + struct tm *t = st->getGmt(); snprintf(buf, 16, "%.2d:%.2d:%.2d", t->tm_hour, t->tm_min, t->tm_sec); return buf; } -/** - * Return the magnetic variation - */ -static double -getMagVar () -{ - return globals->get_mag()->get_magvar() * SGD_RADIANS_TO_DEGREES; -} - - -/** - * Return the magnetic dip - */ -static double -getMagDip () -{ - return globals->get_mag()->get_magdip() * SGD_RADIANS_TO_DEGREES; -} - - /** * Return the current heading in degrees. */ static double getHeadingMag () { - double magheading; - magheading = current_aircraft.fdm_state->get_Psi() * SGD_RADIANS_TO_DEGREES - getMagVar(); - if (magheading < 0) magheading += 360; - return magheading; + double magheading = fgGetDouble("/orientation/heading-deg") - + fgGetDouble("/environment/magnetic-variation-deg"); + return SGMiscd::normalizePeriodic(0, 360, magheading ); } /** @@ -361,138 +354,178 @@ getHeadingMag () static double getTrackMag () { - double magtrack; - magtrack = current_aircraft.fdm_state->get_Track() - getMagVar(); - if (magtrack < 0) magtrack += 360; - return magtrack; + double magtrack = fgGetDouble("/orientation/track-deg") - + fgGetDouble("/environment/magnetic-variation-deg"); + return SGMiscd::normalizePeriodic(0, 360, magtrack ); } -static long -getWarp () -{ - return globals->get_warp(); -} +//////////////////////////////////////////////////////////////////////// +// Tie the properties. +//////////////////////////////////////////////////////////////////////// +SGConstPropertyNode_ptr FGProperties::_longDeg; +SGConstPropertyNode_ptr FGProperties::_latDeg; +SGConstPropertyNode_ptr FGProperties::_lonLatformat; +/* + * Format the latitude and longitude floats into a character array using a variety of coordinate formats. + */ static void -setWarp (long warp) -{ - globals->set_warp(warp); -} +formatLatLongString (double deg, int format, char *buf, char c) { + double min, sec; + int sign = deg < 0.0 ? -1 : 1; + deg = fabs(deg); -static long -getWarpDelta () -{ - return globals->get_warp_delta(); -} - -static void -setWarpDelta (long delta) -{ - globals->set_warp_delta(delta); -} + if (format == 0) { + // d.dddddd' (DDD format). + snprintf(buf, 32, "%3.6f%c", deg, c); -static bool -getWindingCCW () -{ - return winding_ccw; -} + } else if (format == 1) { + // d mm.mmm' (DMM format) -- uses a round-off factor tailored to the + // required precision of the minutes field (three decimal places), + // preventing minute values of 60. + min = (deg - int(deg)) * 60.0; + if (min >= 59.9995) { + min -= 60.0; + deg += 1.0; + } + snprintf(buf, 32, "%d*%06.3f'%c", int(deg), fabs(min), c); -static void -setWindingCCW (bool state) -{ - winding_ccw = state; - if ( winding_ccw ) - glFrontFace ( GL_CCW ); - else - glFrontFace ( GL_CW ); -} + } else if (format == 2) { + // d mm'ss.s" (DMS format) -- uses a round-off factor tailored to the + // required precision of the seconds field (one decimal place), + // preventing second values of 60. + min = (deg - int(deg)) * 60.0; + sec = (min - int(min)) * 60.0; + if (sec >= 59.95) { + sec -= 60.0; + min += 1.0; + if (min >= 60.0) { + min -= 60.0; + deg += 1.0; + } + } + snprintf(buf, 32, "%d*%02d'%04.1f\"%c", int(deg), int(min), fabs(sec), c); + + } else if (format == 3) { + // d.dddddd' (signed DDD format). + snprintf(buf, 32, "%3.6f", sign*deg); + + } else if (format == 4) { + // d mm.mmm' (signed DMM format). + min = (deg - int(deg)) * 60.0; + if (min >= 59.9995) { + min -= 60.0; + deg += 1.0; + } + if (sign == 1) { + snprintf(buf, 32, "%d*%06.3f'", int(deg), fabs(min)); + } else { + snprintf(buf, 32, "-%d*%06.3f'", int(deg), fabs(min)); + } -static bool -getFDMDataLogging () -{ - return fdm_data_logging; -} + } else if (format == 5) { + // d mm'ss.s" (signed DMS format). + min = (deg - int(deg)) * 60.0; + sec = (min - int(min)) * 60.0; + if (sec >= 59.95) { + sec -= 60.0; + min += 1.0; + if (min >= 60.0) { + min -= 60.0; + deg += 1.0; + } + } + if (sign == 1) { + snprintf(buf, 32, "%d*%02d'%04.1f\"", int(deg), int(min), fabs(sec)); + } else { + snprintf(buf, 32, "-%d*%02d'%04.1f\"", int(deg), int(min), fabs(sec)); + } -static void -setFDMDataLogging (bool state) -{ - // kludge; no getter or setter available - if (state != fdm_data_logging) { - fgToggleFDMdataLogging(); - fdm_data_logging = state; - } -} + } else if (format == 6) { + // dd.dddddd X, ddd.dddddd X (zero padded DDD format). + if (c == 'N' || c == 'S') { + snprintf(buf, 32, "%09.6f%c", deg, c); + } else { + snprintf(buf, 32, "%010.6f%c", deg, c); + } -static const char * -getLongitudeString () -{ - static SGConstPropertyNode_ptr n = fgGetNode("/position/longitude-deg", true); - static SGConstPropertyNode_ptr f = fgGetNode("/sim/lon-lat-format", true); - static char buf[32]; - double d = n->getDoubleValue(); - int format = f->getIntValue(); - char c = d < 0.0 ? 'W' : 'E'; + } else if (format == 7) { + // dd mm.mmm' X, ddd mm.mmm' X (zero padded DMM format). + min = (deg - int(deg)) * 60.0; + if (min >= 59.9995) { + min -= 60.0; + deg += 1.0; + } + if (c == 'N' || c == 'S') { + snprintf(buf, 32, "%02d*%06.3f'%c", int(deg), fabs(min), c); + } else { + snprintf(buf, 32, "%03d*%06.3f'%c", int(deg), fabs(min), c); + } - if (format == 0) { - snprintf(buf, 32, "%3.6f%c", d, c); + } else if (format == 8) { + // dd mm'ss.s" X, dd mm'ss.s" X (zero padded DMS format). + min = (deg - int(deg)) * 60.0; + sec = (min - int(min)) * 60.0; + if (sec >= 59.95) { + sec -= 60.0; + min += 1.0; + if (min >= 60.0) { + min -= 60.0; + deg += 1.0; + } + } + if (c == 'N' || c == 'S') { + snprintf(buf, 32, "%02d*%02d'%04.1f\"%c", int(deg), int(min), fabs(sec), c); + } else { + snprintf(buf, 32, "%03d*%02d'%04.1f\"%c", int(deg), int(min), fabs(sec), c); + } - } else if (format == 1) { - // dd mm.mmm' (DMM-Format) -- uses a round-off factor tailored to the - // required precision of the minutes field (three decimal places), - // preventing minute values of 60. - double deg = fabs(d) + 5.0E-4 / 60.0; - double min = fabs(deg - int(deg)) * 60.0 - 4.999E-4; - snprintf(buf, 32, "%d*%06.3f%c", int(d < 0.0 ? -deg : deg), min, c); + } else if (format == 9) { + // dd* mm'.mmm X, ddd* mm'.mmm X (Trinity House Navigation standard). + min = (deg - int(deg)) * 60.0; + if (min >= 59.9995) { + min -= 60.0; + deg += 1.0; + } + if (c == 'N' || c == 'S') { + snprintf(buf, 32, "%02d* %02d'.%03d%c", int(deg), int(min), int(SGMisc::round((min-int(min))*1000)), c); + } else { + snprintf(buf, 32, "%03d* %02d'.%03d%c", int(deg), int(min), int(SGMisc::round((min-int(min))*1000)), c); + } } else { - // mm'ss.s'' (DMS-Format) -- uses a round-off factor tailored to the - // required precision of the seconds field (one decimal place), - // preventing second values of 60. - double deg = fabs(d) + 0.05 / 3600.0; - double min = (deg - int(deg)) * 60.0; - double sec = (min - int(min)) * 60.0 - 0.049; - snprintf(buf, 32, "%d*%02d %04.1f%c", int(d < 0.0 ? -deg : deg), - int(min), fabs(sec), c); + // Empty the buffer for all invalid formats. + buf[0] = '\0'; } - buf[31] = '\0'; - return buf; } -static const char * -getLatitudeString () +const char * +FGProperties::getLongitudeString () { - static SGConstPropertyNode_ptr n = fgGetNode("/position/latitude-deg", true); - static SGConstPropertyNode_ptr f = fgGetNode("/sim/lon-lat-format", true); static char buf[32]; - double d = n->getDoubleValue(); - int format = f->getIntValue(); - char c = d < 0.0 ? 'S' : 'N'; + double d = _longDeg->getDoubleValue(); + int format = _lonLatformat->getIntValue(); - if (format == 0) { - snprintf(buf, 32, "%3.6f%c", d, c); + char c = d < 0.0 ? 'W' : 'E'; + formatLatLongString(d, format, buf, c); + return buf; +} - } else if (format == 1) { - double deg = fabs(d) + 5.0E-4 / 60.0; - double min = fabs(deg - int(deg)) * 60.0 - 4.999E-4; - snprintf(buf, 32, "%d*%06.3f%c", int(d < 0.0 ? -deg : deg), min, c); +const char * +FGProperties::getLatitudeString () +{ + static char buf[32]; + double d = _latDeg->getDoubleValue(); + int format = _lonLatformat->getIntValue(); - } else { - double deg = fabs(d) + 0.05 / 3600.0; - double min = (deg - int(deg)) * 60.0; - double sec = (min - int(min)) * 60.0 - 0.049; - snprintf(buf, 32, "%d*%02d %04.1f%c", int(d < 0.0 ? -deg : deg), - int(min), fabs(sec), c); - } - buf[31] = '\0'; + char c = d < 0.0 ? 'S' : 'N'; + formatLatLongString(d, format, buf, c); return buf; } -//////////////////////////////////////////////////////////////////////// -// Tie the properties. -//////////////////////////////////////////////////////////////////////// FGProperties::FGProperties () { @@ -510,114 +543,89 @@ FGProperties::init () void FGProperties::bind () { - // Simulation - fgTie("/sim/logging/priority", getLoggingPriority, setLoggingPriority); - fgTie("/sim/logging/classes", getLoggingClasses, setLoggingClasses); - fgTie("/sim/freeze/master", getFreeze, setFreeze); - - fgTie("/sim/time/elapsed-sec", getElapsedTime_sec); - fgTie("/sim/time/gmt", getDateString, setDateString); + _longDeg = fgGetNode("/position/longitude-deg", true); + _latDeg = fgGetNode("/position/latitude-deg", true); + _lonLatformat = fgGetNode("/sim/lon-lat-format", true); + + _offset = fgGetNode("/sim/time/local-offset", true); + + // utc date/time + _uyear = fgGetNode("/sim/time/utc/year", true); + _umonth = fgGetNode("/sim/time/utc/month", true); + _uday = fgGetNode("/sim/time/utc/day", true); + _uhour = fgGetNode("/sim/time/utc/hour", true); + _umin = fgGetNode("/sim/time/utc/minute", true); + _usec = fgGetNode("/sim/time/utc/second", true); + _uwday = fgGetNode("/sim/time/utc/weekday", true); + _udsec = fgGetNode("/sim/time/utc/day-seconds", true); + + // real local date/time + _ryear = fgGetNode("/sim/time/real/year", true); + _rmonth = fgGetNode("/sim/time/real/month", true); + _rday = fgGetNode("/sim/time/real/day", true); + _rhour = fgGetNode("/sim/time/real/hour", true); + _rmin = fgGetNode("/sim/time/real/minute", true); + _rsec = fgGetNode("/sim/time/real/second", true); + _rwday = fgGetNode("/sim/time/real/weekday", true); + + _tiedProperties.setRoot(globals->get_props()); + + // Simulation + _tiedProperties.Tie("/sim/logging/priority", getLoggingPriority, setLoggingPriority); + _tiedProperties.Tie("/sim/logging/classes", getLoggingClasses, setLoggingClasses); + _tiedProperties.Tie("/sim/freeze/master", getFreeze, setFreeze); + + _tiedProperties.Tie("/sim/time/elapsed-sec", getElapsedTime_sec); + _tiedProperties.Tie("/sim/time/gmt", getDateString, setDateString); fgSetArchivable("/sim/time/gmt"); - fgTie("/sim/time/gmt-string", getGMTString); - - // Position - fgTie("/position/latitude-string", getLatitudeString); - fgTie("/position/longitude-string", getLongitudeString); - - // Orientation - fgTie("/orientation/heading-magnetic-deg", getHeadingMag); - fgTie("/orientation/track-magnetic-deg", getTrackMag); - - fgTie("/environment/magnetic-variation-deg", getMagVar); - fgTie("/environment/magnetic-dip-deg", getMagDip); + _tiedProperties.Tie("/sim/time/gmt-string", getGMTString); - fgTie("/sim/time/warp", getWarp, setWarp, false); - fgTie("/sim/time/warp-delta", getWarpDelta, setWarpDelta); + // Position + _tiedProperties.Tie("/position/latitude-string", getLatitudeString); + _tiedProperties.Tie("/position/longitude-string", getLongitudeString); - // Misc. Temporary junk. - fgTie("/sim/temp/winding-ccw", getWindingCCW, setWindingCCW, false); - fgTie("/sim/temp/fdm-data-logging", getFDMDataLogging, setFDMDataLogging); + // Orientation + _tiedProperties.Tie("/orientation/heading-magnetic-deg", getHeadingMag); + _tiedProperties.Tie("/orientation/track-magnetic-deg", getTrackMag); } void FGProperties::unbind () { - // Simulation - fgUntie("/sim/logging/priority"); - fgUntie("/sim/logging/classes"); - fgUntie("/sim/freeze/master"); + _tiedProperties.Untie(); - fgUntie("/sim/time/elapsed-sec"); - fgUntie("/sim/time/gmt"); - fgUntie("/sim/time/gmt-string"); - // Position - fgUntie("/position/latitude-string"); - fgUntie("/position/longitude-string"); - - // Orientation - fgUntie("/orientation/heading-magnetic-deg"); - fgUntie("/orientation/track-magnetic-deg"); - - // Environment - fgUntie("/environment/magnetic-variation-deg"); - fgUntie("/environment/magnetic-dip-deg"); - - fgUntie("/sim/time/warp"); - fgUntie("/sim/time/warp-delta"); - - // Misc. Temporary junk. - fgUntie("/sim/temp/winding-ccw"); - fgUntie("/sim/temp/full-screen"); - fgUntie("/sim/temp/fdm-data-logging"); + // drop static references to properties + _longDeg = 0; + _latDeg = 0; + _lonLatformat = 0; } void FGProperties::update (double dt) { - static SGPropertyNode_ptr offset = fgGetNode("/sim/time/local-offset", true); - offset->setIntValue(globals->get_time_params()->get_local_offset()); - + _offset->setIntValue(globals->get_time_params()->get_local_offset()); // utc date/time - static SGPropertyNode_ptr uyear = fgGetNode("/sim/time/utc/year", true); - static SGPropertyNode_ptr umonth = fgGetNode("/sim/time/utc/month", true); - static SGPropertyNode_ptr uday = fgGetNode("/sim/time/utc/day", true); - static SGPropertyNode_ptr uhour = fgGetNode("/sim/time/utc/hour", true); - static SGPropertyNode_ptr umin = fgGetNode("/sim/time/utc/minute", true); - static SGPropertyNode_ptr usec = fgGetNode("/sim/time/utc/second", true); - static SGPropertyNode_ptr uwday = fgGetNode("/sim/time/utc/weekday", true); - static SGPropertyNode_ptr udsec = fgGetNode("/sim/time/utc/day-seconds", true); - struct tm *u = globals->get_time_params()->getGmt(); - uyear->setIntValue(u->tm_year + 1900); - umonth->setIntValue(u->tm_mon + 1); - uday->setIntValue(u->tm_mday); - uhour->setIntValue(u->tm_hour); - umin->setIntValue(u->tm_min); - usec->setIntValue(u->tm_sec); - uwday->setIntValue(u->tm_wday); - - udsec->setIntValue(u->tm_hour * 3600 + u->tm_min * 60 + u->tm_sec); - + _uyear->setIntValue(u->tm_year + 1900); + _umonth->setIntValue(u->tm_mon + 1); + _uday->setIntValue(u->tm_mday); + _uhour->setIntValue(u->tm_hour); + _umin->setIntValue(u->tm_min); + _usec->setIntValue(u->tm_sec); + _uwday->setIntValue(u->tm_wday); + _udsec->setIntValue(u->tm_hour * 3600 + u->tm_min * 60 + u->tm_sec); // real local date/time - static SGPropertyNode_ptr ryear = fgGetNode("/sim/time/real/year", true); - static SGPropertyNode_ptr rmonth = fgGetNode("/sim/time/real/month", true); - static SGPropertyNode_ptr rday = fgGetNode("/sim/time/real/day", true); - static SGPropertyNode_ptr rhour = fgGetNode("/sim/time/real/hour", true); - static SGPropertyNode_ptr rmin = fgGetNode("/sim/time/real/minute", true); - static SGPropertyNode_ptr rsec = fgGetNode("/sim/time/real/second", true); - static SGPropertyNode_ptr rwday = fgGetNode("/sim/time/real/weekday", true); - time_t real = time(0); struct tm *r = localtime(&real); - ryear->setIntValue(r->tm_year + 1900); - rmonth->setIntValue(r->tm_mon + 1); - rday->setIntValue(r->tm_mday); - rhour->setIntValue(r->tm_hour); - rmin->setIntValue(r->tm_min); - rsec->setIntValue(r->tm_sec); - rwday->setIntValue(r->tm_wday); + _ryear->setIntValue(r->tm_year + 1900); + _rmonth->setIntValue(r->tm_mon + 1); + _rday->setIntValue(r->tm_mday); + _rhour->setIntValue(r->tm_hour); + _rmin->setIntValue(r->tm_min); + _rsec->setIntValue(r->tm_sec); + _rwday->setIntValue(r->tm_wday); } @@ -670,23 +678,21 @@ fgLoadFlight (std::istream &input) fgSetString("/sim/presets/speed-set", "UVW"); copyProperties(&props, globals->get_props()); - // When loading a flight, make it the - // new initial state. - globals->saveInitialState(); + return true; } bool -fgLoadProps (const char * path, SGPropertyNode * props, bool in_fg_root, int default_mode) +fgLoadProps (const std::string& path, SGPropertyNode * props, bool in_fg_root, int default_mode) { - string fullpath; + SGPath fullpath; if (in_fg_root) { SGPath loadpath(globals->get_fg_root()); loadpath.append(path); - fullpath = loadpath.str(); + fullpath = loadpath; } else { - fullpath = path; + fullpath = SGPath::fromUtf8(path); } try { @@ -747,7 +753,7 @@ fgGetInt (const char * name, int defaultValue) return globals->get_props()->getIntValue(name, defaultValue); } -int +long fgGetLong (const char * name, long defaultValue) { return globals->get_props()->getLongValue(name, defaultValue); @@ -844,10 +850,21 @@ fgSetWritable (const char * name, bool state) } void -fgUntie (const char * name) +fgUntie(const char * name) { - if (!globals->get_props()->untie(name)) + SGPropertyNode* node = globals->get_props()->getNode(name); + if (!node) { + SG_LOG(SG_GENERAL, SG_WARN, "fgUntie: unknown property " << name); + return; + } + + if (!node->isTied()) { + return; + } + + if (!node->untie()) { SG_LOG(SG_GENERAL, SG_WARN, "Failed to untie property " << name); + } }