diff options
| author | Keith Packard <keithp@keithp.com> | 2015-06-21 09:37:05 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2015-06-22 21:04:43 -0700 | 
| commit | 9af72a2e629779833ff1787bbfc2ddc8b9d88bba (patch) | |
| tree | 32c475d55a17dc6c02b29edd1e21d3f352489522 | |
| parent | 4fbe9d5a1f56178a737ede6b31e8d01a02a7543f (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/Notebook | 6 | ||||
| -rw-r--r-- | altosdroid/res/layout/tab_pad.xml | 39 | ||||
| -rw-r--r-- | altosdroid/res/values/strings.xml | 1 | ||||
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java | 154 | ||||
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java | 34 | ||||
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java | 2 | 
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);  	} | 
