From: mfranz Date: Sat, 17 Jun 2006 16:33:00 +0000 (+0000) Subject: move generation of lon/lat string representations here from cockpit.cxx. X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=af0ad80b51fb1a95b89dc989dff0bb1580102072;p=flightgear.git 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). --- 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");