mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2025-01-30 15:52:12 +01:00
AndroidGCS: Add a telemetry monitor to the action bar that shows the TX/RX data
rate. Right now seem to have a bug when going into the same widget twice it crashes teh second time.
This commit is contained in:
parent
a47cec644f
commit
5cd670ef49
31
androidgcs/res/layout/telemetry_stats.xml
Normal file
31
androidgcs/res/layout/telemetry_stats.xml
Normal file
@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/searchProgressWrapper"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal" >
|
||||
|
||||
<TextView
|
||||
android:id="@+id/telemetry_stats_rx_rate_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/rxrate" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/telemetry_stats_rx_rate"
|
||||
android:layout_width="64dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/telemetry_stats_tx_rate_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/txrate" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/telemetry_stats_tx_rate"
|
||||
android:layout_width="64dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="" />
|
||||
</LinearLayout>
|
@ -1,5 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<item android:id="@+id/menuItemProgress"
|
||||
android:title="Progress"
|
||||
android:actionLayout="@layout/telemetry_stats"
|
||||
android:showAsAction="always" />
|
||||
|
||||
</menu>
|
@ -30,4 +30,6 @@
|
||||
<string name="number_of_objects">Number of objects</string>
|
||||
<string name="number_of_bytes">Number of bytes</string>
|
||||
<string name="alarms">Alarms</string>
|
||||
<string name="txrate">TxRate: </string>
|
||||
<string name="rxrate">RxRate: </string>
|
||||
</resources>
|
||||
|
@ -66,8 +66,8 @@ public class Controller extends ObjectManagerActivity {
|
||||
|
||||
@Override
|
||||
void onOPConnected() {
|
||||
Log.d(TAG, "onOPConnected()");
|
||||
|
||||
super.onOPConnected();
|
||||
|
||||
// Subscribe to updates from ManualControlCommand and show the values for crude feedback
|
||||
UAVDataObject manualControl = (UAVDataObject) objMngr.getObject("ManualControlCommand");
|
||||
if(manualControl != null) {
|
||||
|
@ -77,6 +77,8 @@ public class Logger extends ObjectManagerActivity {
|
||||
|
||||
@Override
|
||||
void onOPConnected() {
|
||||
super.onOPConnected();
|
||||
|
||||
if (DEBUG) Log.d(TAG, "onOPConnected()");
|
||||
onStartLogging();
|
||||
registerObjectUpdates(objMngr.getObjects());
|
||||
|
@ -53,14 +53,15 @@ public class ObjectBrowser extends ObjectManagerActivity implements OnSharedPref
|
||||
/** Called when the activity is first created. */
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.object_browser);
|
||||
prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
prefs.registerOnSharedPreferenceChangeListener(this);
|
||||
super.onCreate(savedInstanceState);
|
||||
}
|
||||
|
||||
@Override
|
||||
void onOPConnected() {
|
||||
super.onOPConnected();
|
||||
Log.d(TAG, "onOPConnected()");
|
||||
|
||||
OnCheckedChangeListener checkListener = new OnCheckedChangeListener() {
|
||||
|
@ -24,6 +24,7 @@ import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.widget.TextView;
|
||||
|
||||
public abstract class ObjectManagerActivity extends Activity {
|
||||
|
||||
@ -42,7 +43,9 @@ public abstract class ObjectManagerActivity extends Activity {
|
||||
LocalBinder binder;
|
||||
//! Store the broadcast receiver to unregister it
|
||||
BroadcastReceiver connectedReceiver;
|
||||
|
||||
//! Indicate if this activity has already connected it's telemetry callbacks
|
||||
private boolean telemetryStatsConnected = false;
|
||||
|
||||
/** Called when the activity is first created. */
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
@ -118,19 +121,60 @@ public abstract class ObjectManagerActivity extends Activity {
|
||||
}
|
||||
}
|
||||
|
||||
private void updateStats() {
|
||||
UAVObject stats = objMngr.getObject("GCSTelemetryStats");
|
||||
TextView rxRate = (TextView) findViewById(R.id.telemetry_stats_rx_rate);
|
||||
TextView txRate = (TextView) findViewById(R.id.telemetry_stats_tx_rate);
|
||||
if (rxRate != null)
|
||||
rxRate.setText(Integer.valueOf((int) stats.getField("RxDataRate").getDouble()).toString());
|
||||
if (rxRate != null)
|
||||
txRate.setText(Integer.valueOf((int) stats.getField("TxDataRate").getDouble()).toString());
|
||||
|
||||
}
|
||||
|
||||
final Observer telemetryObserver = new Observer() {
|
||||
public void update(Observable observable, Object data) {
|
||||
uavobjHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
updateStats();
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Called when either the telemetry establishes a connection or
|
||||
* if it already has on creation of this activity
|
||||
*
|
||||
* This should be called by all inherited classes if they want the telemetry bar etc
|
||||
*/
|
||||
void onOPConnected() {
|
||||
if ( telemetryStatsConnected )
|
||||
return;
|
||||
|
||||
// We are not using the objectUpdated mechanism in place so that all the children
|
||||
// don't have to sort through the messages.
|
||||
UAVObject stats = objMngr.getObject("GCSTelemetryStats");
|
||||
if (stats == null)
|
||||
return;
|
||||
|
||||
stats.addUpdatedObserver(telemetryObserver);
|
||||
telemetryStatsConnected = true;
|
||||
updateStats();
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when telemetry drops the connection
|
||||
*
|
||||
* This should be called by all inherited classes if they want the telemetry bar etc
|
||||
*/
|
||||
void onOPDisconnected() {
|
||||
|
||||
// Indicate no connection
|
||||
TextView rxRate = (TextView) findViewById(R.id.telemetry_stats_rx_rate);
|
||||
TextView txRate = (TextView) findViewById(R.id.telemetry_stats_tx_rate);
|
||||
rxRate.setText("");
|
||||
txRate.setText("");
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -154,6 +198,7 @@ public abstract class ObjectManagerActivity extends Activity {
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
MenuInflater inflater = getMenuInflater();
|
||||
inflater.inflate(R.menu.status_menu, menu);
|
||||
inflater.inflate(R.menu.options_menu, menu);
|
||||
return true;
|
||||
}
|
||||
|
@ -1,31 +1,42 @@
|
||||
package org.openpilot.androidgcs;
|
||||
|
||||
import java.util.Observable;
|
||||
import java.util.Observer;
|
||||
|
||||
import org.openpilot.uavtalk.UAVDataObject;
|
||||
import org.openpilot.uavtalk.UAVObject;
|
||||
|
||||
import android.os.Bundle;
|
||||
|
||||
public class PFD extends ObjectManagerActivity {
|
||||
|
||||
final long MIN_UPDATE_PERIOD = 50;
|
||||
long lastUpdateMs;
|
||||
double heading;
|
||||
double roll;
|
||||
double pitch;
|
||||
|
||||
Runnable update = new Runnable() {
|
||||
public void run() {
|
||||
CompassView compass = (CompassView) findViewById(R.id.compass_view);
|
||||
compass.setBearing((int) heading);
|
||||
compass.invalidate();
|
||||
/**
|
||||
* Update the UI whenever the attitude is updated
|
||||
*/
|
||||
protected void objectUpdated(UAVObject obj) {
|
||||
// Throttle the UI redraws. Eventually this should maybe come from a periodic task
|
||||
if ((System.currentTimeMillis() - lastUpdateMs) < MIN_UPDATE_PERIOD)
|
||||
return;
|
||||
if (obj.getName().compareTo("AttitudeActual") != 0)
|
||||
return;
|
||||
|
||||
AttitudeView attitude = (AttitudeView) findViewById(R.id.attitude_view);
|
||||
attitude.setRoll(roll / 180 * Math.PI);
|
||||
attitude.setPitch(pitch / 180 * Math.PI);
|
||||
attitude.invalidate();
|
||||
}
|
||||
};
|
||||
lastUpdateMs = System.currentTimeMillis();
|
||||
|
||||
heading = obj.getField("Yaw").getDouble();
|
||||
pitch = obj.getField("Pitch").getDouble();
|
||||
roll = obj.getField("Roll").getDouble();
|
||||
|
||||
CompassView compass = (CompassView) findViewById(R.id.compass_view);
|
||||
compass.setBearing((int) heading);
|
||||
compass.invalidate();
|
||||
|
||||
AttitudeView attitude = (AttitudeView) findViewById(R.id.attitude_view);
|
||||
attitude.setRoll(roll / 180 * Math.PI);
|
||||
attitude.setPitch(pitch / 180 * Math.PI);
|
||||
attitude.invalidate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
@ -35,17 +46,11 @@ public class PFD extends ObjectManagerActivity {
|
||||
|
||||
@Override
|
||||
void onOPConnected() {
|
||||
super.onOPConnected();
|
||||
|
||||
// Connect the update method to AttitudeActual
|
||||
UAVObject obj = objMngr.getObject("AttitudeActual");
|
||||
if(obj != null)
|
||||
obj.addUpdatedObserver(new Observer() {
|
||||
public void update(Observable observable, Object data) {
|
||||
UAVDataObject obj = (UAVDataObject) data;
|
||||
heading = obj.getField("Yaw").getDouble();
|
||||
pitch = obj.getField("Pitch").getDouble();
|
||||
roll = obj.getField("Roll").getDouble();
|
||||
runOnUiThread(update);
|
||||
}
|
||||
});
|
||||
if (obj != null)
|
||||
registerObjectUpdates(obj);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user