From cb23b992be8ba40c97d8988c134a814a13ccd58c Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 25 May 2015 20:34:05 -0700 Subject: altoslib/altosuilib: Update library version to 7 So many ABI/API changes Signed-off-by: Keith Packard --- altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java') diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java index 0ac78219..f7eb43db 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java @@ -17,7 +17,7 @@ package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_6.*; +import org.altusmetrum.altoslib_7.*; import android.app.Activity; import android.os.Bundle; -- cgit v1.2.3 From c813c2c8f71017a686128e06b5178fc99ece251c Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 6 Jun 2015 20:36:18 -0700 Subject: altosdroid: Add multi-tracker support This lets you view multiple trackers in the offline maps tab (online maps not done yet), saves state of each tracker to preferences. Signed-off-by: Keith Packard --- .../src/org/altusmetrum/AltosDroid/AltosDroid.java | 161 +++++++++++++++++---- .../AltosDroid/AltosDroidPreferencesBackend.java | 8 +- .../org/altusmetrum/AltosDroid/AltosDroidTab.java | 36 +++-- .../altusmetrum/AltosDroid/DeviceListActivity.java | 20 ++- .../src/org/altusmetrum/AltosDroid/TabAscent.java | 18 +-- .../src/org/altusmetrum/AltosDroid/TabDescent.java | 20 +-- .../src/org/altusmetrum/AltosDroid/TabLanded.java | 19 +-- .../src/org/altusmetrum/AltosDroid/TabMap.java | 70 +++++---- .../org/altusmetrum/AltosDroid/TabMapOffline.java | 43 +++--- .../src/org/altusmetrum/AltosDroid/TabPad.java | 18 +-- .../altusmetrum/AltosDroid/TelemetryLogger.java | 2 +- .../altusmetrum/AltosDroid/TelemetryReader.java | 21 +-- .../altusmetrum/AltosDroid/TelemetryService.java | 75 ++++++++-- .../org/altusmetrum/AltosDroid/TelemetryState.java | 8 +- 14 files changed, 316 insertions(+), 203 deletions(-) (limited to 'altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java') diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java index 8c9ff31f..942ebbd5 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java @@ -42,16 +42,8 @@ import android.content.res.Resources; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.util.DisplayMetrics; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.Window; -import android.view.View; -import android.view.LayoutInflater; -import android.widget.TabHost; -import android.widget.TextView; -import android.widget.RelativeLayout; -import android.widget.Toast; +import android.view.*; +import android.widget.*; import android.app.AlertDialog; import android.location.Location; import android.hardware.usb.*; @@ -112,6 +104,8 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { // Timer and Saved flight state for Age calculation private Timer timer; AltosState saved_state; + TelemetryState telemetry_state; + Integer[] serials; UsbDevice pending_usb_device; boolean start_with_usb; @@ -136,13 +130,11 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { switch (msg.what) { case MSG_STATE: AltosDebug.debug("MSG_STATE"); - TelemetryState telemetry_state = (TelemetryState) msg.obj; - if (telemetry_state == null) { + if (msg.obj == null) { AltosDebug.debug("telemetry_state null!"); return; } - - ad.update_state(telemetry_state); + ad.update_state((TelemetryState) msg.obj); break; case MSG_UPDATE_AGE: AltosDebug.debug("MSG_UPDATE_AGE"); @@ -258,17 +250,34 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { boolean registered_units_listener; - void update_state(TelemetryState telemetry_state) { + int current_serial; + + void update_state(TelemetryState new_telemetry_state) { + + if (new_telemetry_state != null) + telemetry_state = new_telemetry_state; + + if (current_serial == 0) + current_serial = telemetry_state.latest_serial; if (!registered_units_listener) { registered_units_listener = true; AltosPreferences.register_units_listener(this); } + serials = telemetry_state.states.keySet().toArray(new Integer[0]); + update_title(telemetry_state); - update_ui(telemetry_state.state, telemetry_state.location); - if (telemetry_state.connect == TelemetryState.CONNECT_CONNECTED) - start_timer(); + + AltosDebug.debug("update state current serial %d\n", current_serial); + + AltosState state = null; + if (telemetry_state.states.containsKey(current_serial)) + state = telemetry_state.states.get(current_serial); + + update_ui(telemetry_state, state, telemetry_state.location); + + start_timer(); } boolean same_string(String a, String b) { @@ -283,22 +292,55 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { } } + + private int blend_component(int a, int b, double r, int shift, int mask) { + return ((int) (((a >> shift) & mask) * r + ((b >> shift) & mask) * (1 - r)) & mask) << shift; + } + private int blend_color(int a, int b, double r) { + return (blend_component(a, b, r, 0, 0xff) | + blend_component(a, b, r, 8, 0xff) | + blend_component(a, b, r, 16, 0xff) | + blend_component(a, b, r, 24, 0xff)); + } + + int state_age(AltosState state) { + return (int) ((System.currentTimeMillis() - state.received_time + 500) / 1000); + } + + void set_screen_on(int age) { + if (age < 60) + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + else + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + void update_age() { if (saved_state != null) { - int age = (int) ((System.currentTimeMillis() - saved_state.received_time + 500) / 1000); - boolean old = age >= 10; - if (old != mAgeViewOld) { - if (old) - mAgeView.setTextColor(mAgeOldColor); - else - mAgeView.setTextColor(mAgeNewColor); - mAgeViewOld = old; - } - mAgeView.setText(String.format("%d", age)); + int age = state_age(saved_state); + + double age_scale = age / 100.0; + + if (age_scale > 1.0) + age_scale = 1.0; + + mAgeView.setTextColor(blend_color(mAgeOldColor, mAgeNewColor, age_scale)); + + set_screen_on(age); + + String text; + if (age < 60) + text = String.format("%ds", age); + else if (age < 60 * 60) + text = String.format("%dm", age / 60); + else if (age < 60 * 60 * 24) + text = String.format("%dh", age / (60 * 60)); + else + text = String.format("%dd", age / (24 * 60 * 60)); + mAgeView.setText(text); } } - void update_ui(AltosState state, Location location) { + void update_ui(TelemetryState telem_state, AltosState state, Location location) { int prev_state = AltosLib.ao_flight_invalid; @@ -308,6 +350,8 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { prev_state = saved_state.state; if (state != null) { + set_screen_on(state_age(state)); + if (state.state == AltosLib.ao_flight_stateless) { boolean prev_locked = false; boolean locked = false; @@ -382,7 +426,7 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { } for (AltosDroidTab mTab : mTabs) - mTab.update_ui(state, from_receiver, location, mTab == mTabsAdapter.currentItem()); + mTab.update_ui(telem_state, state, from_receiver, location, mTab == mTabsAdapter.currentItem()); if (state != null && mAltosVoice != null) mAltosVoice.tell(state, from_receiver); @@ -744,6 +788,26 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { } } + void select_tracker(int serial) { + int i; + for (i = 0; i < serials.length; i++) + if (serials[i] == serial) + break; + if (i == serials.length) + return; + + AltosDebug.debug("Switching to serial %d\n", serial); + current_serial = serial; + update_state(null); + } + + void delete_track(int serial) { + try { + mService.send(Message.obtain(null, TelemetryService.MSG_DELETE_SERIAL, (Integer) serial)); + } catch (Exception ex) { + } + } + @Override public boolean onOptionsItemSelected(MenuItem item) { Intent serverIntent = null; @@ -824,8 +888,43 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { serverIntent = new Intent(this, MapTypeActivity.class); startActivityForResult(serverIntent, REQUEST_MAP_TYPE); return true; + case R.id.select_tracker: + if (serials != null) { + String[] trackers = new String[serials.length]; + for (int i = 0; i < serials.length; i++) + trackers[i] = String.format("%d", serials[i]); + AlertDialog.Builder builder_serial = new AlertDialog.Builder(this); + builder_serial.setTitle("Select a tracker"); + builder_serial.setItems(trackers, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int item) { + select_tracker(serials[item]); + } + }); + AlertDialog alert_serial = builder_serial.create(); + alert_serial.show(); + + } + return true; + case R.id.delete_track: + if (serials != null) { + String[] trackers = new String[serials.length]; + for (int i = 0; i < serials.length; i++) + trackers[i] = String.format("%d", serials[i]); + AlertDialog.Builder builder_serial = new AlertDialog.Builder(this); + builder_serial.setTitle("Delete a track"); + builder_serial.setItems(trackers, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int item) { + delete_track(serials[item]); + } + }); + AlertDialog alert_serial = builder_serial.create(); + alert_serial.show(); + + } + return true; } return false; } - } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java index 75676e28..dfc37153 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java @@ -44,7 +44,12 @@ public class AltosDroidPreferencesBackend implements AltosPreferencesBackend { public String[] keys() { Map all = prefs.getAll(); - return (String[])all.keySet().toArray(); + Object[] ao = all.keySet().toArray(); + + String[] as = new String[ao.length]; + for (int i = 0; i < ao.length; i++) + as[i] = (String) ao[i]; + return as; } public AltosPreferencesBackend node(String key) { @@ -104,6 +109,7 @@ public class AltosDroidPreferencesBackend implements AltosPreferencesBackend { } public void remove(String key) { + AltosDebug.debug("remove preference %s\n", key); editor.remove(key); } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java index f1f1b6de..017315af 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java @@ -29,11 +29,13 @@ import android.location.Location; import android.widget.TextView; public abstract class AltosDroidTab extends Fragment implements AltosUnitsListener { + TelemetryState last_telem_state; AltosState last_state; AltosGreatCircle last_from_receiver; Location last_receiver; + AltosDroid altos_droid; - public abstract void show(AltosState state, AltosGreatCircle from_receiver, Location receiver); + public abstract void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver); public abstract String tab_name(); @@ -41,8 +43,8 @@ public abstract class AltosDroidTab extends Fragment implements AltosUnitsListen } public void units_changed(boolean imperial_units) { - if (!isHidden() && last_state != null) - show(last_state, last_from_receiver, last_receiver); + if (!isHidden()) + show(last_telem_state, last_state, last_from_receiver, last_receiver); } public void set_value(TextView text_view, @@ -59,17 +61,27 @@ public abstract class AltosDroidTab extends Fragment implements AltosUnitsListen FragmentTransaction ft = AltosDroid.fm.beginTransaction(); AltosDebug.debug("set visible %b %s\n", visible, tab_name()); if (visible) { - AltosState state = last_state; - AltosGreatCircle from_receiver = last_from_receiver; - Location receiver = last_receiver; - ft.show(this); - show(state, from_receiver, receiver); + show(last_telem_state, last_state, last_from_receiver, last_receiver); } else ft.hide(this); ft.commitAllowingStateLoss(); } + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + altos_droid = (AltosDroid) activity; + altos_droid.registerTab(this); + } + + @Override + public void onDetach() { + super.onDetach(); + altos_droid.unregisterTab(this); + altos_droid = null; + } + @Override public void onResume() { super.onResume(); @@ -77,12 +89,16 @@ public abstract class AltosDroidTab extends Fragment implements AltosUnitsListen set_visible(true); } - public void update_ui(AltosState state, AltosGreatCircle from_receiver, Location receiver, boolean is_current) { + public void update_ui(TelemetryState telem_state, AltosState state, + AltosGreatCircle from_receiver, Location receiver, boolean is_current) + { + last_telem_state = telem_state; last_state = state; last_from_receiver = from_receiver; last_receiver = receiver; + AltosDebug.debug("update_ui tab %s is_current %b\n", tab_name(), is_current); if (is_current) - show(state, from_receiver, receiver); + show(telem_state, state, from_receiver, receiver); else return; } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/DeviceListActivity.java b/altosdroid/src/org/altusmetrum/AltosDroid/DeviceListActivity.java index 4af117a2..f36ef267 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/DeviceListActivity.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/DeviceListActivity.java @@ -191,14 +191,22 @@ public class DeviceListActivity extends Activity { // When discovery finds a device if (BluetoothDevice.ACTION_FOUND.equals(action)) { - // Get the BluetoothDevice object from the Intent + + /* Get the BluetoothDevice object from the Intent + */ BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); - // If it's already paired, skip it, because it's been listed already - if ( device.getBondState() != BluetoothDevice.BOND_BONDED - && device.getName().startsWith("TeleBT") ) { - mNewDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress()); + + /* If it's already paired, skip it, because it's been listed already + */ + if (device != null && device.getBondState() != BluetoothDevice.BOND_BONDED) + { + String name = device.getName(); + if (name != null && name.startsWith("TeleBT")) + mNewDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress()); } - // When discovery is finished, change the Activity title + + /* When discovery is finished, change the Activity title + */ } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { setProgressBarIndeterminateVisibility(false); setTitle(R.string.select_device); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java index 797dc7c3..afce937f 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java @@ -30,8 +30,6 @@ import android.widget.TextView; import android.location.Location; public class TabAscent extends AltosDroidTab { - AltosDroid mAltosDroid; - private TextView mHeightView; private TextView mMaxHeightView; private TextView mSpeedView; @@ -45,13 +43,6 @@ public class TabAscent extends AltosDroidTab { private TextView mMainVoltageView; private GoNoGoLights mMainLights; - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - mAltosDroid = (AltosDroid) activity; - mAltosDroid.registerTab(this); - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.tab_ascent, container, false); @@ -78,18 +69,11 @@ public class TabAscent extends AltosDroidTab { return v; } - @Override - public void onDestroy() { - super.onDestroy(); - mAltosDroid.unregisterTab(this); - mAltosDroid = null; - } - public String tab_name() { return "ascent"; } - public void show(AltosState state, AltosGreatCircle from_receiver, Location receiver) { + public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) { if (state != null) { set_value(mHeightView, AltosConvert.height, 6, state.height()); set_value(mHeightView, AltosConvert.height, 6, state.height()); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java index f3f5a0f1..3429ee72 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java @@ -30,8 +30,6 @@ import android.widget.TextView; import android.location.Location; public class TabDescent extends AltosDroidTab { - AltosDroid mAltosDroid; - private TextView mSpeedView; private TextView mHeightView; private TextView mElevationView; @@ -46,14 +44,6 @@ public class TabDescent extends AltosDroidTab { private TextView mMainVoltageView; private GoNoGoLights mMainLights; - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - mAltosDroid = (AltosDroid) activity; - mAltosDroid.registerTab(this); - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.tab_descent, container, false); @@ -81,17 +71,9 @@ public class TabDescent extends AltosDroidTab { return v; } - - @Override - public void onDestroy() { - super.onDestroy(); - mAltosDroid.unregisterTab(this); - mAltosDroid = null; - } - public String tab_name() { return "descent"; } - public void show(AltosState state, AltosGreatCircle from_receiver, Location receiver) { + public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) { if (state != null) { set_value(mSpeedView, AltosConvert.speed, 6, state.speed()); set_value(mHeightView, AltosConvert.height, 6, state.height()); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java index d37891f7..dd3f938e 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java @@ -29,8 +29,6 @@ import android.widget.TextView; import android.location.Location; public class TabLanded extends AltosDroidTab { - AltosDroid mAltosDroid; - private TextView mBearingView; private TextView mDistanceView; private TextView mTargetLatitudeView; @@ -41,14 +39,6 @@ public class TabLanded extends AltosDroidTab { private TextView mMaxSpeedView; private TextView mMaxAccelView; - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - mAltosDroid = (AltosDroid) activity; - mAltosDroid.registerTab(this); - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.tab_landed, container, false); @@ -66,16 +56,9 @@ public class TabLanded extends AltosDroidTab { return v; } - @Override - public void onDestroy() { - super.onDestroy(); - mAltosDroid.unregisterTab(this); - mAltosDroid = null; - } - public String tab_name() { return "landed"; } - public void show(AltosState state, AltosGreatCircle from_receiver, Location receiver) { + 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); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java index cea3cac6..ff36875d 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java @@ -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,8 +44,6 @@ 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; @@ -63,11 +62,40 @@ 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 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(false)); } @Override @@ -102,33 +130,17 @@ 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(mAltosDroid.map_type); + 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"); + + mRocketMarker = rocket_marker(1800,0,0); mPadMarker = mMap.addMarker( new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.pad)) @@ -156,7 +168,7 @@ public class TabMap extends AltosDroidTab { public String tab_name() { return "map"; } - public void show(AltosState state, AltosGreatCircle from_receiver, Location receiver) { + 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); @@ -166,6 +178,8 @@ public class TabMap extends AltosDroidTab { if (mapLoaded) { if (state.gps != null) { mRocketMarker.setPosition(new LatLng(state.gps.lat, state.gps.lon)); + mRocketMarker.setTitle("hello world"); + mRocketMarker.setSnippet("hello"); mRocketMarker.setVisible(true); mPolyline.setPoints(Arrays.asList(new LatLng(state.pad_lat, state.pad_lon), new LatLng(state.gps.lat, state.gps.lon))); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabMapOffline.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabMapOffline.java index 56e296d9..4b728c23 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabMapOffline.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabMapOffline.java @@ -54,8 +54,6 @@ class Rocket { public class TabMapOffline extends AltosDroidTab implements AltosMapInterface { - AltosDroid mAltosDroid; - AltosMap map; AltosLatLon here; @@ -325,11 +323,9 @@ public class TabMapOffline extends AltosDroidTab implements AltosMapInterface { @Override public void onAttach(Activity activity) { super.onAttach(activity); - mAltosDroid = (AltosDroid) activity; - mAltosDroid.registerTab(this); map = new AltosMap(this); - map.set_maptype(mAltosDroid.map_type); + map.set_maptype(altos_droid.map_type); pad_bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pad); /* arrow at the bottom of the launchpad image */ @@ -347,12 +343,6 @@ public class TabMapOffline extends AltosDroidTab implements AltosMapInterface { here_off_y = here_bitmap.getHeight() / 2; } - @Override - public void onDetach() { - super.onDetach(); - mAltosDroid = null; - } - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -382,7 +372,6 @@ public class TabMapOffline extends AltosDroidTab implements AltosMapInterface { public void onDestroyView() { super.onDestroyView(); - mAltosDroid.unregisterTab(this); } private void center(double lat, double lon, double accuracy) { @@ -395,7 +384,7 @@ public class TabMapOffline extends AltosDroidTab implements AltosMapInterface { public String tab_name() { return "offmap"; } - public void show(AltosState state, AltosGreatCircle from_receiver, Location receiver) { + 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); @@ -411,20 +400,30 @@ public class TabMapOffline extends AltosDroidTab implements AltosMapInterface { } if (state.pad_lat != AltosLib.MISSING && pad == null) pad = new AltosLatLon(state.pad_lat, state.pad_lon); + } - int serial = state.serial; - if (serial == AltosLib.MISSING) - serial = 0; + if (telem_state != null) { + Integer[] old_serial = rockets.keySet().toArray(new Integer[0]); + Integer[] new_serial = telem_state.states.keySet().toArray(new Integer[0]); - Rocket rocket = null; + /* remove deleted keys */ + for (int serial : old_serial) { + if (!telem_state.states.containsKey(serial)) + rockets.remove(serial); + } + + /* set remaining keys */ - if (state.gps != null && state.gps.locked) { - if (!rockets.containsKey(serial)) { + for (int serial : new_serial) { + Rocket rocket; + AltosState t_state = telem_state.states.get(serial); + if (rockets.containsKey(serial)) + rocket = rockets.get(serial); + else { rocket = new Rocket(String.format("%d", serial), this); rockets.put(serial, rocket); - } else - rocket = rockets.get(serial); - rocket.set_position(new AltosLatLon(state.gps.lat, state.gps.lon)); + } + rocket.set_position(new AltosLatLon(t_state.gps.lat, t_state.gps.lon)); } } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java index f7eb43db..7a256963 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java @@ -30,8 +30,6 @@ import android.widget.TextView; import android.location.Location; public class TabPad extends AltosDroidTab { - AltosDroid mAltosDroid; - private TextView mBatteryVoltageView; private TextView mBatteryVoltageLabel; private GoNoGoLights mBatteryLights; @@ -51,13 +49,6 @@ public class TabPad extends AltosDroidTab { private TextView mPadLongitudeView; private TextView mPadAltitudeView; - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - mAltosDroid = (AltosDroid) activity; - mAltosDroid.registerTab(this); - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.tab_pad, container, false); @@ -100,16 +91,9 @@ public class TabPad extends AltosDroidTab { return v; } - @Override - public void onDestroy() { - super.onDestroy(); - mAltosDroid.unregisterTab(this); - mAltosDroid = null; - } - public String tab_name() { return "pad"; } - public void show(AltosState state, AltosGreatCircle from_receiver, Location receiver) { + public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) { if (state != null) { mBatteryVoltageView.setText(AltosDroid.number("%4.2f V", state.battery_voltage)); mBatteryLights.set(state.battery_voltage >= AltosLib.ao_battery_good, state.battery_voltage == AltosLib.MISSING); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java index 7c3c2268..28bab401 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java @@ -34,7 +34,7 @@ public class TelemetryLogger { logger = null; } } - + void handleExternalStorageState() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java index 7b29fe44..4d4f0ed1 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java @@ -21,6 +21,7 @@ package org.altusmetrum.AltosDroid; import java.text.*; import java.io.*; +import java.util.*; import java.util.concurrent.*; import android.os.Handler; @@ -34,25 +35,18 @@ public class TelemetryReader extends Thread { Handler handler; AltosLink link; - AltosState state = null; LinkedBlockingQueue telemQueue; - public AltosState read() throws ParseException, AltosCRCException, InterruptedException, IOException { + public AltosTelemetry read() throws ParseException, AltosCRCException, InterruptedException, IOException { AltosLine l = telemQueue.take(); if (l.line == null) throw new IOException("IO error"); AltosTelemetry telem = AltosTelemetryLegacy.parse(l.line); - if (state == null) - state = new AltosState(); - else - state = state.clone(); - telem.update_state(state); - return state; + return telem; } public void close() { - state = null; link.remove_monitor(telemQueue); link = null; telemQueue.clear(); @@ -60,14 +54,12 @@ public class TelemetryReader extends Thread { } public void run() { - AltosState state = null; - try { AltosDebug.debug("starting loop"); while (telemQueue != null) { try { - state = read(); - handler.obtainMessage(TelemetryService.MSG_TELEMETRY, state).sendToTarget(); + AltosTelemetry telem = read(); + handler.obtainMessage(TelemetryService.MSG_TELEMETRY, telem).sendToTarget(); } catch (ParseException pp) { AltosDebug.error("Parse error: %d \"%s\"", pp.getErrorOffset(), pp.getMessage()); } catch (AltosCRCException ce) { @@ -84,12 +76,11 @@ public class TelemetryReader extends Thread { } } - public TelemetryReader (AltosLink in_link, Handler in_handler, AltosState in_state) { + public TelemetryReader (AltosLink in_link, Handler in_handler) { AltosDebug.debug("connected TelemetryReader create started"); link = in_link; handler = in_handler; - state = in_state; telemQueue = new LinkedBlockingQueue(); link.add_monitor(telemQueue); link.set_telemetry(AltosLib.ao_telemetry_standard); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java index eae360db..80694ea7 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java @@ -18,10 +18,8 @@ package org.altusmetrum.AltosDroid; import java.lang.ref.WeakReference; -import java.util.ArrayList; import java.util.concurrent.TimeoutException; -import java.util.Timer; -import java.util.TimerTask; +import java.util.*; import android.app.Notification; //import android.app.NotificationManager; @@ -62,6 +60,7 @@ public class TelemetryService extends Service implements LocationListener { static final int MSG_CRC_ERROR = 10; static final int MSG_SETBAUD = 11; static final int MSG_DISCONNECT = 12; + static final int MSG_DELETE_SERIAL = 13; // Unique Identification Number for the Notification. // We use it on Notification start, and to cancel it. @@ -120,6 +119,10 @@ public class TelemetryService extends Service implements LocationListener { s.address = null; s.disconnect(true); break; + case MSG_DELETE_SERIAL: + AltosDebug.debug("Delete Serial command received"); + s.delete_serial((Integer) msg.obj); + break; case MSG_SETFREQUENCY: AltosDebug.debug("MSG_SETFREQUENCY"); s.telemetry_state.frequency = (Double) msg.obj; @@ -197,13 +200,8 @@ public class TelemetryService extends Service implements LocationListener { * Messages from TelemetryReader */ case MSG_TELEMETRY: - s.telemetry_state.state = (AltosState) msg.obj; - if (s.telemetry_state.state != null) { - AltosDebug.debug("Save state"); - AltosPreferences.set_state(0, s.telemetry_state.state, null); - } AltosDebug.debug("MSG_TELEMETRY"); - s.send_to_clients(); + s.telemetry((AltosTelemetry) msg.obj); break; case MSG_CRC_ERROR: // forward crc error messages @@ -217,13 +215,31 @@ public class TelemetryService extends Service implements LocationListener { } } + /* Handle telemetry packet + */ + private void telemetry(AltosTelemetry telem) { + AltosState state; + + if (telemetry_state.states.containsKey(telem.serial)) + state = telemetry_state.states.get(telem.serial).clone(); + else + state = new AltosState(); + telem.update_state(state); + telemetry_state.states.put(telem.serial, state); + if (state != null) { + AltosDebug.debug("Save state %d", telem.serial); + AltosPreferences.set_state(telem.serial, state, null); + } + send_to_clients(); + } + /* Construct the message to deliver to clients */ private Message message() { if (telemetry_state == null) AltosDebug.debug("telemetry_state null!"); - if (telemetry_state.state == null) - AltosDebug.debug("telemetry_state.state null!"); + if (telemetry_state.states == null) + AltosDebug.debug("telemetry_state.states null!"); return Message.obtain(null, AltosDroid.MSG_STATE, telemetry_state); } @@ -332,6 +348,12 @@ public class TelemetryService extends Service implements LocationListener { } } + private void delete_serial(int serial) { + telemetry_state.states.remove((Integer) serial); + AltosPreferences.remove_state(serial); + send_to_clients(); + } + private void start_altos_bluetooth(DeviceAddress address, boolean pause) { // Get the BLuetoothDevice object BluetoothDevice device = bluetooth_adapter.getRemoteDevice(address.address); @@ -372,7 +394,7 @@ public class TelemetryService extends Service implements LocationListener { telemetry_state.connect = TelemetryState.CONNECT_CONNECTED; telemetry_state.address = address; - telemetry_reader = new TelemetryReader(altos_link, handler, telemetry_state.state); + telemetry_reader = new TelemetryReader(altos_link, handler); telemetry_reader.start(); AltosDebug.debug("connected TelemetryReader started"); @@ -406,11 +428,32 @@ public class TelemetryService extends Service implements LocationListener { telemetry_state.connect = TelemetryState.CONNECT_DISCONNECTED; telemetry_state.address = null; - AltosSavedState saved_state = AltosPreferences.state(0); + /* Pull the saved state information out of the preferences database + */ + ArrayList serials = AltosPreferences.list_states(); - if (saved_state != null) { - AltosDebug.debug("recovered old state flight %d\n", saved_state.state.flight); - telemetry_state.state = saved_state.state; + telemetry_state.latest_serial = AltosPreferences.latest_state(); + + for (int serial : serials) { + AltosSavedState saved_state = AltosPreferences.state(serial); + if (saved_state != null) { + if (serial == 0) { + serial = saved_state.state.serial; + AltosPreferences.set_state(serial, saved_state.state, saved_state.listener_state); + AltosPreferences.remove_state(0); + } + if (telemetry_state.latest_serial == 0) + telemetry_state.latest_serial = serial; + + AltosDebug.debug("recovered old state serial %d flight %d\n", + serial, + saved_state.state.flight); + if (saved_state.state.gps != null) + AltosDebug.debug("\tposition %f,%f\n", + saved_state.state.gps.lat, + saved_state.state.gps.lon); + telemetry_state.states.put(serial, saved_state.state); + } } // Listen for GPS and Network position updates diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java index fb7e1893..d023128f 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java @@ -17,6 +17,7 @@ package org.altusmetrum.AltosDroid; +import java.util.*; import org.altusmetrum.altoslib_7.*; import android.location.Location; @@ -29,16 +30,19 @@ public class TelemetryState { int connect; DeviceAddress address; AltosConfigData config; - AltosState state; Location location; int crc_errors; double frequency; int telemetry_rate; + HashMap states; + + int latest_serial; + public TelemetryState() { connect = CONNECT_NONE; config = null; - state = null; + states = new HashMap(); location = null; crc_errors = 0; frequency = AltosPreferences.frequency(0); -- cgit v1.2.3 From 9af72a2e629779833ff1787bbfc2ddc8b9d88bba Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 21 Jun 2015 09:37:05 -0700 Subject: altosdroid: Show receiver battery voltage in the 'pad' view Helpful to determine when the receiver battery is getting low Signed-off-by: Keith Packard --- altosdroid/Notebook | 6 +- altosdroid/res/layout/tab_pad.xml | 39 +++++- altosdroid/res/values/strings.xml | 1 + .../src/org/altusmetrum/AltosDroid/TabPad.java | 154 ++++++++++++--------- .../altusmetrum/AltosDroid/TelemetryService.java | 34 ++++- .../org/altusmetrum/AltosDroid/TelemetryState.java | 2 + 6 files changed, 168 insertions(+), 68 deletions(-) (limited to 'altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java') diff --git a/altosdroid/Notebook b/altosdroid/Notebook index 38a4bc01..c0ba2098 100644 --- a/altosdroid/Notebook +++ b/altosdroid/Notebook @@ -15,8 +15,6 @@ Desired AltosDroid feature list *) Monitor-idle mode - *) TeleBT battery voltage - *) Select tracker by clicking map *) Auto select tracker after long delay @@ -94,3 +92,7 @@ Completed features *) Provide units for age field, turn red if old Done + + *) TeleBT battery voltage + + Done diff --git a/altosdroid/res/layout/tab_pad.xml b/altosdroid/res/layout/tab_pad.xml index 38e61f83..380eab91 100644 --- a/altosdroid/res/layout/tab_pad.xml +++ b/altosdroid/res/layout/tab_pad.xml @@ -58,6 +58,43 @@ android:textAppearance="?android:attr/textAppearanceSmall" /> + + + + + + + + + + + - \ No newline at end of file + diff --git a/altosdroid/res/values/strings.xml b/altosdroid/res/values/strings.xml index 79a77ba9..0c012819 100644 --- a/altosdroid/res/values/strings.xml +++ b/altosdroid/res/values/strings.xml @@ -76,6 +76,7 @@ Max Speed Max Accel Battery Voltage + Receiver Battery Apogee Igniter Voltage Main Igniter Voltage On-board Data Logging diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java index 7a256963..92bb9013 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java @@ -30,64 +30,78 @@ import android.widget.TextView; import android.location.Location; public class TabPad extends AltosDroidTab { - private TextView mBatteryVoltageView; - private TextView mBatteryVoltageLabel; - private GoNoGoLights mBatteryLights; - private TextView mApogeeVoltageView; - private TextView mApogeeVoltageLabel; - private GoNoGoLights mApogeeLights; - private TextView mMainVoltageView; - private TextView mMainVoltageLabel; - private GoNoGoLights mMainLights; - private TextView mDataLoggingView; - private GoNoGoLights mDataLoggingLights; - private TextView mGPSLockedView; - private GoNoGoLights mGPSLockedLights; - private TextView mGPSReadyView; - private GoNoGoLights mGPSReadyLights; - private TextView mPadLatitudeView; - private TextView mPadLongitudeView; - private TextView mPadAltitudeView; + private TextView battery_voltage_view; + private GoNoGoLights battery_lights; + + private TextView receiver_voltage_view; + private TextView receiver_voltage_label; + private GoNoGoLights receiver_voltage_lights; + + private TextView apogee_voltage_view; + private TextView apogee_voltage_label; + private GoNoGoLights apogee_lights; + + private TextView main_voltage_view; + private TextView main_voltage_label; + private GoNoGoLights main_lights; + + private TextView data_logging_view; + private GoNoGoLights data_logging_lights; + + private TextView gps_locked_view; + private GoNoGoLights gps_locked_lights; + + private TextView gps_ready_view; + private GoNoGoLights gps_ready_lights; + + private TextView pad_latitude_view; + private TextView pad_longitude_view; + private TextView pad_altitude_view; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.tab_pad, container, false); - mBatteryVoltageView = (TextView) v.findViewById(R.id.battery_voltage_value); - mBatteryVoltageLabel = (TextView) v.findViewById(R.id.battery_voltage_label); - mBatteryLights = new GoNoGoLights((ImageView) v.findViewById(R.id.battery_redled), + battery_voltage_view = (TextView) v.findViewById(R.id.battery_voltage_value); + battery_lights = new GoNoGoLights((ImageView) v.findViewById(R.id.battery_redled), (ImageView) v.findViewById(R.id.battery_greenled), getResources()); - mApogeeVoltageView = (TextView) v.findViewById(R.id.apogee_voltage_value); - mApogeeVoltageLabel = (TextView) v.findViewById(R.id.apogee_voltage_label); - mApogeeLights = new GoNoGoLights((ImageView) v.findViewById(R.id.apogee_redled), + receiver_voltage_view = (TextView) v.findViewById(R.id.receiver_voltage_value); + receiver_voltage_label = (TextView) v.findViewById(R.id.receiver_voltage_label); + receiver_voltage_lights = new GoNoGoLights((ImageView) v.findViewById(R.id.receiver_redled), + (ImageView) v.findViewById(R.id.receiver_greenled), + getResources()); + + apogee_voltage_view = (TextView) v.findViewById(R.id.apogee_voltage_value); + apogee_voltage_label = (TextView) v.findViewById(R.id.apogee_voltage_label); + apogee_lights = new GoNoGoLights((ImageView) v.findViewById(R.id.apogee_redled), (ImageView) v.findViewById(R.id.apogee_greenled), getResources()); - mMainVoltageView = (TextView) v.findViewById(R.id.main_voltage_value); - mMainVoltageLabel = (TextView) v.findViewById(R.id.main_voltage_label); - mMainLights = new GoNoGoLights((ImageView) v.findViewById(R.id.main_redled), + main_voltage_view = (TextView) v.findViewById(R.id.main_voltage_value); + main_voltage_label = (TextView) v.findViewById(R.id.main_voltage_label); + main_lights = new GoNoGoLights((ImageView) v.findViewById(R.id.main_redled), (ImageView) v.findViewById(R.id.main_greenled), getResources()); - mDataLoggingView = (TextView) v.findViewById(R.id.logging_value); - mDataLoggingLights = new GoNoGoLights((ImageView) v.findViewById(R.id.logging_redled), + data_logging_view = (TextView) v.findViewById(R.id.logging_value); + data_logging_lights = new GoNoGoLights((ImageView) v.findViewById(R.id.logging_redled), (ImageView) v.findViewById(R.id.logging_greenled), getResources()); - mGPSLockedView = (TextView) v.findViewById(R.id.gps_locked_value); - mGPSLockedLights = new GoNoGoLights((ImageView) v.findViewById(R.id.gps_locked_redled), + gps_locked_view = (TextView) v.findViewById(R.id.gps_locked_value); + gps_locked_lights = new GoNoGoLights((ImageView) v.findViewById(R.id.gps_locked_redled), (ImageView) v.findViewById(R.id.gps_locked_greenled), getResources()); - mGPSReadyView = (TextView) v.findViewById(R.id.gps_ready_value); - mGPSReadyLights = new GoNoGoLights((ImageView) v.findViewById(R.id.gps_ready_redled), + gps_ready_view = (TextView) v.findViewById(R.id.gps_ready_value); + gps_ready_lights = new GoNoGoLights((ImageView) v.findViewById(R.id.gps_ready_redled), (ImageView) v.findViewById(R.id.gps_ready_greenled), getResources()); - mPadLatitudeView = (TextView) v.findViewById(R.id.pad_lat_value); - mPadLongitudeView = (TextView) v.findViewById(R.id.pad_lon_value); - mPadAltitudeView = (TextView) v.findViewById(R.id.pad_alt_value); + pad_latitude_view = (TextView) v.findViewById(R.id.pad_lat_value); + pad_longitude_view = (TextView) v.findViewById(R.id.pad_lon_value); + pad_altitude_view = (TextView) v.findViewById(R.id.pad_alt_value); return v; } @@ -95,60 +109,72 @@ public class TabPad extends AltosDroidTab { public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) { if (state != null) { - mBatteryVoltageView.setText(AltosDroid.number("%4.2f V", state.battery_voltage)); - mBatteryLights.set(state.battery_voltage >= AltosLib.ao_battery_good, state.battery_voltage == AltosLib.MISSING); + battery_voltage_view.setText(AltosDroid.number("%4.2f V", state.battery_voltage)); + battery_lights.set(state.battery_voltage >= AltosLib.ao_battery_good, state.battery_voltage == AltosLib.MISSING); if (state.apogee_voltage == AltosLib.MISSING) { - mApogeeVoltageView.setVisibility(View.GONE); - mApogeeVoltageLabel.setVisibility(View.GONE); + apogee_voltage_view.setVisibility(View.GONE); + apogee_voltage_label.setVisibility(View.GONE); } else { - mApogeeVoltageView.setText(AltosDroid.number("%4.2f V", state.apogee_voltage)); - mApogeeVoltageView.setVisibility(View.VISIBLE); - mApogeeVoltageLabel.setVisibility(View.VISIBLE); + apogee_voltage_view.setText(AltosDroid.number("%4.2f V", state.apogee_voltage)); + apogee_voltage_view.setVisibility(View.VISIBLE); + apogee_voltage_label.setVisibility(View.VISIBLE); } - mApogeeLights.set(state.apogee_voltage >= AltosLib.ao_igniter_good, state.apogee_voltage == AltosLib.MISSING); + apogee_lights.set(state.apogee_voltage >= AltosLib.ao_igniter_good, state.apogee_voltage == AltosLib.MISSING); if (state.main_voltage == AltosLib.MISSING) { - mMainVoltageView.setVisibility(View.GONE); - mMainVoltageLabel.setVisibility(View.GONE); + main_voltage_view.setVisibility(View.GONE); + main_voltage_label.setVisibility(View.GONE); } else { - mMainVoltageView.setText(AltosDroid.number("%4.2f V", state.main_voltage)); - mMainVoltageView.setVisibility(View.VISIBLE); - mMainVoltageLabel.setVisibility(View.VISIBLE); + main_voltage_view.setText(AltosDroid.number("%4.2f V", state.main_voltage)); + main_voltage_view.setVisibility(View.VISIBLE); + main_voltage_label.setVisibility(View.VISIBLE); } - mMainLights.set(state.main_voltage >= AltosLib.ao_igniter_good, state.main_voltage == AltosLib.MISSING); + main_lights.set(state.main_voltage >= AltosLib.ao_igniter_good, state.main_voltage == AltosLib.MISSING); if (state.flight != 0) { if (state.state <= AltosLib.ao_flight_pad) - mDataLoggingView.setText("Ready to record"); + data_logging_view.setText("Ready to record"); else if (state.state < AltosLib.ao_flight_landed) - mDataLoggingView.setText("Recording data"); + data_logging_view.setText("Recording data"); else - mDataLoggingView.setText("Recorded data"); + data_logging_view.setText("Recorded data"); } else { - mDataLoggingView.setText("Storage full"); + data_logging_view.setText("Storage full"); } - mDataLoggingLights.set(state.flight != 0, state.flight == AltosLib.MISSING); + data_logging_lights.set(state.flight != 0, state.flight == AltosLib.MISSING); if (state.gps != null) { int soln = state.gps.nsat; int nsat = state.gps.cc_gps_sat != null ? state.gps.cc_gps_sat.length : 0; - mGPSLockedView.setText(String.format("%4d in soln, %4d in view", soln, nsat)); - mGPSLockedLights.set(state.gps.locked && state.gps.nsat >= 4, false); + gps_locked_view.setText(String.format("%4d in soln, %4d in view", soln, nsat)); + gps_locked_lights.set(state.gps.locked && state.gps.nsat >= 4, false); if (state.gps_ready) - mGPSReadyView.setText("Ready"); + gps_ready_view.setText("Ready"); else - mGPSReadyView.setText(AltosDroid.integer("Waiting %d", state.gps_waiting)); + gps_ready_view.setText(AltosDroid.integer("Waiting %d", state.gps_waiting)); } else - mGPSLockedLights.set(false, true); - mGPSReadyLights.set(state.gps_ready, state.gps == null); + gps_locked_lights.set(false, true); + gps_ready_lights.set(state.gps_ready, state.gps == null); + } + + if (telem_state != null) { + if (telem_state.receiver_battery == AltosLib.MISSING) { + receiver_voltage_view.setVisibility(View.GONE); + receiver_voltage_label.setVisibility(View.GONE); + } else { + receiver_voltage_view.setText(AltosDroid.number("%4.2f V", telem_state.receiver_battery)); + receiver_voltage_view.setVisibility(View.VISIBLE); + receiver_voltage_label.setVisibility(View.VISIBLE); + } + receiver_voltage_lights.set(telem_state.receiver_battery >= AltosLib.ao_battery_good, telem_state.receiver_battery == AltosLib.MISSING); } if (receiver != null) { double altitude = AltosLib.MISSING; if (receiver.hasAltitude()) altitude = receiver.getAltitude(); - mPadLatitudeView.setText(AltosDroid.pos(receiver.getLatitude(), "N", "S")); - mPadLongitudeView.setText(AltosDroid.pos(receiver.getLongitude(), "E", "W")); - set_value(mPadAltitudeView, AltosConvert.height, 6, altitude); + pad_latitude_view.setText(AltosDroid.pos(receiver.getLatitude(), "N", "S")); + pad_longitude_view.setText(AltosDroid.pos(receiver.getLongitude(), "E", "W")); + set_value(pad_altitude_view, AltosConvert.height, 6, altitude); } } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java index 80694ea7..52363430 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java @@ -45,7 +45,6 @@ import android.location.Criteria; import org.altusmetrum.altoslib_7.*; - public class TelemetryService extends Service implements LocationListener { static final int MSG_REGISTER_CLIENT = 1; @@ -305,6 +304,8 @@ public class TelemetryService extends Service implements LocationListener { if (altos_link != null) altos_link.closing(); + stop_receiver_voltage_timer(); + if (telemetry_reader != null) { AltosDebug.debug("disconnect(): stopping TelemetryReader"); telemetry_reader.interrupt(); @@ -367,6 +368,35 @@ public class TelemetryService extends Service implements LocationListener { send_to_clients(); } + // Timer for receiver battery voltage monitoring + Timer receiver_voltage_timer; + + private void update_receiver_voltage() { + if (altos_link != null) { + try { + double voltage = altos_link.monitor_battery(); + AltosDebug.debug("update receiver voltage %g\n", voltage); + telemetry_state.receiver_battery = voltage; + } catch (InterruptedException ie) { + } + } + } + + private void stop_receiver_voltage_timer() { + if (receiver_voltage_timer != null) { + receiver_voltage_timer.cancel(); + receiver_voltage_timer.purge(); + receiver_voltage_timer = null; + } + } + + private void start_receiver_voltage_timer() { + if (receiver_voltage_timer == null && altos_link.has_monitor_battery()) { + receiver_voltage_timer = new Timer(); + receiver_voltage_timer.scheduleAtFixedRate(new TimerTask() { public void run() {update_receiver_voltage();}}, 1000L, 10000L); + } + } + private void connected() throws InterruptedException { AltosDebug.debug("connected top"); AltosDebug.check_ui("connected\n"); @@ -401,6 +431,8 @@ public class TelemetryService extends Service implements LocationListener { telemetry_logger = new TelemetryLogger(this, altos_link); + start_receiver_voltage_timer(); + AltosDebug.debug("Notify UI of connection"); send_to_clients(); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java index d023128f..c40df648 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java @@ -32,6 +32,7 @@ public class TelemetryState { AltosConfigData config; Location location; int crc_errors; + double receiver_battery; double frequency; int telemetry_rate; @@ -45,6 +46,7 @@ public class TelemetryState { states = new HashMap(); location = null; crc_errors = 0; + receiver_battery = AltosLib.MISSING; frequency = AltosPreferences.frequency(0); telemetry_rate = AltosPreferences.telemetry_rate(0); } -- cgit v1.2.3 From a761b34ed8fc64435f5a49623f4a5c55e2dda33a Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 23 Jun 2015 21:37:25 -0700 Subject: altosdroid: Define strings for the tab names Use these everywhere instead of replicating the same name; might reduce errors. Signed-off-by: Keith Packard --- .../src/org/altusmetrum/AltosDroid/AltosDroid.java | 23 +++++++++++++--------- .../src/org/altusmetrum/AltosDroid/TabFlight.java | 2 +- .../src/org/altusmetrum/AltosDroid/TabMap.java | 2 +- .../src/org/altusmetrum/AltosDroid/TabPad.java | 2 +- .../src/org/altusmetrum/AltosDroid/TabRecover.java | 2 +- 5 files changed, 18 insertions(+), 13 deletions(-) (limited to 'altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java') diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java index f1da27d8..c2a6cb29 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java @@ -87,6 +87,11 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { private int mAgeNewColor; private int mAgeOldColor; + public static final String tab_pad_name = "pad"; + public static final String tab_flight_name = "flight"; + public static final String tab_recover_name = "recover"; + public static final String tab_map_name = "map"; + // field to display the version at the bottom of the screen private TextView mVersion; @@ -399,9 +404,9 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { if (prev_locked != locked) { String currentTab = mTabHost.getCurrentTabTag(); if (locked) { - if (currentTab.equals("pad")) mTabHost.setCurrentTabByTag("flight"); + if (currentTab.equals(tab_pad_name)) mTabHost.setCurrentTabByTag(tab_flight_name); } else { - if (currentTab.equals("flight")) mTabHost.setCurrentTabByTag("pad"); + if (currentTab.equals(tab_flight_name)) mTabHost.setCurrentTabByTag(tab_pad_name); } } } else { @@ -409,13 +414,13 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { String currentTab = mTabHost.getCurrentTabTag(); switch (state.state) { case AltosLib.ao_flight_boost: - if (currentTab.equals("pad")) mTabHost.setCurrentTabByTag("flight"); + if (currentTab.equals(tab_pad_name)) mTabHost.setCurrentTabByTag(tab_flight_name); break; case AltosLib.ao_flight_landed: - if (currentTab.equals("flight")) mTabHost.setCurrentTabByTag("recover"); + if (currentTab.equals(tab_flight_name)) mTabHost.setCurrentTabByTag(tab_recover_name); break; case AltosLib.ao_flight_stateless: - if (currentTab.equals("pad")) mTabHost.setCurrentTabByTag("flight"); + if (currentTab.equals(tab_pad_name)) mTabHost.setCurrentTabByTag(tab_flight_name); break; } } @@ -535,10 +540,10 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager); - mTabsAdapter.addTab(mTabHost.newTabSpec("pad").setIndicator(create_tab_view("Pad")), TabPad.class, null); - mTabsAdapter.addTab(mTabHost.newTabSpec("flight").setIndicator(create_tab_view("Flight")), TabFlight.class, null); - mTabsAdapter.addTab(mTabHost.newTabSpec("recover").setIndicator(create_tab_view("Recover")), TabRecover.class, null); - mTabsAdapter.addTab(mTabHost.newTabSpec("map").setIndicator(create_tab_view("Map")), TabMap.class, null); + mTabsAdapter.addTab(mTabHost.newTabSpec(tab_pad_name).setIndicator(create_tab_view("Pad")), TabPad.class, null); + mTabsAdapter.addTab(mTabHost.newTabSpec(tab_flight_name).setIndicator(create_tab_view("Flight")), TabFlight.class, null); + mTabsAdapter.addTab(mTabHost.newTabSpec(tab_recover_name).setIndicator(create_tab_view("Recover")), TabRecover.class, null); + mTabsAdapter.addTab(mTabHost.newTabSpec(tab_map_name).setIndicator(create_tab_view("Map")), TabMap.class, null); // Display the Version mVersion = (TextView) findViewById(R.id.version); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java index e1fc737d..e0d49a1c 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java @@ -79,7 +79,7 @@ public class TabFlight extends AltosDroidTab { return v; } - public String tab_name() { return "flight"; } + public String tab_name() { return AltosDroid.tab_flight_name; } public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) { if (state != null) { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java index cd59dfe7..0ee202a4 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java @@ -88,7 +88,7 @@ public class TabMap extends AltosDroidTab { super.onDestroyView(); } - public String tab_name() { return "map"; } + public String tab_name() { return AltosDroid.tab_map_name; } private void center(double lat, double lon, double accuracy) { if (map_offline != null) diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java index 92bb9013..cfc55261 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java @@ -105,7 +105,7 @@ public class TabPad extends AltosDroidTab { return v; } - public String tab_name() { return "pad"; } + public String tab_name() { return AltosDroid.tab_pad_name; } public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) { if (state != null) { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java index cb394dbe..523ddb61 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java @@ -58,7 +58,7 @@ public class TabRecover extends AltosDroidTab { return v; } - public String tab_name() { return "recover"; } + public String tab_name() { return AltosDroid.tab_recover_name; } public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) { if (from_receiver != null) { -- cgit v1.2.3 From ed682ca39496849b6c0d6bdf81bee6263864895f Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 11 Jul 2015 19:55:43 -0700 Subject: altosdroid: Add other igniter status, various other layout changes Show the first four igniters (A-D) in the pad tab. Make pad and flight layouts look a bit better Signed-off-by: Keith Packard --- altosdroid/Notebook | 18 +- altosdroid/res/layout/tab_flight.xml | 751 +++++++++---------- altosdroid/res/layout/tab_pad.xml | 803 ++++++++++++--------- altosdroid/res/values/strings.xml | 16 +- .../src/org/altusmetrum/AltosDroid/TabPad.java | 86 ++- 5 files changed, 940 insertions(+), 734 deletions(-) (limited to 'altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java') diff --git a/altosdroid/Notebook b/altosdroid/Notebook index 22271e7c..73b5ed27 100644 --- a/altosdroid/Notebook +++ b/altosdroid/Notebook @@ -15,7 +15,9 @@ Desired AltosDroid feature list *) Monitor-idle mode - *) Monitor TeleMega igniters + *) Online maps comes up tracking object at 0,0 + + *) Have names for each serial number, default to callsign Completed features @@ -90,3 +92,17 @@ Completed features *) Make voice responses depend on selected tab Done. + + *) Monitor TeleMega igniters + + Done. Visible only in Pad tab + + *) Make it harder to switch trackers in map view. Too easy to touch + the screen and switch on accident. + + Done. A menu pops up with trackers within a small radius of + the touch point, letting you cancel if that wasn't your intent. + + *) Make sure it keeps talking with the screen blanked + + Done. Don't shut down voice when stopping UI. diff --git a/altosdroid/res/layout/tab_flight.xml b/altosdroid/res/layout/tab_flight.xml index 4fa026ca..27c903d0 100644 --- a/altosdroid/res/layout/tab_flight.xml +++ b/altosdroid/res/layout/tab_flight.xml @@ -15,377 +15,386 @@ with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. --> - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_weight="1" > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/altosdroid/res/layout/tab_pad.xml b/altosdroid/res/layout/tab_pad.xml index 380eab91..f7a69f21 100644 --- a/altosdroid/res/layout/tab_pad.xml +++ b/altosdroid/res/layout/tab_pad.xml @@ -15,343 +15,466 @@ with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/altosdroid/res/values/strings.xml b/altosdroid/res/values/strings.xml index 36b07bc2..e7014fc9 100644 --- a/altosdroid/res/values/strings.xml +++ b/altosdroid/res/values/strings.xml @@ -77,11 +77,15 @@ Max Height Max Speed Max Accel - Battery Voltage + Battery Receiver Battery - Apogee Igniter Voltage - Main Igniter Voltage - On-board Data Logging + Apogee Igniter + Main Igniter + Igniter A + Igniter B + Igniter C + Igniter D + Data Logging GPS Locked GPS Ready Latitude @@ -90,9 +94,7 @@ Tar Lon My Lat My Lon - Pad Lat - Pad Lon - Pad Alt + My Alt Known Launch Sites diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java index cfc55261..f6204547 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java @@ -54,9 +54,14 @@ public class TabPad extends AltosDroidTab { private TextView gps_ready_view; private GoNoGoLights gps_ready_lights; - private TextView pad_latitude_view; - private TextView pad_longitude_view; - private TextView pad_altitude_view; + private TextView receiver_latitude_view; + private TextView receiver_longitude_view; + private TextView receiver_altitude_view; + + private TextView[] ignite_voltage_view = new TextView[4]; + private TextView[] ignite_voltage_label = new TextView[4]; + private GoNoGoLights[] ignite_lights = new GoNoGoLights[4]; + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -99,9 +104,46 @@ public class TabPad extends AltosDroidTab { (ImageView) v.findViewById(R.id.gps_ready_greenled), getResources()); - pad_latitude_view = (TextView) v.findViewById(R.id.pad_lat_value); - pad_longitude_view = (TextView) v.findViewById(R.id.pad_lon_value); - pad_altitude_view = (TextView) v.findViewById(R.id.pad_alt_value); + for (int i = 0; i < 4; i++) { + int view_id, label_id, lights_id; + int red_id, green_id; + switch (i) { + case 0: + default: + view_id = R.id.ignite_a_voltage_value; + label_id = R.id.ignite_a_voltage_label; + red_id = R.id.ignite_a_redled; + green_id = R.id.ignite_a_greenled; + break; + case 1: + view_id = R.id.ignite_b_voltage_value; + label_id = R.id.ignite_b_voltage_label; + red_id = R.id.ignite_b_redled; + green_id = R.id.ignite_b_greenled; + break; + case 2: + view_id = R.id.ignite_c_voltage_value; + label_id = R.id.ignite_c_voltage_label; + red_id = R.id.ignite_c_redled; + green_id = R.id.ignite_c_greenled; + break; + case 3: + view_id = R.id.ignite_d_voltage_value; + label_id = R.id.ignite_d_voltage_label; + red_id = R.id.ignite_d_redled; + green_id = R.id.ignite_d_greenled; + break; + } + ignite_voltage_view[i] = (TextView) v.findViewById(view_id); + ignite_voltage_label[i] = (TextView) v.findViewById(label_id); + ignite_lights[i] = new GoNoGoLights((ImageView) v.findViewById(red_id), + (ImageView) v.findViewById(green_id), + getResources()); + } + + receiver_latitude_view = (TextView) v.findViewById(R.id.receiver_lat_value); + receiver_longitude_view = (TextView) v.findViewById(R.id.receiver_lon_value); + receiver_altitude_view = (TextView) v.findViewById(R.id.receiver_alt_value); return v; } @@ -109,13 +151,13 @@ public class TabPad extends AltosDroidTab { public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) { if (state != null) { - battery_voltage_view.setText(AltosDroid.number("%4.2f V", state.battery_voltage)); + battery_voltage_view.setText(AltosDroid.number(" %4.2f V", state.battery_voltage)); battery_lights.set(state.battery_voltage >= AltosLib.ao_battery_good, state.battery_voltage == AltosLib.MISSING); if (state.apogee_voltage == AltosLib.MISSING) { apogee_voltage_view.setVisibility(View.GONE); apogee_voltage_label.setVisibility(View.GONE); } else { - apogee_voltage_view.setText(AltosDroid.number("%4.2f V", state.apogee_voltage)); + apogee_voltage_view.setText(AltosDroid.number(" %4.2f V", state.apogee_voltage)); apogee_voltage_view.setVisibility(View.VISIBLE); apogee_voltage_label.setVisibility(View.VISIBLE); } @@ -124,12 +166,27 @@ public class TabPad extends AltosDroidTab { main_voltage_view.setVisibility(View.GONE); main_voltage_label.setVisibility(View.GONE); } else { - main_voltage_view.setText(AltosDroid.number("%4.2f V", state.main_voltage)); + main_voltage_view.setText(AltosDroid.number(" %4.2f V", state.main_voltage)); main_voltage_view.setVisibility(View.VISIBLE); main_voltage_label.setVisibility(View.VISIBLE); } main_lights.set(state.main_voltage >= AltosLib.ao_igniter_good, state.main_voltage == AltosLib.MISSING); + int num_igniter = state.ignitor_voltage == null ? 0 : state.ignitor_voltage.length; + + for (int i = 0; i < 4; i++) { + double voltage = i >= num_igniter ? AltosLib.MISSING : state.ignitor_voltage[i]; + if (voltage == AltosLib.MISSING) { + ignite_voltage_view[i].setVisibility(View.GONE); + ignite_voltage_label[i].setVisibility(View.GONE); + } else { + ignite_voltage_view[i].setText(AltosDroid.number(" %4.2f V", voltage)); + ignite_voltage_view[i].setVisibility(View.VISIBLE); + ignite_voltage_label[i].setVisibility(View.VISIBLE); + } + ignite_lights[i].set(voltage >= AltosLib.ao_igniter_good, voltage == AltosLib.MISSING); + } + if (state.flight != 0) { if (state.state <= AltosLib.ao_flight_pad) data_logging_view.setText("Ready to record"); @@ -145,7 +202,7 @@ public class TabPad extends AltosDroidTab { if (state.gps != null) { int soln = state.gps.nsat; int nsat = state.gps.cc_gps_sat != null ? state.gps.cc_gps_sat.length : 0; - gps_locked_view.setText(String.format("%4d in soln, %4d in view", soln, nsat)); + gps_locked_view.setText(String.format("%d in soln, %d in view", soln, nsat)); gps_locked_lights.set(state.gps.locked && state.gps.nsat >= 4, false); if (state.gps_ready) gps_ready_view.setText("Ready"); @@ -161,7 +218,7 @@ public class TabPad extends AltosDroidTab { receiver_voltage_view.setVisibility(View.GONE); receiver_voltage_label.setVisibility(View.GONE); } else { - receiver_voltage_view.setText(AltosDroid.number("%4.2f V", telem_state.receiver_battery)); + receiver_voltage_view.setText(AltosDroid.number(" %4.2f V", telem_state.receiver_battery)); receiver_voltage_view.setVisibility(View.VISIBLE); receiver_voltage_label.setVisibility(View.VISIBLE); } @@ -172,10 +229,9 @@ public class TabPad extends AltosDroidTab { double altitude = AltosLib.MISSING; if (receiver.hasAltitude()) altitude = receiver.getAltitude(); - pad_latitude_view.setText(AltosDroid.pos(receiver.getLatitude(), "N", "S")); - pad_longitude_view.setText(AltosDroid.pos(receiver.getLongitude(), "E", "W")); - set_value(pad_altitude_view, AltosConvert.height, 6, altitude); + receiver_latitude_view.setText(AltosDroid.pos(receiver.getLatitude(), "N", "S")); + receiver_longitude_view.setText(AltosDroid.pos(receiver.getLongitude(), "E", "W")); + set_value(receiver_altitude_view, AltosConvert.height, 1, altitude); } } - } -- cgit v1.2.3 From c4af5cb233013b35d6763f5adf8d11b47f847111 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 11 Jul 2015 22:17:16 -0700 Subject: altosdroid: Clean up tab layout Fuss with weights and gravitys, then add some wrapping layouts to get things looking reasonable on small and larger screens. Signed-off-by: Keith Packard --- altosdroid/res/layout/tab_flight.xml | 568 ++++++------- altosdroid/res/layout/tab_map.xml | 12 +- altosdroid/res/layout/tab_pad.xml | 911 +++++++++++---------- altosdroid/res/layout/tab_recover.xml | 446 +++++----- .../org/altusmetrum/AltosDroid/GoNoGoLights.java | 13 - .../src/org/altusmetrum/AltosDroid/TabFlight.java | 27 +- .../src/org/altusmetrum/AltosDroid/TabPad.java | 45 +- 7 files changed, 1021 insertions(+), 1001 deletions(-) (limited to 'altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java') diff --git a/altosdroid/res/layout/tab_flight.xml b/altosdroid/res/layout/tab_flight.xml index 27c903d0..85c171b2 100644 --- a/altosdroid/res/layout/tab_flight.xml +++ b/altosdroid/res/layout/tab_flight.xml @@ -22,379 +22,381 @@ android:orientation="vertical" > + android:orientation="vertical" > - + android:layout_weight="0" + android:baselineAligned="true" + android:orientation="horizontal" > - - - + + + + + + + - - - + + + + + + + + + + android:layout_weight="0" + android:baselineAligned="true" + android:orientation="horizontal" > - - - + + + + + + + - - - + android:layout_weight="1" > + + + + + + + + + - + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + android:layout_weight="0" + android:baselineAligned="true" + android:orientation="horizontal" + android:paddingTop="5dp" > - + android:layout_weight="1" > + + + + + - + android:layout_weight="1" > + + + + android:paddingTop="5dp" > + android:text="@string/latitude_label" /> - - - - + android:paddingTop="5dp" > + android:text="@string/longitude_label" /> + android:paddingTop="5dp" > - + android:contentDescription="@string/apogee_voltage_label" + android:src="@drawable/grayled" /> - - - - - - - - + android:layout_toRightOf="@id/apogee_redled" + android:contentDescription="@string/apogee_voltage_label" + android:paddingRight="5dp" + android:src="@drawable/grayled" /> + android:layout_toRightOf="@id/apogee_greenled" + android:text="@string/apogee_voltage_label" /> + android:paddingTop="5dp" > - + android:contentDescription="@string/main_voltage_label" + android:src="@drawable/grayled" /> - - - - - - - - + android:layout_toRightOf="@id/main_redled" + android:contentDescription="@string/main_voltage_label" + android:paddingRight="5dp" + android:src="@drawable/grayled" /> + android:layout_toRightOf="@id/main_greenled" + android:text="@string/main_voltage_label" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/altosdroid/res/layout/tab_map.xml b/altosdroid/res/layout/tab_map.xml index 2388a20b..952abd49 100644 --- a/altosdroid/res/layout/tab_map.xml +++ b/altosdroid/res/layout/tab_map.xml @@ -26,6 +26,7 @@ android:baselineAligned="true" android:orientation="horizontal" android:layout_weight="1"> + - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + - - - - - + + + + + + + + + + + - - + + + + + + + + + + + - - + + + + + + + + + + + - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + android:layout_gravity="center" + android:layout_weight="1" + android:padding="2dip" + android:layout_width="wrap_content" + android:layout_height="wrap_content" > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/altosdroid/res/layout/tab_recover.xml b/altosdroid/res/layout/tab_recover.xml index c2806629..201f45ed 100644 --- a/altosdroid/res/layout/tab_recover.xml +++ b/altosdroid/res/layout/tab_recover.xml @@ -15,217 +15,237 @@ with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/GoNoGoLights.java b/altosdroid/src/org/altusmetrum/AltosDroid/GoNoGoLights.java index 267c90f8..6cecbdf1 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/GoNoGoLights.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/GoNoGoLights.java @@ -52,27 +52,14 @@ public class GoNoGoLights { missing = m; set = true; if (missing) { - hide(); red.setImageDrawable(dGray); green.setImageDrawable(dGray); } else if (state) { red.setImageDrawable(dGray); green.setImageDrawable(dGreen); - show(); } else { red.setImageDrawable(dRed); green.setImageDrawable(dGray); - show(); } } - - public void show() { - red.setVisibility(View.VISIBLE); - green.setVisibility(View.VISIBLE); - } - - public void hide() { - red.setVisibility(View.GONE); - green.setVisibility(View.GONE); - } } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java index e0d49a1c..a02ae3a2 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java @@ -22,11 +22,8 @@ import org.altusmetrum.altoslib_7.*; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; +import android.view.*; +import android.widget.*; import android.location.Location; public class TabFlight extends AltosDroidTab { @@ -41,9 +38,11 @@ public class TabFlight extends AltosDroidTab { private TextView distance_view; private TextView latitude_view; private TextView longitude_view; + private View apogee_view; private TextView apogee_voltage_view; private TextView apogee_voltage_label; private GoNoGoLights apogee_lights; + private View main_view; private TextView main_voltage_view; private TextView main_voltage_label; private GoNoGoLights main_lights; @@ -64,12 +63,14 @@ public class TabFlight extends AltosDroidTab { latitude_view = (TextView) v.findViewById(R.id.lat_value); longitude_view = (TextView) v.findViewById(R.id.lon_value); + apogee_view = v.findViewById(R.id.apogee_view); apogee_voltage_view = (TextView) v.findViewById(R.id.apogee_voltage_value); apogee_lights = new GoNoGoLights((ImageView) v.findViewById(R.id.apogee_redled), (ImageView) v.findViewById(R.id.apogee_greenled), getResources()); apogee_voltage_label = (TextView) v.findViewById(R.id.apogee_voltage_label); + main_view = v.findViewById(R.id.main_view); main_voltage_view = (TextView) v.findViewById(R.id.main_voltage_value); main_lights = new GoNoGoLights((ImageView) v.findViewById(R.id.main_redled), (ImageView) v.findViewById(R.id.main_greenled), @@ -106,27 +107,19 @@ public class TabFlight extends AltosDroidTab { } if (state.apogee_voltage == AltosLib.MISSING) { - apogee_voltage_view.setVisibility(View.GONE); - apogee_voltage_label.setVisibility(View.GONE); - apogee_lights.hide(); + apogee_view.setVisibility(View.GONE); } else { apogee_voltage_view.setText(AltosDroid.number("%4.2f V", state.apogee_voltage)); - apogee_voltage_view.setVisibility(View.VISIBLE); - apogee_voltage_label.setVisibility(View.VISIBLE); apogee_lights.set(state.apogee_voltage > 3.2, state.apogee_voltage == AltosLib.MISSING); - apogee_lights.show(); + apogee_view.setVisibility(View.VISIBLE); } if (state.main_voltage == AltosLib.MISSING) { - main_voltage_view.setVisibility(View.GONE); - main_voltage_label.setVisibility(View.GONE); - main_lights.hide(); + main_view.setVisibility(View.GONE); } else { main_voltage_view.setText(AltosDroid.number("%4.2f V", state.main_voltage)); - main_voltage_view.setVisibility(View.VISIBLE); - main_voltage_label.setVisibility(View.VISIBLE); main_lights.set(state.main_voltage > 3.2, state.main_voltage == AltosLib.MISSING); - main_lights.show(); + main_view.setVisibility(View.VISIBLE); } } } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java index f6204547..5ff9d12b 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java @@ -22,25 +22,25 @@ import org.altusmetrum.altoslib_7.*; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; +import android.view.*; +import android.widget.*; import android.location.Location; public class TabPad extends AltosDroidTab { private TextView battery_voltage_view; private GoNoGoLights battery_lights; + private TableRow receiver_row; private TextView receiver_voltage_view; private TextView receiver_voltage_label; private GoNoGoLights receiver_voltage_lights; + private TableRow apogee_row; private TextView apogee_voltage_view; private TextView apogee_voltage_label; private GoNoGoLights apogee_lights; + private TableRow main_row; private TextView main_voltage_view; private TextView main_voltage_label; private GoNoGoLights main_lights; @@ -58,6 +58,7 @@ public class TabPad extends AltosDroidTab { private TextView receiver_longitude_view; private TextView receiver_altitude_view; + private TableRow[] ignite_row = new TableRow[4]; private TextView[] ignite_voltage_view = new TextView[4]; private TextView[] ignite_voltage_label = new TextView[4]; private GoNoGoLights[] ignite_lights = new GoNoGoLights[4]; @@ -71,18 +72,21 @@ public class TabPad extends AltosDroidTab { (ImageView) v.findViewById(R.id.battery_greenled), getResources()); + receiver_row = (TableRow) v.findViewById(R.id.receiver_row); receiver_voltage_view = (TextView) v.findViewById(R.id.receiver_voltage_value); receiver_voltage_label = (TextView) v.findViewById(R.id.receiver_voltage_label); receiver_voltage_lights = new GoNoGoLights((ImageView) v.findViewById(R.id.receiver_redled), (ImageView) v.findViewById(R.id.receiver_greenled), getResources()); + apogee_row = (TableRow) v.findViewById(R.id.apogee_row); apogee_voltage_view = (TextView) v.findViewById(R.id.apogee_voltage_value); apogee_voltage_label = (TextView) v.findViewById(R.id.apogee_voltage_label); apogee_lights = new GoNoGoLights((ImageView) v.findViewById(R.id.apogee_redled), (ImageView) v.findViewById(R.id.apogee_greenled), getResources()); + main_row = (TableRow) v.findViewById(R.id.main_row); main_voltage_view = (TextView) v.findViewById(R.id.main_voltage_value); main_voltage_label = (TextView) v.findViewById(R.id.main_voltage_label); main_lights = new GoNoGoLights((ImageView) v.findViewById(R.id.main_redled), @@ -105,35 +109,40 @@ public class TabPad extends AltosDroidTab { getResources()); for (int i = 0; i < 4; i++) { - int view_id, label_id, lights_id; + int row_id, view_id, label_id, lights_id; int red_id, green_id; switch (i) { case 0: default: + row_id = R.id.ignite_a_row; view_id = R.id.ignite_a_voltage_value; label_id = R.id.ignite_a_voltage_label; red_id = R.id.ignite_a_redled; green_id = R.id.ignite_a_greenled; break; case 1: + row_id = R.id.ignite_b_row; view_id = R.id.ignite_b_voltage_value; label_id = R.id.ignite_b_voltage_label; red_id = R.id.ignite_b_redled; green_id = R.id.ignite_b_greenled; break; case 2: + row_id = R.id.ignite_c_row; view_id = R.id.ignite_c_voltage_value; label_id = R.id.ignite_c_voltage_label; red_id = R.id.ignite_c_redled; green_id = R.id.ignite_c_greenled; break; case 3: + row_id = R.id.ignite_d_row; view_id = R.id.ignite_d_voltage_value; label_id = R.id.ignite_d_voltage_label; red_id = R.id.ignite_d_redled; green_id = R.id.ignite_d_greenled; break; } + ignite_row[i] = (TableRow) v.findViewById(row_id); ignite_voltage_view[i] = (TextView) v.findViewById(view_id); ignite_voltage_label[i] = (TextView) v.findViewById(label_id); ignite_lights[i] = new GoNoGoLights((ImageView) v.findViewById(red_id), @@ -154,21 +163,17 @@ public class TabPad extends AltosDroidTab { battery_voltage_view.setText(AltosDroid.number(" %4.2f V", state.battery_voltage)); battery_lights.set(state.battery_voltage >= AltosLib.ao_battery_good, state.battery_voltage == AltosLib.MISSING); if (state.apogee_voltage == AltosLib.MISSING) { - apogee_voltage_view.setVisibility(View.GONE); - apogee_voltage_label.setVisibility(View.GONE); + apogee_row.setVisibility(View.GONE); } else { apogee_voltage_view.setText(AltosDroid.number(" %4.2f V", state.apogee_voltage)); - apogee_voltage_view.setVisibility(View.VISIBLE); - apogee_voltage_label.setVisibility(View.VISIBLE); + apogee_row.setVisibility(View.VISIBLE); } apogee_lights.set(state.apogee_voltage >= AltosLib.ao_igniter_good, state.apogee_voltage == AltosLib.MISSING); if (state.main_voltage == AltosLib.MISSING) { - main_voltage_view.setVisibility(View.GONE); - main_voltage_label.setVisibility(View.GONE); + main_row.setVisibility(View.GONE); } else { main_voltage_view.setText(AltosDroid.number(" %4.2f V", state.main_voltage)); - main_voltage_view.setVisibility(View.VISIBLE); - main_voltage_label.setVisibility(View.VISIBLE); + main_row.setVisibility(View.VISIBLE); } main_lights.set(state.main_voltage >= AltosLib.ao_igniter_good, state.main_voltage == AltosLib.MISSING); @@ -177,12 +182,10 @@ public class TabPad extends AltosDroidTab { for (int i = 0; i < 4; i++) { double voltage = i >= num_igniter ? AltosLib.MISSING : state.ignitor_voltage[i]; if (voltage == AltosLib.MISSING) { - ignite_voltage_view[i].setVisibility(View.GONE); - ignite_voltage_label[i].setVisibility(View.GONE); + ignite_row[i].setVisibility(View.GONE); } else { ignite_voltage_view[i].setText(AltosDroid.number(" %4.2f V", voltage)); - ignite_voltage_view[i].setVisibility(View.VISIBLE); - ignite_voltage_label[i].setVisibility(View.VISIBLE); + ignite_row[i].setVisibility(View.VISIBLE); } ignite_lights[i].set(voltage >= AltosLib.ao_igniter_good, voltage == AltosLib.MISSING); } @@ -215,12 +218,10 @@ public class TabPad extends AltosDroidTab { if (telem_state != null) { if (telem_state.receiver_battery == AltosLib.MISSING) { - receiver_voltage_view.setVisibility(View.GONE); - receiver_voltage_label.setVisibility(View.GONE); + receiver_row.setVisibility(View.GONE); } else { receiver_voltage_view.setText(AltosDroid.number(" %4.2f V", telem_state.receiver_battery)); - receiver_voltage_view.setVisibility(View.VISIBLE); - receiver_voltage_label.setVisibility(View.VISIBLE); + receiver_row.setVisibility(View.VISIBLE); } receiver_voltage_lights.set(telem_state.receiver_battery >= AltosLib.ao_battery_good, telem_state.receiver_battery == AltosLib.MISSING); } -- cgit v1.2.3