From 83edcb294964866f2c53b93681727173a96ee2b6 Mon Sep 17 00:00:00 2001 From: mfranz Date: Sun, 15 Feb 2009 22:49:51 +0000 Subject: [PATCH] add /sim/time/real/ (local machine time) analog to /sim/time/utc/ localtime() is once commented out in simgear/io/sg_binobj.cxx and a warning says the it can screw up sim time. This is only because localtime() isn't thread-safe (and its thread-safe cousin localtime_r() isn't portable). As long as all timing is done in the main thread (which is the case) there should be no problem. Otherwise we'd have to implement a simple mutex locked wrapper. --- src/Main/fg_props.cxx | 55 ++++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/src/Main/fg_props.cxx b/src/Main/fg_props.cxx index 6d0cb799a..1e8885c35 100644 --- a/src/Main/fg_props.cxx +++ b/src/Main/fg_props.cxx @@ -554,23 +554,50 @@ FGProperties::unbind () void FGProperties::update (double dt) { - // Date and time - struct tm *t = globals->get_time_params()->getGmt(); + static SGPropertyNode_ptr offset = fgGetNode("/sim/time/local-offset", true); + offset->setIntValue(globals->get_time_params()->get_local_offset()); - 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); + // 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); - fgSetInt("/sim/time/local-offset", - globals->get_time_params()->get_local_offset()); + 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); }