From af0ad80b51fb1a95b89dc989dff0bb1580102072 Mon Sep 17 00:00:00 2001 From: mfranz Date: Sat, 17 Jun 2006 16:33:00 +0000 Subject: [PATCH] move generation of lon/lat string representations here from cockpit.cxx. 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 | 71 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/Main/fg_props.cxx b/src/Main/fg_props.cxx index d027bf2fe..1ab498b29 100644 --- a/src/Main/fg_props.cxx +++ b/src/Main/fg_props.cxx @@ -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; +} + + + //////////////////////////////////////////////////////////////////////// // 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");