]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/fg_props.cxx
Update for changed SGPath::realpath signature
[flightgear.git] / src / Main / fg_props.cxx
index a93529dffd182245cb24460b442b79a98f3da22e..975a8a48cfe5dc4fa7923bdd1e2d795d45b955bc 100644 (file)
 #include "globals.hxx"
 #include "fg_props.hxx"
 
-
-static bool winding_ccw = true; // FIXME: temporary
-
 static bool frozen = false;    // FIXME: temporary
 
 using std::string;
-\f
 ////////////////////////////////////////////////////////////////////////
 // Default property bindings (not yet handled by any module).
 ////////////////////////////////////////////////////////////////////////
@@ -80,6 +76,8 @@ LogClassMapping log_class_mappings [] = {
   LogClassMapping(SG_ENVIRONMENT, "environment"),
   LogClassMapping(SG_SOUND, "sound"),
   LogClassMapping(SG_NAVAID, "navaid"),
+  LogClassMapping(SG_GUI, "gui"),
+  LogClassMapping(SG_TERRASYNC, "terrasync"),
   LogClassMapping(SG_UNDEFD, "")
 };
 
@@ -234,7 +232,7 @@ setFreeze (bool f)
     frozen = f;
 
     // Stop sound on a pause
-    SGSoundMgr *smgr = globals->get_soundmgr();
+    SGSoundMgr *smgr = globals->get_subsystem<SGSoundMgr>();
     if ( smgr != NULL ) {
         if ( f ) {
             smgr->suspend();
@@ -361,22 +359,6 @@ getTrackMag ()
   return SGMiscd::normalizePeriodic(0, 360, magtrack );
 }
 
-static bool
-getWindingCCW ()
-{
-  return winding_ccw;
-}
-
-static void
-setWindingCCW (bool state)
-{
-  winding_ccw = state;
-  if ( winding_ccw )
-    glFrontFace ( GL_CCW );
-  else
-    glFrontFace ( GL_CW );
-}
-
 ////////////////////////////////////////////////////////////////////////
 // Tie the properties.
 ////////////////////////////////////////////////////////////////////////
@@ -384,36 +366,148 @@ SGConstPropertyNode_ptr FGProperties::_longDeg;
 SGConstPropertyNode_ptr FGProperties::_latDeg;
 SGConstPropertyNode_ptr FGProperties::_lonLatformat;
 
-const char *
-FGProperties::getLongitudeString ()
-{
-  static char buf[32];
-  double d = _longDeg->getDoubleValue();
-  int format = _lonLatformat->getIntValue();
-  char c = d < 0.0 ? 'W' : 'E';
+/*
+ * Format the latitude and longitude floats into a character array using a variety of coordinate formats.
+ */
+static void
+formatLatLongString (double deg, int format, char *buf, char c) {
+  double min, sec;
+  int sign = deg < 0.0 ? -1 : 1;
+  deg = fabs(deg);
 
   if (format == 0) {
-    snprintf(buf, 32, "%3.6f%c", d, c);
+    // d.dddddd' (DDD format).
+    snprintf(buf, 32, "%3.6f%c", deg, c);
 
   } else if (format == 1) {
-    // dd mm.mmm' (DMM-Format) -- uses a round-off factor tailored to the
+    // d mm.mmm' (DMM format) -- uses a round-off factor tailored to the
     // required precision of the minutes field (three decimal places),
     // preventing minute values of 60.
-    double deg = fabs(d) + 5.0E-4 / 60.0;
-    double min = fabs(deg - int(deg)) * 60.0 - 4.999E-4;
-    snprintf(buf, 32, "%d*%06.3f%c", int(d < 0.0 ? -deg : deg), min, c);
+    min = (deg - int(deg)) * 60.0;
+    if (min >= 59.9995) {
+        min -= 60.0;
+        deg += 1.0;
+    }
+    snprintf(buf, 32, "%d*%06.3f'%c", int(deg), fabs(min), c);
 
-  } else {
-    // mm'ss.s'' (DMS-Format) -- uses a round-off factor tailored to the
+  } else if (format == 2) {
+    // d mm'ss.s" (DMS format) -- uses a round-off factor tailored to the
     // required precision of the seconds field (one decimal place),
     // preventing second values of 60.
-    double deg = fabs(d) + 0.05 / 3600.0;
-    double min = (deg - int(deg)) * 60.0;
-    double sec = (min - int(min)) * 60.0 - 0.049;
-    snprintf(buf, 32, "%d*%02d %04.1f%c", int(d < 0.0 ? -deg : deg),
-        int(min), fabs(sec), c);
+    min = (deg - int(deg)) * 60.0;
+    sec = (min - int(min)) * 60.0;
+    if (sec >= 59.95) {
+        sec -= 60.0;
+        min += 1.0;
+        if (min >= 60.0) {
+            min -= 60.0;
+            deg += 1.0;
+        }
+    }
+    snprintf(buf, 32, "%d*%02d'%04.1f\"%c", int(deg), int(min), fabs(sec), c);
+
+  } else if (format == 3) {
+    // d.dddddd' (signed DDD format).
+    snprintf(buf, 32, "%3.6f", sign*deg);
+
+  } else if (format == 4) {
+    // d mm.mmm' (signed DMM format).
+    min = (deg - int(deg)) * 60.0;
+    if (min >= 59.9995) {
+        min -= 60.0;
+        deg += 1.0;
+    }
+    if (sign == 1) {
+        snprintf(buf, 32, "%d*%06.3f'", int(deg), fabs(min));
+    } else {
+        snprintf(buf, 32, "-%d*%06.3f'", int(deg), fabs(min));
+    }
+
+  } else if (format == 5) {
+    // d mm'ss.s" (signed DMS format).
+    min = (deg - int(deg)) * 60.0;
+    sec = (min - int(min)) * 60.0;
+    if (sec >= 59.95) {
+        sec -= 60.0;
+        min += 1.0;
+        if (min >= 60.0) {
+            min -= 60.0;
+            deg += 1.0;
+        }
+    }
+    if (sign == 1) {
+        snprintf(buf, 32, "%d*%02d'%04.1f\"", int(deg), int(min), fabs(sec));
+    } else {
+        snprintf(buf, 32, "-%d*%02d'%04.1f\"", int(deg), int(min), fabs(sec));
+    }
+
+  } else if (format == 6) {
+    // dd.dddddd X, ddd.dddddd X (zero padded DDD format).
+    if (c == 'N' || c == 'S') {
+      snprintf(buf, 32, "%09.6f%c", deg, c);
+    } else {
+      snprintf(buf, 32, "%010.6f%c", deg, c);
+    }
+
+  } else if (format == 7) {
+    // dd mm.mmm' X, ddd mm.mmm' X (zero padded DMM format).
+    min = (deg - int(deg)) * 60.0;
+    if (min >= 59.9995) {
+        min -= 60.0;
+        deg += 1.0;
+    }
+    if (c == 'N' || c == 'S') {
+      snprintf(buf, 32, "%02d*%06.3f'%c", int(deg), fabs(min), c);
+    } else {
+      snprintf(buf, 32, "%03d*%06.3f'%c", int(deg), fabs(min), c);
+    }
+
+  } else if (format == 8) {
+    // dd mm'ss.s" X, dd mm'ss.s" X (zero padded DMS format).
+    min = (deg - int(deg)) * 60.0;
+    sec = (min - int(min)) * 60.0;
+    if (sec >= 59.95) {
+        sec -= 60.0;
+        min += 1.0;
+        if (min >= 60.0) {
+            min -= 60.0;
+            deg += 1.0;
+        }
+    }
+    if (c == 'N' || c == 'S') {
+      snprintf(buf, 32, "%02d*%02d'%04.1f\"%c", int(deg), int(min), fabs(sec), c);
+    } else {
+      snprintf(buf, 32, "%03d*%02d'%04.1f\"%c", int(deg), int(min), fabs(sec), c);
+    }
+
+  } else if (format == 9) {
+    // dd* mm'.mmm X, ddd* mm'.mmm X (Trinity House Navigation standard).
+    min = (deg - int(deg)) * 60.0;
+    if (min >= 59.9995) {
+        min -= 60.0;
+        deg += 1.0;
+    }
+    if (c == 'N' || c == 'S') {
+        snprintf(buf, 32, "%02d* %02d'.%03d%c", int(deg), int(min), int(SGMisc<double>::round((min-int(min))*1000)), c);
+    } else {
+        snprintf(buf, 32, "%03d* %02d'.%03d%c", int(deg), int(min), int(SGMisc<double>::round((min-int(min))*1000)), c);
+    }
+
+  } else {
+    // Empty the buffer for all invalid formats.
+    buf[0] = '\0';
   }
-  buf[31] = '\0';
+}
+
+const char *
+FGProperties::getLongitudeString ()
+{
+  static char buf[32];
+  double d = _longDeg->getDoubleValue();
+  int format = _lonLatformat->getIntValue();
+
+  char c = d < 0.0 ? 'W' : 'E';
+  formatLatLongString(d, format, buf, c);
   return buf;
 }
 
@@ -423,24 +517,9 @@ FGProperties::getLatitudeString ()
   static char buf[32];
   double d = _latDeg->getDoubleValue();
   int format = _lonLatformat->getIntValue();
-  char c = d < 0.0 ? 'S' : 'N';
 
-  if (format == 0) {
-    snprintf(buf, 32, "%3.6f%c", d, c);
-
-  } else if (format == 1) {
-    double deg = fabs(d) + 5.0E-4 / 60.0;
-    double min = fabs(deg - int(deg)) * 60.0 - 4.999E-4;
-    snprintf(buf, 32, "%d*%06.3f%c", int(d < 0.0 ? -deg : deg), min, c);
-
-  } else {
-    double deg = fabs(d) + 0.05 / 3600.0;
-    double min = (deg - int(deg)) * 60.0;
-    double sec = (min - int(min)) * 60.0 - 0.049;
-    snprintf(buf, 32, "%d*%02d %04.1f%c", int(d < 0.0 ? -deg : deg),
-        int(min), fabs(sec), c);
-  }
-  buf[31] = '\0';
+  char c = d < 0.0 ? 'S' : 'N';
+  formatLatLongString(d, format, buf, c);
   return buf;
 }
 
@@ -496,21 +575,18 @@ FGProperties::bind ()
   _tiedProperties.Tie("/sim/logging/classes", getLoggingClasses, setLoggingClasses);
   _tiedProperties.Tie("/sim/freeze/master", getFreeze, setFreeze);
 
-  _tiedProperties.Tie("/sim/time/elapsed-sec", getElapsedTime_sec);
+  _tiedProperties.Tie<double>("/sim/time/elapsed-sec", getElapsedTime_sec);
   _tiedProperties.Tie("/sim/time/gmt", getDateString, setDateString);
   fgSetArchivable("/sim/time/gmt");
-  _tiedProperties.Tie("/sim/time/gmt-string", getGMTString);
+  _tiedProperties.Tie<const char*>("/sim/time/gmt-string", getGMTString);
 
   // Position
-  _tiedProperties.Tie("/position/latitude-string", getLatitudeString);
-  _tiedProperties.Tie("/position/longitude-string", getLongitudeString);
+  _tiedProperties.Tie<const char*>("/position/latitude-string", getLatitudeString);
+  _tiedProperties.Tie<const char*>("/position/longitude-string", getLongitudeString);
 
   // Orientation
-  _tiedProperties.Tie("/orientation/heading-magnetic-deg", getHeadingMag);
-  _tiedProperties.Tie("/orientation/track-magnetic-deg", getTrackMag);
-
-  // Misc. Temporary junk.
-  _tiedProperties.Tie("/sim/temp/winding-ccw", getWindingCCW, setWindingCCW, false);
+  _tiedProperties.Tie<double>("/orientation/heading-magnetic-deg", getHeadingMag);
+  _tiedProperties.Tie<double>("/orientation/track-magnetic-deg", getTrackMag);
 }
 
 void
@@ -608,15 +684,15 @@ fgLoadFlight (std::istream &input)
 
 
 bool
-fgLoadProps (const char * path, SGPropertyNode * props, bool in_fg_root, int default_mode)
+fgLoadProps (const std::string& path, SGPropertyNode * props, bool in_fg_root, int default_mode)
 {
-    string fullpath;
+    SGPath fullpath;
     if (in_fg_root) {
         SGPath loadpath(globals->get_fg_root());
         loadpath.append(path);
-        fullpath = loadpath.str();
+        fullpath = loadpath;
     } else {
-        fullpath = path;
+        fullpath = SGPath::fromUtf8(path);
     }
 
     try {