]> git.mxchange.org Git - flightgear.git/blobdiff - Time/fg_time.cxx
Modifications to incorporate Jon S. Berndts flight model code.
[flightgear.git] / Time / fg_time.cxx
index eb321c9b21435bf4ca4d8cb8c91fb2c9f91a1ff6..f7a1c6e40af2f0113bb70de2e6f446eb3ce26c04 100644 (file)
 #  include <config.h>
 #endif
 
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
+#include "Include/compiler.h"
+
+#ifdef FG_HAVE_STD_INCLUDES
+#  include <cmath>
+#  include <cstdio>
+#  include <cstdlib>
+#  include <ctime>
+#else
+#  include <math.h>
+#  include <stdio.h>
+#  include <stdlib.h>
+#  include <time.h>
+#endif
 
 #ifdef HAVE_SYS_TIMEB_H
 #  include <sys/timeb.h> // for ftime() and struct timeb
 #  include <sys/time.h>  // for get/setitimer, gettimeofday, struct timeval
 #endif
 
-//#include <Astro/orbits.hxx>
-//#include <Astro/sun.hxx>
 #include <Astro/sky.hxx>
 #include <Astro/solarsystem.hxx>
-#include <Debug/fg_debug.h>
-#include <Flight/flight.h>
+#include <Debug/logstream.hxx>
+#include <FDM/flight.hxx>
 #include <Include/fg_constants.h>
 #include <Main/options.hxx>
 #include <Time/light.hxx>
@@ -76,12 +83,12 @@ static void local_update_sky_and_lighting_params( void ) {
 
 // Initialize the time dependent variables
 void fgTimeInit(fgTIME *t) {
-    fgPrintf( FG_EVENT, FG_INFO, "Initializing Time\n");
+    FG_LOG( FG_EVENT, FG_INFO, "Initializing Time" );
 
     t->gst_diff = -9999.0;
 
-    fgPrintf( FG_EVENT, FG_DEBUG, "time offset = %d\n"
-             current_options.get_time_offset() );
+    FG_LOG( FG_EVENT, FG_DEBUG
+           "time offset = " << current_options.get_time_offset() );
 
     t->warp = current_options.get_time_offset();
     t->warp_delta = 0;
@@ -90,46 +97,6 @@ void fgTimeInit(fgTIME *t) {
 }
 
 
-// Portability wrap to get current time.
-void timestamp(fg_timestamp *timestamp) {
-#if defined( HAVE_GETTIMEOFDAY )
-    struct timeval current;
-    struct timezone tz;
-    // fg_timestamp currtime;
-    gettimeofday(&current, &tz);
-    timestamp->seconds = current.tv_sec;
-    timestamp->millis = current.tv_usec / 1000;
-#elif defined( HAVE_GETLOCALTIME )
-    SYSTEMTIME current;
-    GetLocalTime(&current);
-    timestamp->seconds = current.wSecond;
-    timestamp->millis = current.wMilliseconds;
-#elif defined( HAVE_FTIME )
-    struct timeb current;
-    ftime(&current);
-    timestamp->seconds = current.time;
-    timestamp->millis = current.millitm;
-#else
-# error Port me
-#endif
-}
-
-
-// Return duration in millis from first to last
-long timediff(fg_timestamp *first, fg_timestamp *last) {
-    return 1000 * (last->seconds - first->seconds) + 
-       (last->millis - first->millis);
-}
-
-
-// Return new timestamp given a time stamp and an interval to add in
-void timesum(fg_timestamp *res, fg_timestamp *start, long millis) {
-    res->seconds = start->seconds + 
-       ( start->millis + millis ) / 1000;
-    res->millis = ( start->millis + millis ) % 1000;
-}
-
-
 // given a date in months, mn, days, dy, years, yr, return the
 // modified Julian date (number of days elapsed since 1900 jan 0.5),
 // mjd.  Adapted from Xephem.
@@ -193,7 +160,7 @@ double utc_gst (double mjd) {
     x /= 3600.0;
     gst = (1.0/SIDRATE)*hr + x;
 
-    fgPrintf( FG_EVENT, FG_DEBUG, "  gst => %.4f\n", gst);
+    FG_LOG( FG_EVENT, FG_DEBUG, "  gst => " << gst );
 
     return(gst);
 }
@@ -282,17 +249,17 @@ time_t get_start_gmt(int year) {
 
     long int start = mktime(&mt);
 
-    fgPrintf( FG_EVENT, FG_DEBUG, "start1 = %ld\n", start);
+    FG_LOG( FG_EVENT, FG_DEBUG, "start1 = " << start );
     // the ctime() call can screw up time progression on some versions
     // of Linux
     // fgPrintf( FG_EVENT, FG_DEBUG, "start2 = %s", ctime(&start));
-    fgPrintf( FG_EVENT, FG_DEBUG, "(tm_isdst = %d)\n", mt.tm_isdst);
+    FG_LOG( FG_EVENT, FG_DEBUG, "(tm_isdst = " << mt.tm_isdst << ")" );
 
     timezone = fix_up_timezone( timezone );
 
 #   if defined( TIMEZONE_OFFSET_WORKS )
-    fgPrintf( FG_EVENT, FG_DEBUG, 
-             "start = %ld, timezone = %ld\n", start, timezone );
+    FG_LOG( FG_EVENT, FG_DEBUG, 
+           "start = " << start << ", timezone = " << timezone );
     return( start - timezone );
 #   else // ! defined( TIMEZONE_OFFSET_WORKS )
 
@@ -300,50 +267,52 @@ time_t get_start_gmt(int year) {
     if ( daylight > 0 ) {
        daylight = 1;
     } else if ( daylight < 0 ) {
-       fgPrintf( FG_EVENT, FG_WARN, 
-                 "OOOPS, problem in fg_time.cxx, no daylight savings info.\n");
+       FG_LOG( FG_EVENT, FG_WARN, 
+               "OOOPS, problem in fg_time.cxx, no daylight savings info." );
     }
 
     long int offset = -(timezone / 3600 - daylight);
 
-    fgPrintf( FG_EVENT, FG_DEBUG,
-             "  Raw time zone offset = %ld\n", timezone);
-    fgPrintf( FG_EVENT, FG_DEBUG,
-             "  Daylight Savings = %d\n", daylight);
-    fgPrintf( FG_EVENT, FG_DEBUG,
-             "  Local hours from GMT = %ld\n", offset);
+    FG_LOG( FG_EVENT, FG_DEBUG, "  Raw time zone offset = " << timezone );
+    FG_LOG( FG_EVENT, FG_DEBUG, "  Daylight Savings = " << daylight );
+    FG_LOG( FG_EVENT, FG_DEBUG, "  Local hours from GMT = " << offset );
     
     long int start_gmt = start - timezone + (daylight * 3600);
     
-    fgPrintf( FG_EVENT, FG_DEBUG, "  March 21 noon (CST) = %ld\n", start);
+    FG_LOG( FG_EVENT, FG_DEBUG, "  March 21 noon (CST) = " << start );
 
     return ( start_gmt );
 #   endif // ! defined( TIMEZONE_OFFSET_WORKS )
 #   endif // ! defined ( MK_TIME_IS_GMT )
 }
 
+static char*
+format_time( const struct tm* p, char* buf )
+{
+    sprintf( buf, "%d/%d/%2d %d:%02d:%02d", 
+            p->tm_mon, p->tm_mday, p->tm_year,
+            p->tm_hour, p->tm_min, p->tm_sec);
+    return buf;
+}
 
 // return a courser but cheaper estimate of sidereal time
 double sidereal_course(fgTIME *t, double lng) {
     struct tm *gmt;
     time_t start_gmt, now;
     double diff, part, days, hours, lst;
+    char tbuf[64];
 
     gmt = t->gmt;
     now = t->cur_time;
     start_gmt = get_start_gmt(gmt->tm_year);
 
-    fgPrintf(FG_EVENT, FG_DEBUG, 
-            "  COURSE: GMT = %d/%d/%2d %d:%02d:%02d\n", 
-            gmt->tm_mon, gmt->tm_mday, gmt->tm_year,
-            gmt->tm_hour, gmt->tm_min, gmt->tm_sec);
-
-    fgPrintf( FG_EVENT, FG_DEBUG, "  March 21 noon (GMT) = %ld\n", start_gmt);
+    FG_LOG( FG_EVENT, FG_DEBUG, "  COURSE: GMT = " << format_time(gmt, tbuf) );
+    FG_LOG( FG_EVENT, FG_DEBUG, "  March 21 noon (GMT) = " << start_gmt );
 
     diff = (now - start_gmt) / (3600.0 * 24.0);
     
-    fgPrintf( FG_EVENT, FG_DEBUG, 
-             "  Time since 3/21/%2d GMT = %.2f\n", gmt->tm_year, diff);
+    FG_LOG( FG_EVENT, FG_DEBUG, 
+           "  Time since 3/21/" << gmt->tm_year << " GMT = " << diff );
 
     part = fmod(diff, 1.0);
     days = diff - part;
@@ -355,26 +324,26 @@ double sidereal_course(fgTIME *t, double lng) {
        lst += 24.0;
     }
 
-    fgPrintf( FG_EVENT, FG_DEBUG,
-             "  days = %.1f  hours = %.2f  lon = %.2f  lst = %.2f\n", 
-             days, hours, lng, lst);
+    FG_LOG( FG_EVENT, FG_DEBUG,
+           "  days = " << days << "  hours = " << hours << "  lon = " 
+           << lng << "  lst = " << lst );
 
     return(lst);
 }
 
 
 // Update time variables such as gmt, julian date, and sidereal time
-void fgTimeUpdate(fgFLIGHT *f, fgTIME *t) {
+void fgTimeUpdate(FGInterface *f, fgTIME *t) {
     double gst_precise, gst_course;
 
-    fgPrintf( FG_EVENT, FG_BULK, "Updating time\n");
+    FG_LOG( FG_EVENT, FG_DEBUG, "Updating time" );
 
     // get current Unix calendar time (in seconds)
     t->warp += t->warp_delta;
     t->cur_time = time(NULL) + t->warp;
-    fgPrintf( FG_EVENT, FG_BULK
-             "  Current Unix calendar time = %ld  warp = %ld  delta = %ld\n", 
-             t->cur_time, t->warp, t->warp_delta);
+    FG_LOG( FG_EVENT, FG_DEBUG
+           "  Current Unix calendar time = " << t->cur_time 
+           << "  warp = " << t->warp << "  delta = " << t->warp_delta );
 
     if ( t->warp_delta ) {
        // time is changing so force an update
@@ -383,10 +352,11 @@ void fgTimeUpdate(fgFLIGHT *f, fgTIME *t) {
 
     // get GMT break down for current time
     t->gmt = gmtime(&t->cur_time);
-    fgPrintf( FG_EVENT, FG_BULK, 
-             "  Current GMT = %d/%d/%2d %d:%02d:%02d\n", 
-             t->gmt->tm_mon+1, t->gmt->tm_mday, t->gmt->tm_year,
-             t->gmt->tm_hour, t->gmt->tm_min, t->gmt->tm_sec);
+    FG_LOG( FG_EVENT, FG_DEBUG, 
+           "  Current GMT = " << t->gmt->tm_mon+1 << "/" 
+           << t->gmt->tm_mday << "/" << t->gmt->tm_year << " "
+           << t->gmt->tm_hour << ":" << t->gmt->tm_min << ":" 
+           << t->gmt->tm_sec );
 
     // calculate modified Julian date
     t->mjd = cal_mjd ((int)(t->gmt->tm_mon+1), (double)t->gmt->tm_mday, 
@@ -398,7 +368,7 @@ void fgTimeUpdate(fgFLIGHT *f, fgTIME *t) {
 
     // convert "back" to Julian date + partial day (as a fraction of one)
     t->jd = t->mjd + MJD0;
-    fgPrintf( FG_EVENT, FG_BULK, "  Current Julian Date = %.5f\n", t->jd);
+    FG_LOG( FG_EVENT, FG_DEBUG, "  Current Julian Date = " << t->jd );
 
     // printf("  Current Longitude = %.3f\n", FG_Longitude * RAD_TO_DEG);
 
@@ -406,27 +376,77 @@ void fgTimeUpdate(fgFLIGHT *f, fgTIME *t) {
     if ( t->gst_diff < -100.0 ) {
        // first time through do the expensive calculation & cheap
         // calculation to get the difference.
-      fgPrintf( FG_EVENT, FG_INFO, "  First time, doing precise gst\n");
+      FG_LOG( FG_EVENT, FG_INFO, "  First time, doing precise gst" );
       t->gst = gst_precise = sidereal_precise(t->mjd, 0.00);
       gst_course = sidereal_course(t, 0.00);
       t->gst_diff = gst_precise - gst_course;
 
-      t->lst = sidereal_course(t, -(FG_Longitude * RAD_TO_DEG)) + t->gst_diff;
+      t->lst =
+         sidereal_course(t, -(f->get_Longitude() * RAD_TO_DEG)) + t->gst_diff;
     } else {
        // course + difference should drift off very slowly
        t->gst = sidereal_course(t, 0.00) + t->gst_diff;
-       t->lst = sidereal_course(t, -(FG_Longitude * RAD_TO_DEG)) + t->gst_diff;
+       t->lst = sidereal_course(t, -(f->get_Longitude() * RAD_TO_DEG)) + 
+           t->gst_diff;
     }
-    fgPrintf( FG_EVENT, FG_DEBUG,
-             "  Current lon=0.00 Sidereal Time = %.3f\n", t->gst);
-    fgPrintf( FG_EVENT, FG_DEBUG,
-             "  Current LOCAL Sidereal Time = %.3f (%.3f) (diff = %.3f)\n", 
-             t->lst, sidereal_precise(t->mjd, -(FG_Longitude * RAD_TO_DEG)),
-             t->gst_diff);
+    FG_LOG( FG_EVENT, FG_DEBUG,
+           "  Current lon=0.00 Sidereal Time = " << t->gst );
+    FG_LOG( FG_EVENT, FG_DEBUG,
+           "  Current LOCAL Sidereal Time = " << t->lst << " (" 
+           << sidereal_precise(t->mjd, -(f->get_Longitude() * RAD_TO_DEG)) 
+           << ") (diff = " << t->gst_diff << ")" );
 }
 
 
 // $Log$
+// Revision 1.31  1999/02/05 21:29:18  curt
+// Modifications to incorporate Jon S. Berndts flight model code.
+//
+// Revision 1.30  1999/02/01 21:33:37  curt
+// Renamed FlightGear/Simulator/Flight to FlightGear/Simulator/FDM since
+// Jon accepted my offer to do this and thought it was a good idea.
+//
+// Revision 1.29  1999/01/19 20:57:08  curt
+// MacOS portability changes contributed by "Robert Puyol" <puyol@abvent.fr>
+//
+// Revision 1.28  1999/01/07 20:25:34  curt
+// Portability changes and updates from Bernie Bright.
+//
+// Revision 1.27  1998/12/11 20:26:55  curt
+// #include tweaks.
+//
+// Revision 1.26  1998/12/05 15:54:28  curt
+// Renamed class fgFLIGHT to class FGState as per request by JSB.
+//
+// Revision 1.25  1998/12/05 14:21:30  curt
+// Moved struct fg_timestamp to class fgTIMESTAMP and moved it's definition
+// to it's own file, timestamp.hxx.
+//
+// Revision 1.24  1998/12/04 01:32:49  curt
+// Converted "struct fg_timestamp" to "class fgTIMESTAMP" and added some
+// convenience inline operators.
+//
+// Revision 1.23  1998/12/03 01:18:40  curt
+// Converted fgFLIGHT to a class.
+//
+// Revision 1.22  1998/11/16 14:00:28  curt
+// FG_LOG() message tweaks.
+//
+// Revision 1.21  1998/11/06 21:18:26  curt
+// Converted to new logstream debugging facility.  This allows release
+// builds with no messages at all (and no performance impact) by using
+// the -DFG_NDEBUG flag.
+//
+// Revision 1.20  1998/11/02 18:25:38  curt
+// Check for __CYGWIN__ (b20) as well as __CYGWIN32__ (pre b20 compilers)
+// Other misc. tweaks.
+//
+// Revision 1.19  1998/10/17 01:34:29  curt
+// C++ ifying ...
+//
+// Revision 1.18  1998/10/02 21:36:09  curt
+// Fixes to try to break through the win95/98 18.3 fps barrier.
+//
 // Revision 1.17  1998/09/15 04:27:49  curt
 // Changes for new astro code.
 //