X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosdroid%2Fsrc%2Forg%2Faltusmetrum%2FAltosDroid%2FTabMap.java;h=d5d1d262480d8ef7b55b650704c39b199905a3c0;hp=5376d423ec341c064795c4a6d482d7adcdba5d48;hb=b8bdb432aacc1a273ee484a29a24b3768c274db6;hpb=85013045ca505096064aaf45c312b158d0263d2a diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java index 5376d423..d5d1d262 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java @@ -17,7 +17,7 @@ package org.altusmetrum.AltosDroid; -import java.util.Arrays; +import java.util.*; import org.altusmetrum.altoslib_7.*; @@ -33,6 +33,7 @@ import com.google.android.gms.maps.model.PolylineOptions; import android.app.Activity; import android.graphics.Color; +import android.graphics.*; import android.os.Bundle; import android.support.v4.app.Fragment; //import android.support.v4.app.FragmentTransaction; @@ -43,13 +44,11 @@ import android.widget.TextView; import android.location.Location; public class TabMap extends AltosDroidTab { - AltosDroid mAltosDroid; - private SupportMapFragment mMapFragment; private GoogleMap mMap; private boolean mapLoaded = false; - private Marker mRocketMarker; + private HashMap rockets = new HashMap(); private Marker mPadMarker; private boolean pad_set; private Polyline mPolyline; @@ -63,11 +62,43 @@ public class TabMap extends AltosDroidTab { private double mapAccuracy = -1; - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - mAltosDroid = (AltosDroid) activity; - mAltosDroid.registerTab(this); + private AltosLatLon my_position = null; + private AltosLatLon target_position = null; + + private Bitmap rocket_bitmap(String text) { + + /* From: http://mapicons.nicolasmollet.com/markers/industry/military/missile-2/ + */ + Bitmap orig_bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.rocket); + Bitmap bitmap = orig_bitmap.copy(Bitmap.Config.ARGB_8888, true); + + Canvas canvas = new Canvas(bitmap); + Paint paint = new Paint(); + paint.setTextSize(40); + paint.setColor(0xff000000); + + Rect bounds = new Rect(); + paint.getTextBounds(text, 0, text.length(), bounds); + + int width = bounds.right - bounds.left; + int height = bounds.bottom - bounds.top; + + float x = bitmap.getWidth() / 2.0f - width / 2.0f; + float y = bitmap.getHeight() / 2.0f - height / 2.0f; + + AltosDebug.debug("map label x %f y %f\n", x, y); + + canvas.drawText(text, 0, text.length(), x, y, paint); + return bitmap; + } + + private Marker rocket_marker(int serial, double lat, double lon) { + Bitmap bitmap = rocket_bitmap(String.format("%d", serial)); + + return mMap.addMarker(new MarkerOptions() + .icon(BitmapDescriptorFactory.fromBitmap(bitmap)) + .position(new LatLng(lat, lon)) + .visible(true)); } @Override @@ -102,32 +133,15 @@ public class TabMap extends AltosDroidTab { getChildFragmentManager().beginTransaction().add(R.id.map, mMapFragment).commit(); } - @Override - public void onDestroyView() { - super.onDestroyView(); - - mAltosDroid.unregisterTab(this); - mAltosDroid = null; - - //Fragment fragment = (getFragmentManager().findFragmentById(R.id.map)); - //FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); - //ft.remove(fragment); - //ft.commit(); - } - private void setupMap() { mMap = mMapFragment.getMap(); if (mMap != null) { + set_map_type(altos_droid.map_type); mMap.setMyLocationEnabled(true); mMap.getUiSettings().setTiltGesturesEnabled(false); mMap.getUiSettings().setZoomControlsEnabled(false); - mRocketMarker = mMap.addMarker( - // From: http://mapicons.nicolasmollet.com/markers/industry/military/missile-2/ - new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.rocket)) - .position(new LatLng(0,0)) - .visible(false) - ); + Bitmap label_bitmap = rocket_bitmap("hello"); mPadMarker = mMap.addMarker( new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.pad)) @@ -137,7 +151,7 @@ public class TabMap extends AltosDroidTab { mPolyline = mMap.addPolyline( new PolylineOptions().add(new LatLng(0,0), new LatLng(0,0)) - .width(3) + .width(20) .color(Color.BLUE) .visible(false) ); @@ -155,22 +169,47 @@ public class TabMap extends AltosDroidTab { public String tab_name() { return "map"; } - public void show(AltosState state, AltosGreatCircle from_receiver, Location receiver) { + private void set_rocket(int serial, AltosState state) { + Marker marker; + + if (state.gps == null || state.gps.lat == AltosLib.MISSING) + return; + + if (rockets.containsKey(serial)) { + marker = rockets.get(serial); + marker.setPosition(new LatLng(state.gps.lat, state.gps.lon)); + } else { + marker = rocket_marker(serial, state.gps.lat, state.gps.lon); + rockets.put(serial, marker); + marker.setVisible(true); + } + } + + private void remove_rocket(int serial) { + Marker marker = rockets.get(serial); + marker.remove(); + rockets.remove(serial); + } + + public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) { if (from_receiver != null) { mBearingView.setText(String.format("%3.0f°", from_receiver.bearing)); set_value(mDistanceView, AltosConvert.distance, 6, from_receiver.distance); } - if (state != null) { - if (mapLoaded) { - if (state.gps != null) { - mRocketMarker.setPosition(new LatLng(state.gps.lat, state.gps.lon)); - mRocketMarker.setVisible(true); + if (telem_state != null) { + for (int serial : rockets.keySet()) { + if (!telem_state.states.containsKey(serial)) + remove_rocket(serial); + } - mPolyline.setPoints(Arrays.asList(new LatLng(state.pad_lat, state.pad_lon), new LatLng(state.gps.lat, state.gps.lon))); - mPolyline.setVisible(true); - } + for (int serial : telem_state.states.keySet()) { + set_rocket(serial, telem_state.states.get(serial)); + } + } + if (state != null) { + if (mapLoaded) { if (!pad_set && state.pad_lat != AltosLib.MISSING) { pad_set = true; mPadMarker.setPosition(new LatLng(state.pad_lat, state.pad_lon)); @@ -178,6 +217,9 @@ public class TabMap extends AltosDroidTab { } } if (state.gps != null) { + + target_position = new AltosLatLon(state.gps.lat, state.gps.lon); + mTargetLatitudeView.setText(AltosDroid.pos(state.gps.lat, "N", "S")); mTargetLongitudeView.setText(AltosDroid.pos(state.gps.lon, "E", "W")); if (state.gps.locked && state.gps.nsat >= 4) @@ -192,9 +234,16 @@ public class TabMap extends AltosDroidTab { accuracy = receiver.getAccuracy(); else accuracy = 1000; - mReceiverLatitudeView.setText(AltosDroid.pos(receiver.getLatitude(), "N", "S")); - mReceiverLongitudeView.setText(AltosDroid.pos(receiver.getLongitude(), "E", "W")); - center (receiver.getLatitude(), receiver.getLongitude(), accuracy); + + my_position = new AltosLatLon(receiver.getLatitude(), receiver.getLongitude()); + mReceiverLatitudeView.setText(AltosDroid.pos(my_position.lat, "N", "S")); + mReceiverLongitudeView.setText(AltosDroid.pos(my_position.lon, "E", "W")); + center (my_position.lat, my_position.lon, accuracy); + } + + if (my_position != null && target_position != null) { + mPolyline.setPoints(Arrays.asList(new LatLng(my_position.lat, my_position.lon), new LatLng(target_position.lat, target_position.lon))); + mPolyline.setVisible(true); } }