summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2015-06-21 09:37:05 -0700
committerKeith Packard <keithp@keithp.com>2015-06-22 21:04:43 -0700
commit9af72a2e629779833ff1787bbfc2ddc8b9d88bba (patch)
tree32c475d55a17dc6c02b29edd1e21d3f352489522
parent4fbe9d5a1f56178a737ede6b31e8d01a02a7543f (diff)
altosdroid: Show receiver battery voltage in the 'pad' view
Helpful to determine when the receiver battery is getting low Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--altosdroid/Notebook6
-rw-r--r--altosdroid/res/layout/tab_pad.xml39
-rw-r--r--altosdroid/res/values/strings.xml1
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java154
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java34
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java2
6 files changed, 168 insertions, 68 deletions
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
@@ -60,6 +60,43 @@
<RelativeLayout
android:layout_width="wrap_content"
+ android:layout_height="wrap_content" >
+
+ <ImageView
+ android:id="@+id/receiver_redled"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="@string/receiver_voltage_label"
+ android:src="@drawable/grayled" />
+
+ <ImageView
+ android:id="@+id/receiver_greenled"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/receiver_redled"
+ android:contentDescription="@string/receiver_voltage_label"
+ android:paddingRight="5dp"
+ android:src="@drawable/grayled" />
+
+ <TextView
+ android:id="@+id/receiver_voltage_label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/receiver_greenled"
+ android:text="@string/receiver_voltage_label" />
+
+ <TextView
+ android:id="@+id/receiver_voltage_value"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/receiver_voltage_label"
+ android:layout_toRightOf="@id/receiver_greenled"
+ android:text=""
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+ </RelativeLayout>
+
+ <RelativeLayout
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="5dp" >
@@ -317,4 +354,4 @@
android:textAppearance="?android:attr/textAppearanceSmall" />
</RelativeLayout>
-</LinearLayout> \ No newline at end of file
+</LinearLayout>
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 @@
<string name="max_speed_label">Max Speed</string>
<string name="max_accel_label">Max Accel</string>
<string name="battery_voltage_label">Battery Voltage</string>
+ <string name="receiver_voltage_label">Receiver Battery</string>
<string name="apogee_voltage_label">Apogee Igniter Voltage</string>
<string name="main_voltage_label">Main Igniter Voltage</string>
<string name="logging_label">On-board Data Logging</string>
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<Integer,AltosState>();
location = null;
crc_errors = 0;
+ receiver_battery = AltosLib.MISSING;
frequency = AltosPreferences.frequency(0);
telemetry_rate = AltosPreferences.telemetry_rate(0);
}