1
0
Fork 0

Updates to time parsing and setting by David Megginson.

This commit is contained in:
curt 2000-12-08 17:26:49 +00:00
parent 5fecec2bba
commit 6574e8f4f6
3 changed files with 66 additions and 20 deletions

View file

@ -171,6 +171,8 @@ FGBFI::init ()
current_properties.tieString("/sim/aircraft-dir", current_properties.tieString("/sim/aircraft-dir",
getAircraftDir, setAircraftDir); getAircraftDir, setAircraftDir);
// TODO: timeGMT // TODO: timeGMT
current_properties.tieString("/sim/time/gmt",
getDateString, setDateString);
current_properties.tieString("/sim/time/gmt-string", current_properties.tieString("/sim/time/gmt-string",
getGMTString, 0); getGMTString, 0);
current_properties.tieBool("/sim/hud/visibility", current_properties.tieBool("/sim/hud/visibility",
@ -190,8 +192,8 @@ FGBFI::init ()
current_properties.tieDouble("/position/longitude", current_properties.tieDouble("/position/longitude",
getLongitude, setLongitude); getLongitude, setLongitude);
current_properties.tieDouble("/position/altitude", current_properties.tieDouble("/position/altitude",
// getAltitude, setAltitude); getAltitude, setAltitude);
getAltitude, setAltitude, false); // getAltitude, setAltitude, false);
current_properties.tieDouble("/position/altitude-agl", current_properties.tieDouble("/position/altitude-agl",
getAGL, 0); getAGL, 0);
@ -425,10 +427,17 @@ FGBFI::setAircraftDir (const string &dir)
/** /**
* Return the current Zulu time. * Return the current Zulu time.
*/ */
time_t const string &
FGBFI::getTimeGMT () FGBFI::getDateString ()
{ {
return globals->get_time_params()->get_cur_time(); static string out; // FIXME: not thread-safe
char buf[64];
struct tm * t = globals->get_time_params()->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);
out = buf;
return out;
} }
@ -436,18 +445,46 @@ FGBFI::getTimeGMT ()
* Set the current Zulu time. * Set the current Zulu time.
*/ */
void void
FGBFI::setTimeGMT (time_t time) FGBFI::setDateString (const string &date_string)
// FGBFI::setTimeGMT (time_t time)
{ {
if (getTimeGMT() != time) { SGTime * st = globals->get_time_params();
// FIXME: need to update lighting struct tm * current_time = st->getGmt();
// and solar system struct tm new_time;
globals->get_options()->set_time_offset(time);
globals->get_options()->set_time_offset_type(FGOptions::FG_TIME_GMT_ABSOLUTE); // Scan for basic ISO format
globals->get_time_params()->update( cur_fdm_state->get_Longitude(), // YYYY-MM-DDTHH:MM:SS
cur_fdm_state->get_Latitude(), int ret = sscanf(date_string.c_str(), "%d-%d-%dT%d:%d:%d",
globals->get_warp() ); &(new_time.tm_year), &(new_time.tm_mon),
needReinit(); &(new_time.tm_mday), &(new_time.tm_hour),
&(new_time.tm_min), &(new_time.tm_sec));
// Be pretty picky about this, so
// that strange things don't happen
// if the save file has been edited
// by hand.
if (ret != 6) {
FG_LOG(FG_INPUT, FG_ALERT, "Date/time string " << date_string
<< " not in YYYY-MM-DDTHH:MM:SS format; skipped");
return;
} }
// OK, it looks like we got six
// 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();
double alt = current_aircraft.fdm_state->get_Altitude() * FEET_TO_METER;
globals->set_warp(warp);
st->update(lon, lat, warp);
fgUpdateSkyAndLightingParams();
} }
@ -582,6 +619,7 @@ void
FGBFI::setLatitude (double latitude) FGBFI::setLatitude (double latitude)
{ {
current_aircraft.fdm_state->set_Latitude(latitude * DEG_TO_RAD); current_aircraft.fdm_state->set_Latitude(latitude * DEG_TO_RAD);
fgUpdateSkyAndLightingParams();
} }
@ -602,6 +640,7 @@ void
FGBFI::setLongitude (double longitude) FGBFI::setLongitude (double longitude)
{ {
current_aircraft.fdm_state->set_Longitude(longitude * DEG_TO_RAD); current_aircraft.fdm_state->set_Longitude(longitude * DEG_TO_RAD);
fgUpdateSkyAndLightingParams();
} }
@ -634,6 +673,7 @@ void
FGBFI::setAltitude (double altitude) FGBFI::setAltitude (double altitude)
{ {
current_aircraft.fdm_state->set_Altitude(altitude); current_aircraft.fdm_state->set_Altitude(altitude);
fgUpdateSkyAndLightingParams();
} }

View file

@ -62,9 +62,12 @@ public:
static const string &getAircraftDir (); static const string &getAircraftDir ();
static void setAircraftDir (const string &aircraftDir); static void setAircraftDir (const string &aircraftDir);
static time_t getTimeGMT (); // static time_t getTimeGMT ();
static void setTimeGMT (time_t time); // static void setTimeGMT (time_t time);
static const string &getDateString ();
static void setDateString (const string &time_string);
// deprecated
static const string &getGMTString (); static const string &getGMTString ();
static bool getHUDVisible (); static bool getHUDVisible ();

View file

@ -146,9 +146,10 @@ void GLUTkey(unsigned char k, int x, int y) {
// add 1000' of emergency altitude. Possibly good for // add 1000' of emergency altitude. Possibly good for
// unflipping yourself :-) // unflipping yourself :-)
{ {
double alt = cur_fdm_state->get_Altitude() + 1000; FGBFI::setAltitude(FGBFI::getAltitude() + 1000);
fgFDMForceAltitude( globals->get_options()->get_flight_model(), // double alt = cur_fdm_state->get_Altitude() + 1000;
alt * FEET_TO_METER ); // fgFDMForceAltitude( globals->get_options()->get_flight_model(),
// alt * FEET_TO_METER );
} }
return; return;
case 49: // numeric keypad 1 case 49: // numeric keypad 1
@ -542,6 +543,8 @@ void GLUTspecialkey(int k, int x, int y) {
case GLUT_KEY_F3: // F3 Take a screen shot case GLUT_KEY_F3: // F3 Take a screen shot
fgDumpSnapShot(); fgDumpSnapShot();
return; return;
case GLUT_KEY_F4: // F4 Update lighting manually
fgUpdateSkyAndLightingParams();
case GLUT_KEY_F6: // F6 toggles Autopilot target location case GLUT_KEY_F6: // F6 toggles Autopilot target location
if ( current_autopilot->get_HeadingMode() != if ( current_autopilot->get_HeadingMode() !=
FGAutopilot::FG_HEADING_WAYPOINT ) { FGAutopilot::FG_HEADING_WAYPOINT ) {