]> git.mxchange.org Git - flightgear.git/blobdiff - Time/fg_time.cxx
Renamed class fgFLIGHT to class FGState as per request by JSB.
[flightgear.git] / Time / fg_time.cxx
index d75517be13a1bd70c9b60e63c8132ccee5642002..11cb3b9a359fd9a7e98c21a1ee14eb928fc983cc 100644 (file)
 #  include <sys/time.h>  // for get/setitimer, gettimeofday, struct timeval
 #endif
 
-#include <Astro/orbits.hxx>
-#include <Astro/sun.hxx>
+#ifdef  WIN32
+#  include <windows.h>
+#  if defined( __CYGWIN__ ) || defined( __CYGWIN32__ )
+#    define NEAR /* */
+#    define FAR  /* */
+#  endif
+#  include <mmsystem.h>
+#endif
+
 #include <Astro/sky.hxx>
-#include <Debug/fg_debug.h>
-#include <Flight/flight.h>
+#include <Astro/solarsystem.hxx>
+#include <Debug/logstream.hxx>
+#include <Flight/flight.hxx>
 #include <Include/fg_constants.h>
 #include <Main/options.hxx>
 #include <Time/light.hxx>
@@ -66,7 +74,8 @@ fgTIME cur_time_params;
 
 // Force an update of the sky and lighting parameters
 static void local_update_sky_and_lighting_params( void ) {
-    fgSunInit();
+    // fgSunInit();
+    SolarSystem::theSolarSystem->rebuild();
     cur_light_params.Update();
     fgSkyColorsInit();
 }
@@ -74,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;
@@ -88,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.
@@ -191,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);
 }
@@ -280,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 )
 
@@ -298,22 +267,22 @@ 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 )
@@ -331,17 +300,18 @@ double sidereal_course(fgTIME *t, double lng) {
     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);
+    FG_LOG( FG_EVENT, FG_DEBUG, 
+           "  COURSE: GMT = "
+           << 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, "  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;
@@ -353,26 +323,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(FGState *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
@@ -381,10 +351,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, 
@@ -396,7 +367,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);
 
@@ -404,27 +375,64 @@ 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.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.
+//
 // Revision 1.16  1998/08/29 13:11:32  curt
 // Bernie Bright writes:
 //   I've created some new classes to enable pointers-to-functions and