altosdroid: Show receiver battery voltage in the 'pad' view
authorKeith Packard <keithp@keithp.com>
Sun, 21 Jun 2015 16:37:05 +0000 (09:37 -0700)
committerKeith Packard <keithp@keithp.com>
Tue, 23 Jun 2015 04:04:43 +0000 (21:04 -0700)
Helpful to determine when the receiver battery is getting low

Signed-off-by: Keith Packard <keithp@keithp.com>
altosdroid/Notebook
altosdroid/res/layout/tab_pad.xml
altosdroid/res/values/strings.xml
altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java
altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java
altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java

index 38a4bc013d0008d9192f00c2cc8ba06943ea8e6c..c0ba209870823dd0c644e8cf2edf224e4343af55 100644 (file)
@@ -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
index 38e61f836c2cb097201782f32d1811c4dc083d4a..380eab9104402bd5ad6d159f3b0d7f0c6cb81ee5 100644 (file)
                        android:textAppearance="?android:attr/textAppearanceSmall" />
        </RelativeLayout>
 
+       <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:textAppearance="?android:attr/textAppearanceSmall" />
        </RelativeLayout>
 
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
index 79a77ba94c085d0201df637b8de1d35d796740d9..0c0128197c632bfb4689b5d4e886fe3c80a5d513 100644 (file)
@@ -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>
index 7a256963c27c460929cee19d2126d7aff6c47cd2..92bb9013375b47ce18cf86a087ead4c2e2e192af 100644 (file)
@@ -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);
                }
        }
 
index 80694ea74357385264f19c5f5cd0968a25d69b8c..5236343012bac77f8eafce2c42a9484811e7697f 100644 (file)
@@ -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();
index d023128f30bed382373bb85128a8a4c07984bea5..c40df64800c2676188fc02c38c63318ba5c9a7d7 100644 (file)
@@ -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);
        }