diff options
| author | Keith Packard <keithp@keithp.com> | 2014-08-31 00:08:33 -0500 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2014-08-31 00:08:33 -0500 | 
| commit | bc3fbcb35090be3856284ccf4d908ebf39d02bec (patch) | |
| tree | 7cb5bada48a2bfc1b79cfda3b50d72c5c797fd9e | |
| parent | 0b70ea04e807c69a987d5976ab217f9f65fb1e09 (diff) | |
altosdroid: Add quit. Restart. Show freq in title.
Add a quit button to menu.
When restarting, reconnect to previous device.
When connecting, set the freq/rate to previous values.
Signed-off-by: Keith Packard <keithp@keithp.com>
10 files changed, 188 insertions, 34 deletions
| diff --git a/altosdroid/res/layout/device_list.xml b/altosdroid/res/layout/device_list.xml index 395695f8..93d65517 100644 --- a/altosdroid/res/layout/device_list.xml +++ b/altosdroid/res/layout/device_list.xml @@ -18,39 +18,39 @@      android:layout_width="match_parent"      android:layout_height="match_parent"      > -    <TextView android:id="@+id/title_paired_devices" +    <Button android:id="@+id/button_scan"          android:layout_width="match_parent"          android:layout_height="wrap_content" -        android:text="@string/title_paired_devices" +        android:text="@string/button_scan" +    /> +    <TextView android:id="@+id/title_new_devices" +        android:layout_width="match_parent" +        android:layout_height="wrap_content" +        android:text="@string/title_other_devices"          android:visibility="gone"          android:background="#666"          android:textColor="#fff"          android:paddingLeft="5dp"      /> -    <ListView android:id="@+id/paired_devices" -        android:layout_width="match_parent" -        android:layout_height="wrap_content" -        android:stackFromBottom="true" -        android:layout_weight="1" -    /> -    <TextView android:id="@+id/title_new_devices" +    <TextView android:id="@+id/title_paired_devices"          android:layout_width="match_parent"          android:layout_height="wrap_content" -        android:text="@string/title_other_devices" +        android:text="@string/title_paired_devices"          android:visibility="gone"          android:background="#666"          android:textColor="#fff"          android:paddingLeft="5dp"      /> -    <ListView android:id="@+id/new_devices" +    <ListView android:id="@+id/paired_devices"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:stackFromBottom="true" -        android:layout_weight="2" +        android:layout_weight="1"      /> -    <Button android:id="@+id/button_scan" +    <ListView android:id="@+id/new_devices"          android:layout_width="match_parent"          android:layout_height="wrap_content" -        android:text="@string/button_scan" +        android:stackFromBottom="true" +        android:layout_weight="2"      /> -</LinearLayout>
\ No newline at end of file +</LinearLayout> diff --git a/altosdroid/res/menu/option_menu.xml b/altosdroid/res/menu/option_menu.xml index ee9d475f..4321d6e7 100644 --- a/altosdroid/res/menu/option_menu.xml +++ b/altosdroid/res/menu/option_menu.xml @@ -17,6 +17,9 @@      <item android:id="@+id/connect_scan"            android:icon="@android:drawable/ic_menu_search"            android:title="@string/connect_device" /> +    <item android:id="@+id/quit" +          android:icon="@android:drawable/ic_menu_close_clear_cancel" +          android:title="@string/quit" />      <item android:id="@+id/select_freq"            android:icon="@android:drawable/ic_menu_preferences"            android:title="@string/select_freq" /> diff --git a/altosdroid/res/values/strings.xml b/altosdroid/res/values/strings.xml index ce335b76..0384b9b8 100644 --- a/altosdroid/res/values/strings.xml +++ b/altosdroid/res/values/strings.xml @@ -27,6 +27,7 @@  	<!-- Options Menu -->  	<string name="connect_device">Connect a device</string> +	<string name="quit">Quit</string>  	<string name="select_freq">Select radio frequency</string>  	<string name="select_rate">Select data rate</string> diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java index 484efaf8..4a1fc371 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java @@ -52,6 +52,7 @@ public class AltosBluetooth extends AltosLink {  	// Constructor  	public AltosBluetooth(BluetoothDevice in_device, Handler in_handler) { +//		set_debug(D);  		adapter = BluetoothAdapter.getDefaultAdapter();  		device = in_device;  		handler = in_handler; @@ -136,6 +137,22 @@ public class AltosBluetooth extends AltosLink {  		}  	} +	public double frequency() { +		return frequency; +	} + +	public int telemetry_rate() { +		return telemetry_rate; +	} + +	public void save_frequency() { +		AltosPreferences.set_frequency(serial, frequency); +	} + +	public void save_telemetry_rate() { +		AltosPreferences.set_telemetry_rate(serial, telemetry_rate); +	} +  	private synchronized void wait_connected() throws InterruptedException, IOException {  		if (input == null) {  			wait(); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java index c94f36fd..db1ca691 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java @@ -44,8 +44,10 @@ import android.view.Menu;  import android.view.MenuInflater;  import android.view.MenuItem;  import android.view.Window; +import android.view.View;  import android.widget.TabHost;  import android.widget.TextView; +import android.widget.RelativeLayout;  import android.widget.Toast;  import android.app.AlertDialog;  import android.location.Location; @@ -63,6 +65,8 @@ public class AltosDroid extends FragmentActivity {  	public static final int MSG_UPDATE_AGE      = 3;  	public static final int MSG_LOCATION	    = 4;  	public static final int MSG_CRC_ERROR	    = 5; +	public static final int MSG_FREQUENCY       = 6; +	public static final int MSG_TELEMETRY_RATE  = 7;  	// Intent request codes  	private static final int REQUEST_CONNECT_DEVICE = 1; @@ -78,12 +82,16 @@ public class AltosDroid extends FragmentActivity {  	private TextView mRSSIView;  	private TextView mSerialView;  	private TextView mFlightView; +	private RelativeLayout mStateLayout;  	private TextView mStateView;  	private TextView mAgeView;  	// field to display the version at the bottom of the screen  	private TextView mVersion; +	private double frequency; +	private int telemetry_rate; +  	// Tabs  	TabHost         mTabHost;  	AltosViewPager  mViewPager; @@ -122,11 +130,7 @@ public class AltosDroid extends FragmentActivity {  				if(D) Log.d(TAG, "MSG_STATE_CHANGE: " + msg.arg1);  				switch (msg.arg1) {  				case TelemetryService.STATE_CONNECTED: -					ad.mConfigData = (AltosConfigData) msg.obj; -					String str = String.format(" %s S/N: %d", ad.mConfigData.product, ad.mConfigData.serial); -					ad.mTitle.setText(R.string.title_connected_to); -					ad.mTitle.append(str); -					Toast.makeText(ad.getApplicationContext(), "Connected to " + str, Toast.LENGTH_SHORT).show(); +					ad.set_config_data((AltosConfigData) msg.obj);  					break;  				case TelemetryService.STATE_CONNECTING:  					ad.mTitle.setText(R.string.title_connecting); @@ -135,6 +139,9 @@ public class AltosDroid extends FragmentActivity {  				case TelemetryService.STATE_NONE:  					ad.mConfigData = null;  					ad.mTitle.setText(R.string.title_not_connected); +					String	active_device = AltosDroidPreferences.active_device(); +					if (active_device != null) +						ad.connectDevice(active_device);  					break;  				}  				break; @@ -151,6 +158,12 @@ public class AltosDroid extends FragmentActivity {  					ad.mAgeView.setText(String.format("%d", (System.currentTimeMillis() - ad.saved_state.received_time + 500) / 1000));  				}  				break; +			case MSG_FREQUENCY: +				ad.set_frequency((Double) msg.obj); +				break; +			case MSG_TELEMETRY_RATE: +				ad.set_telemetry_rate((Integer) msg.obj); +				break;  			}  		}  	}; @@ -211,6 +224,33 @@ public class AltosDroid extends FragmentActivity {  		update_ui(saved_state);  	} +	void set_title() { +		if (mConfigData != null) { +			String str = String.format("S/N %d %6.3f MHz", mConfigData.serial, frequency); + +			if (telemetry_rate != AltosLib.ao_telemetry_rate_38400) +				str = str.concat(String.format(" %d bps", AltosLib.ao_telemetry_rate_values[telemetry_rate])); +			mTitle.setText(str); +		} +	} + +	void set_frequency(double frequency) { +		if (D) Log.d(TAG, String.format("AltosDroid: set_frequency %f\n", frequency)); +		this.frequency = frequency; +		set_title(); +	} + +	void set_telemetry_rate(int telemetry_rate) { +		if (D) Log.d(TAG, String.format("AltosDroid: set_telemetry_rate %d\n", telemetry_rate)); +		this.telemetry_rate = telemetry_rate; +		set_title(); +	} + +	void set_config_data(AltosConfigData config_data) { +		mConfigData = config_data; +		set_title(); +	} +  	boolean same_string(String a, String b) {  		if (a == null) {  			if (b == null) @@ -226,8 +266,15 @@ public class AltosDroid extends FragmentActivity {  	void update_ui(AltosState state) {  		Log.d(TAG, "update_ui"); -		if (state != null && saved_state != null) { -			if (saved_state.state != state.state) { + +		int prev_state = AltosLib.ao_flight_invalid; + +		if (saved_state != null) +			prev_state = saved_state.state; + +		if (state != null) { +			Log.d(TAG, String.format("prev state %d new state  %d\n", prev_state, state.state)); +			if (prev_state != state.state) {  				String currentTab = mTabHost.getCurrentTabTag();  				Log.d(TAG, "switch state");  				switch (state.state) { @@ -240,6 +287,9 @@ public class AltosDroid extends FragmentActivity {  				case AltosLib.ao_flight_landed:  					if (currentTab.equals("descent")) mTabHost.setCurrentTabByTag("landed");  					break; +				case AltosLib.ao_flight_stateless: +					if (currentTab.equals("pad")) mTabHost.setCurrentTabByTag("descent"); +					break;  				}  			}  		} @@ -273,7 +323,12 @@ public class AltosDroid extends FragmentActivity {  			}  			if (saved_state == null || state.state != saved_state.state) {  				Log.d(TAG, "update state"); -				mStateView.setText(state.state_name()); +				if (state.state == AltosLib.ao_flight_stateless) { +					mStateLayout.setVisibility(View.GONE); +				} else { +					mStateView.setText(state.state_name()); +					mStateLayout.setVisibility(View.VISIBLE); +				}  			}  			if (saved_state == null || state.rssi != saved_state.rssi) {  				Log.d(TAG, "update rssi"); @@ -399,6 +454,7 @@ public class AltosDroid extends FragmentActivity {  		mRSSIView      = (TextView) findViewById(R.id.rssi_value);  		mSerialView    = (TextView) findViewById(R.id.serial_value);  		mFlightView    = (TextView) findViewById(R.id.flight_value); +		mStateLayout   = (RelativeLayout) findViewById(R.id.state_container);  		mStateView     = (TextView) findViewById(R.id.state_value);  		mAgeView       = (TextView) findViewById(R.id.age_value); @@ -421,6 +477,7 @@ public class AltosDroid extends FragmentActivity {  		startService(new Intent(AltosDroid.this, TelemetryService.class));  		doBindService(); +  	}  	@Override @@ -490,6 +547,7 @@ public class AltosDroid extends FragmentActivity {  	private void connectDevice(Intent data) {  		// Get the device MAC address  		String address = data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS); +		AltosDroidPreferences.set_active_device(address);  		connectDevice(address);  	} @@ -550,6 +608,11 @@ public class AltosDroid extends FragmentActivity {  			serverIntent = new Intent(this, DeviceListActivity.class);  			startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE);  			return true; +		case R.id.quit: +			Log.d(TAG, "R.id.quit"); +			stopService(new Intent(AltosDroid.this, TelemetryService.class)); +			finish(); +			return true;  		case R.id.select_freq:  			// Set the TBT radio frequency diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/GoNoGoLights.java b/altosdroid/src/org/altusmetrum/AltosDroid/GoNoGoLights.java index 8e8d9c03..267c90f8 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/GoNoGoLights.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/GoNoGoLights.java @@ -20,6 +20,7 @@ package org.altusmetrum.AltosDroid;  import android.content.res.Resources;  import android.graphics.drawable.Drawable;  import android.widget.ImageView; +import android.view.View;  public class GoNoGoLights {  	private Boolean state; @@ -51,14 +52,27 @@ 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/TabLanded.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java index 16427d8b..32c235e1 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java @@ -92,7 +92,10 @@ public class TabLanded extends AltosDroidTab {  		if (state != null) {  			mMaxHeightView.setText(String.format("%6.0f m", state.max_height())); -			mMaxAccelView.setText(String.format("%6.0f m/s²", state.max_acceleration())); +			if (state.max_acceleration() != AltosLib.MISSING) +				mMaxAccelView.setText(String.format("%6.0f m/s²", state.max_acceleration())); +			else +				mMaxAccelView.setText("missing");  			mMaxSpeedView.setText(String.format("%6.0f m/s", state.max_speed()));  		}  	} diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java index 03b78b75..1068fa46 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java @@ -33,10 +33,13 @@ public class TabPad extends AltosDroidTab {  	AltosDroid mAltosDroid;  	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; @@ -59,16 +62,19 @@ public class TabPad extends AltosDroidTab {  	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),  		                                  (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),  		                                 (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),  		                               (ImageView) v.findViewById(R.id.main_greenled),  		                               getResources()); @@ -107,11 +113,23 @@ public class TabPad extends AltosDroidTab {  		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); - -			mApogeeVoltageView.setText(AltosDroid.number("%4.2f V", state.apogee_voltage)); +			if (state.apogee_voltage == AltosLib.MISSING) { +				mApogeeVoltageView.setVisibility(View.GONE); +				mApogeeVoltageLabel.setVisibility(View.GONE); +			} else { +				mApogeeVoltageView.setText(AltosDroid.number("%4.2f V", state.apogee_voltage)); +				mApogeeVoltageView.setVisibility(View.VISIBLE); +				mApogeeVoltageLabel.setVisibility(View.VISIBLE); +			}  			mApogeeLights.set(state.apogee_voltage >= AltosLib.ao_igniter_good, state.apogee_voltage == AltosLib.MISSING); - -			mMainVoltageView.setText(AltosDroid.number("%4.2f V", state.main_voltage)); +			if (state.main_voltage == AltosLib.MISSING) { +				mMainVoltageView.setVisibility(View.GONE); +				mMainVoltageLabel.setVisibility(View.GONE); +			} else { +				mMainVoltageView.setText(AltosDroid.number("%4.2f V", state.main_voltage)); +				mMainVoltageView.setVisibility(View.VISIBLE); +				mMainVoltageLabel.setVisibility(View.VISIBLE); +			}  			mMainLights.set(state.main_voltage >= AltosLib.ao_igniter_good, state.main_voltage == AltosLib.MISSING);  			if (state.flight != 0) { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java index 3ba5afa9..0c437f87 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java @@ -66,7 +66,7 @@ public class TelemetryReader extends Thread {  		AltosState  state = null;  		try { -			for (;;) { +			while (telemQueue != null) {  				try {  					state = read();  					handler.obtainMessage(TelemetryService.MSG_TELEMETRY, state).sendToTarget(); @@ -91,5 +91,14 @@ public class TelemetryReader extends Thread {  		state = null;  		telemQueue = new LinkedBlockingQueue<AltosLine>();  		link.add_monitor(telemQueue); +		try { +			link.set_radio_frequency(AltosPreferences.frequency(link.serial)); +			link.set_telemetry(AltosLib.ao_telemetry_standard); +			link.set_telemetry_rate(AltosPreferences.telemetry_rate(link.serial)); +		} catch (InterruptedException ee) { +			close(); +		} catch (TimeoutException te) { +			close(); +		}  	}  } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java index 4ec353e3..8e5c7903 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java @@ -115,6 +115,10 @@ public class TelemetryService extends Service implements LocationListener {  					if (s.last_state      != null) msg.replyTo.send(Message.obtain(null, AltosDroid.MSG_TELEMETRY, s.last_state     ));  					if (s.last_location   != null) msg.replyTo.send(Message.obtain(null, AltosDroid.MSG_LOCATION , s.last_location  ));  					if (s.last_crc_errors != 0   ) msg.replyTo.send(Message.obtain(null, AltosDroid.MSG_CRC_ERROR, s.last_crc_errors)); +					if (s.state == STATE_CONNECTED) { +						msg.replyTo.send(s.frequency_message()); +						msg.replyTo.send(s.telemetry_rate_message()); +					}  				} catch (RemoteException e) {  					s.mClients.remove(msg.replyTo);  				} @@ -131,13 +135,17 @@ public class TelemetryService extends Service implements LocationListener {  				break;  			case MSG_CONNECTED:  				if (D) Log.d(TAG, "Connected to device"); -				s.connected(); +				try { +					s.connected(); +				} catch (InterruptedException ie) { +				}  				break;  			case MSG_CONNECT_FAILED:  				if (D) Log.d(TAG, "Connection failed... retrying");  				s.startAltosBluetooth();  				break;  			case MSG_DISCONNECTED: +				Log.d(TAG, "MSG_DISCONNECTED");  				// Only do the following if we haven't been shutdown elsewhere..  				if (s.device != null) {  					if (D) Log.d(TAG, "Disconnected from " + s.device.getName()); @@ -158,6 +166,8 @@ public class TelemetryService extends Service implements LocationListener {  				if (s.state == STATE_CONNECTED) {  					try {  						s.mAltosBluetooth.set_radio_frequency((Double) msg.obj); +						s.mAltosBluetooth.save_frequency(); +						s.sendMessageToClients(s.frequency_message());  					} catch (InterruptedException e) {  					} catch (TimeoutException e) {  					} @@ -166,6 +176,8 @@ public class TelemetryService extends Service implements LocationListener {  			case MSG_SETBAUD:  				if (s.state == STATE_CONNECTED) {  					s.mAltosBluetooth.set_telemetry_rate((Integer) msg.obj); +					s.mAltosBluetooth.save_telemetry_rate(); +					s.sendMessageToClients(s.telemetry_rate_message());  				}  				break;  			default: @@ -184,6 +196,16 @@ public class TelemetryService extends Service implements LocationListener {  		}  	} +	private Message frequency_message() { +		if (D) Log.d(TAG, String.format("frequency_message %f\n", mAltosBluetooth.frequency())); +		return Message.obtain(null, AltosDroid.MSG_FREQUENCY, mAltosBluetooth.frequency()); +	} + +	private Message telemetry_rate_message() { +		if (D) Log.d(TAG, String.format("telemetry_rate_message %d\n", mAltosBluetooth.telemetry_rate())); +		return Message.obtain(null, AltosDroid.MSG_TELEMETRY_RATE, mAltosBluetooth.telemetry_rate()); +	} +  	private void stopAltosBluetooth() {  		if (D) Log.d(TAG, "stopAltosBluetooth(): begin");  		setState(STATE_READY); @@ -241,12 +263,14 @@ public class TelemetryService extends Service implements LocationListener {  		sendMessageToClients(Message.obtain(null, AltosDroid.MSG_STATE_CHANGE, state, -1, acd));  	} -	private void connected() { +	private void connected() throws InterruptedException {  		try {  			if (mAltosBluetooth == null)  				throw new InterruptedException("no bluetooth");  			mConfigData = mAltosBluetooth.config_data(); -		} catch (InterruptedException e) { +			if (D) Log.d(TAG, "send frequency/rate messages\n"); +			sendMessageToClients(frequency_message()); +			sendMessageToClients(telemetry_rate_message());  		} catch (TimeoutException e) {  			// If this timed out, then we really want to retry it, but  			// probably safer to just retry the connection from scratch. @@ -258,10 +282,12 @@ public class TelemetryService extends Service implements LocationListener {  		mTelemetryReader = new TelemetryReader(mAltosBluetooth, mHandler);  		mTelemetryReader.start(); -		 +  		mTelemetryLogger = new TelemetryLogger(this, mAltosBluetooth); -	} +		sendMessageToClients(frequency_message()); +		sendMessageToClients(telemetry_rate_message()); +	}  	private void onTimerTick() {  		if (D) Log.d(TAG, "Timer wakeup"); | 
