AltosSiteMap: add targeting circles around landing site
[fw/altos] / ao-tools / altosui / AltosSiteMap.java
index 420bfc813ac8eae9d41dfd3033b8c9701cbdb800..25b7779243f4fda1bea9b4be51a2e0380e11007f 100644 (file)
@@ -40,7 +40,7 @@ public class AltosSiteMap extends JComponent implements AltosFlightDisplay {
 
     Graphics2D g2d;
 
-    private void setLocation(double new_lat, double new_lng) {
+    private boolean setLocation(double new_lat, double new_lng) {
         int new_zoom = 15;
         lat = new_lat;
         lng = new_lng;
@@ -60,8 +60,10 @@ public class AltosSiteMap extends JComponent implements AltosFlightDisplay {
             picLabel.setIcon(new ImageIcon( myPicture ));
             g2d = myPicture.createGraphics();
         } catch (Exception e) { 
-            throw new RuntimeException(e);
-        };
+            // throw new RuntimeException(e);
+            return false;
+        }
+        return true;
     }
 
     private static double limit(double v, double lo, double hi) {
@@ -116,14 +118,21 @@ public class AltosSiteMap extends JComponent implements AltosFlightDisplay {
         Color.BLACK   // landed
     };
 
+    boolean drawn_landed_circle = false;
+    boolean nomaps = false;
     public void show(AltosState state, int crc_errors) {
+        if (nomaps)
+            return;
         if (!state.gps_ready && state.pad_lat == 0 && state.pad_lon == 0)
             return;
         double plat = (int)(state.pad_lat*200)/200.0;
         double plon = (int)(state.pad_lon*200)/200.0;
 
         if (last_pt == null) {
-            setLocation(plat, plon);
+            if (!setLocation(plat, plon)) {
+                nomaps = true;
+                return;
+            }
         }
 
         Point2D.Double pt = pt(state.gps.lat, state.gps.lon);
@@ -133,6 +142,15 @@ public class AltosSiteMap extends JComponent implements AltosFlightDisplay {
             }
             g2d.draw(new Line2D.Double(last_pt, pt));
         }
+
+        if (state.state == 8 && !drawn_landed_circle) {
+            drawn_landed_circle = true;
+            g2d.setColor(Color.RED);
+            g2d.drawOval((int)pt.x-5, (int)pt.y-5, 10, 10);
+            g2d.drawOval((int)pt.x-20, (int)pt.y-20, 40, 40);
+            g2d.drawOval((int)pt.x-35, (int)pt.y-35, 70, 70);
+        }
+
         last_pt = pt;
         repaint();
     }