Updates to time parsing and setting by David Megginson.
This commit is contained in:
parent
5fecec2bba
commit
6574e8f4f6
3 changed files with 66 additions and 20 deletions
src/Main
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 ();
|
||||||
|
|
|
@ -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 ) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue