X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Ffg_props.cxx;h=a5726b79b00b7e7ad44d76565dc0acf9e971b9ca;hb=b7eb3bd0e128d39101dfa5846de991681aa5456f;hp=6d0cb799afcd040d0dc84b0ed0325abff211e78e;hpb=14885374de79779e3f642f6ecb39d4723836166a;p=flightgear.git diff --git a/src/Main/fg_props.cxx b/src/Main/fg_props.cxx index 6d0cb799a..a5726b79b 100644 --- a/src/Main/fg_props.cxx +++ b/src/Main/fg_props.cxx @@ -85,20 +85,26 @@ LogClassMapping log_class_mappings [] = { /** * Get the logging classes. */ +// XXX Making the result buffer be global is a band-aid that hopefully +// delays its destruction 'til after its last use. +namespace +{ +string loggingResult; +} + static const char * getLoggingClasses () { sgDebugClass classes = logbuf::get_log_classes(); - static string result; - result = ""; + loggingResult.clear(); for (int i = 0; log_class_mappings[i].c != SG_UNDEFD; i++) { if ((classes&log_class_mappings[i].c) > 0) { - if (!result.empty()) - result += '|'; - result += log_class_mappings[i].name; + if (!loggingResult.empty()) + loggingResult += '|'; + loggingResult += log_class_mappings[i].name; } } - return result.c_str(); + return loggingResult.c_str(); } @@ -222,12 +228,12 @@ setFreeze (bool f) frozen = f; // Stop sound on a pause - SGSoundMgr *s = globals->get_soundmgr(); - if ( s != NULL ) { + SGSoundMgr *smgr = globals->get_soundmgr(); + if ( smgr != NULL ) { if ( f ) { - s->pause(); - } else if (!fgGetBool("/sim/sound/pause")) { - s->resume(); + smgr->suspend(); + } else if (fgGetBool("/sim/sound/working")) { + smgr->resume(); } } } @@ -349,6 +355,18 @@ getHeadingMag () return magheading; } +/** + * Return the current track in degrees. + */ +static double +getTrackMag () +{ + double magtrack; + magtrack = current_aircraft.fdm_state->get_Track() - getMagVar(); + if (magtrack < 0) magtrack += 360; + return magtrack; +} + static long getWarp () { @@ -508,6 +526,7 @@ FGProperties::bind () // 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); @@ -537,6 +556,7 @@ FGProperties::unbind () // Orientation fgUntie("/orientation/heading-magnetic-deg"); + fgUntie("/orientation/track-magnetic-deg"); // Environment fgUntie("/environment/magnetic-variation-deg"); @@ -554,23 +574,50 @@ FGProperties::unbind () void FGProperties::update (double dt) { - // Date and time - struct tm *t = globals->get_time_params()->getGmt(); - - fgSetInt("/sim/time/utc/year", t->tm_year + 1900); - fgSetInt("/sim/time/utc/month", t->tm_mon + 1); - fgSetInt("/sim/time/utc/day", t->tm_mday); - fgSetInt("/sim/time/utc/hour", t->tm_hour); - fgSetInt("/sim/time/utc/minute", t->tm_min); - fgSetInt("/sim/time/utc/second", t->tm_sec); - - fgSetDouble("/sim/time/utc/day-seconds", - t->tm_hour * 3600 + - t->tm_min * 60 + - t->tm_sec); - - fgSetInt("/sim/time/local-offset", - globals->get_time_params()->get_local_offset()); + static SGPropertyNode_ptr offset = fgGetNode("/sim/time/local-offset", true); + 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); + + + // 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); }