]> git.mxchange.org Git - flightgear.git/commitdiff
move generation of lon/lat string representations here from cockpit.cxx.
authormfranz <mfranz>
Sat, 17 Jun 2006 16:33:00 +0000 (16:33 +0000)
committermfranz <mfranz>
Sat, 17 Jun 2006 16:33:00 +0000 (16:33 +0000)
Thanks to tied functions, this is only executed when the node is read. This
will be done by the old & new HUD code, the latter of which won't have a
special lon/lat mode at all. Instead it will be regular labels that point
to these properties for displaying lon/lat.
   I would have liked to avoid the duplication of code (lon and lat being
basically the same thing), and to avoid using static buffers and all, but
... if anyone wants to make it prettier, go ahead.
   The format is controlled by /sim/lon-lat-format (will be changed if I
find a better place).

src/Main/fg_props.cxx

index d027bf2fec34ec88a1515f9afc85c66bebdfec0e..1ab498b29f53a22c896d159f4ca2edf39e936faa 100644 (file)
@@ -433,6 +433,70 @@ setFDMDataLogging (bool state)
   }
 }
 
+static const char *
+getLongitudeString ()
+{
+  static SGConstPropertyNode_ptr n = fgGetNode("/position/longitude-deg", true);
+  static SGConstPropertyNode_ptr f = fgGetNode("/sim/lon-lat-format", true);
+  static char buf[32];
+  double d = n->getDoubleValue();
+  int format = f->getIntValue();
+
+  if (format == 0) {
+    snprintf(buf, 32, "%3.6f", d);
+
+  } else if (format == 1) {
+    // dd 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,
+        d < 0.0 ? 'W' : 'E');
+
+  } else {
+    // 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), sec, d < 0.0 ? 'W' : 'E');
+  }
+  return buf;
+}
+
+static const char *
+getLatitudeString ()
+{
+  static SGConstPropertyNode_ptr n = fgGetNode("/position/latitude-deg", true);
+  static SGConstPropertyNode_ptr f = fgGetNode("/sim/lon-lat-format", true);
+  static char buf[32];
+  double d = n->getDoubleValue();
+  int format = f->getIntValue();
+
+  if (format == 0) {
+    snprintf(buf, 32, "%3.6f", d);
+
+  } 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,
+        d < 0.0 ? 'S' : 'N');
+
+  } 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), sec, d < 0.0 ? 'S' : 'N');
+  }
+  return buf;
+}
+
+
+
 \f
 ////////////////////////////////////////////////////////////////////////
 // Tie the properties.
@@ -464,6 +528,10 @@ FGProperties::bind ()
   fgSetArchivable("/sim/time/gmt");
   fgTie("/sim/time/gmt-string", getGMTString);
 
+                               // Position
+  fgTie("/position/latitude-string", getLatitudeString);
+  fgTie("/position/longitude-string", getLongitudeString);
+
                                // Orientation
   fgTie("/orientation/heading-magnetic-deg", getHeadingMag);
 
@@ -490,6 +558,9 @@ FGProperties::unbind ()
   fgUntie("/sim/time/elapsed-sec");
   fgUntie("/sim/time/gmt");
   fgUntie("/sim/time/gmt-string");
+                               // Position
+  fgUntie("/position/latitude-string");
+  fgUntie("/position/longitude-string");
 
                                // Orientation
   fgUntie("/orientation/heading-magnetic-deg");