]> git.mxchange.org Git - flightgear.git/commitdiff
Fix standalone terrasync build
authorJames Turner <zakalawe@mac.com>
Tue, 25 Feb 2014 09:15:08 +0000 (09:15 +0000)
committerJames Turner <zakalawe@mac.com>
Tue, 25 Feb 2014 09:15:08 +0000 (09:15 +0000)
- code from SGTerraSync now lives here. This is not a great approach,
since this tool can only schedule based on position, but no worse than
before.

utils/TerraSync/terrasync.cxx

index 1e93aa8bdc256b82d532d66fc829e813f315e975..231438a546b752504402cd0d0caf8172024b72c0 100644 (file)
@@ -238,6 +238,130 @@ parse_message( int verbose, const string &msg, int *lat, int *lon )
     }
 }
 
+void
+syncArea( int lat, int lon )
+{
+    if ( lat < -90 || lat > 90 || lon < -180 || lon > 180 )
+        return;
+    char NS, EW;
+    int baselat, baselon;
+
+    if ( lat < 0 ) {
+        int base = (int)(lat / 10);
+        if ( lat == base * 10 ) {
+            baselat = base * 10;
+        } else {
+            baselat = (base - 1) * 10;
+        }
+        NS = 's';
+    } else {
+        baselat = (int)(lat / 10) * 10;
+        NS = 'n';
+    }
+    if ( lon < 0 ) {
+        int base = (int)(lon / 10);
+        if ( lon == base * 10 ) {
+            baselon = base * 10;
+        } else {
+            baselon = (base - 1) * 10;
+        }
+        EW = 'w';
+    } else {
+        baselon = (int)(lon / 10) * 10;
+        EW = 'e';
+    }
+
+    ostringstream dir;
+    dir << setfill('0')
+    << EW << setw(3) << abs(baselon) << NS << setw(2) << abs(baselat) << "/"
+    << EW << setw(3) << abs(lon)     << NS << setw(2) << abs(lat);
+    
+    pTerraSync->syncAreaByPath(dir.str());
+}
+
+void 
+syncAreas( int lat, int lon, int lat_dir, int lon_dir )
+{
+    if ( lat_dir == 0 && lon_dir == 0 ) {
+        
+        // do surrounding 8 1x1 degree areas.
+        for ( int i = lat - 1; i <= lat + 1; ++i ) {
+            for ( int j = lon - 1; j <= lon + 1; ++j ) {
+                if ( i != lat || j != lon ) {
+                    syncArea( i, j );
+                }
+            }
+        }
+    } else {
+        if ( lat_dir != 0 ) {
+            syncArea( lat + lat_dir, lon - 1 );
+            syncArea( lat + lat_dir, lon + 1 );
+            syncArea( lat + lat_dir, lon );
+        }
+        if ( lon_dir != 0 ) {
+            syncArea( lat - 1, lon + lon_dir );
+            syncArea( lat + 1, lon + lon_dir );
+            syncArea( lat, lon + lon_dir );
+        }
+    }
+
+    // do current 1x1 degree area first
+    syncArea( lat, lon );
+}
+
+bool 
+schedulePosition(int lat, int lon)
+{
+    bool Ok = false;
+    if ((lat == simgear::NOWHERE) || (lon == simgear::NOWHERE)) {
+        return Ok;
+    }
+    
+    static int last_lat = simgear::NOWHERE;
+    static int last_lon = simgear::NOWHERE;
+    if ((lat == last_lat) && (lon == last_lon)) {
+        Ok = true;
+        return Ok;
+    }
+
+    int lat_dir=0;
+    int lon_dir=0;
+    
+    if ( last_lat != simgear::NOWHERE && last_lon != simgear::NOWHERE )
+    {
+        int dist = lat - last_lat;
+        if ( dist != 0 )
+        {
+            lat_dir = dist / abs(dist);
+        }
+        else
+        {
+            lat_dir = 0;
+        }
+        dist = lon - last_lon;
+        if ( dist != 0 )
+        {
+            lon_dir = dist / abs(dist);
+        } else
+        {
+            lon_dir = 0;
+        }
+    }
+
+    cout << "Scenery update for " <<
+           "lat = " << lat << ", lon = " << lon <<
+           ", lat_dir = " << lat_dir << ",  " <<
+           "lon_dir = " << lon_dir << endl;
+
+    syncAreas( lat, lon, lat_dir, lon_dir );
+    Ok = true;
+
+    last_lat = lat;
+    last_lon = lon;
+
+    return Ok;
+}
+    
 /** Monitor UDP socket and process NMEA position updates. */
 int
 processRequests(SGPropertyNode_ptr config, bool testing, int verbose, int port)
@@ -305,7 +429,7 @@ processRequests(SGPropertyNode_ptr config, bool testing, int verbose, int port)
 
         if ( recv_msg )
         {
-            pTerraSync->schedulePosition(lat, lon);
+            schedulePosition(lat, lon);
         }
 
         if ( testing )