1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-01-17 02:52:12 +01:00

Initial import of my androidgcs framework

This commit is contained in:
James Cotton 2011-02-24 03:35:19 -06:00
parent dde9de080e
commit d06b40ea29
34 changed files with 769 additions and 0 deletions

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.openpilot.androidgcs"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name="ObjectBrowser"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

BIN
androidgcs/bin/OpieMobi.apk Normal file

Binary file not shown.

BIN
androidgcs/bin/classes.dex Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,11 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "build.properties", and override values to adapt the script to your
# project structure.
# Project target.
target=android-8

View File

@ -0,0 +1,31 @@
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/
package org.openpilot.androidgcs;
public final class R {
public static final class attr {
}
public static final class color {
public static final int all_black=0x7f050001;
public static final int all_white=0x7f050000;
}
public static final class drawable {
public static final int icon=0x7f020000;
}
public static final class id {
public static final int objects=0x7f060000;
}
public static final class layout {
public static final int main=0x7f030000;
public static final int objectbrowser=0x7f030001;
}
public static final class string {
public static final int app_name=0x7f040001;
public static final int hello=0x7f040000;
}
}

36
androidgcs/proguard.cfg Normal file
View File

@ -0,0 +1,36 @@
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/all_white">
<ExpandableListView android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/objects"></ExpandableListView>
</LinearLayout>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">OpenPilot Android GCS</string>
<string name="app_name">OpieMobi</string>
<color name="all_white">#FFFFFF</color>
<color name="all_black">#000000</color>
</resources>

View File

@ -0,0 +1,99 @@
/**
*
*/
package org.openpilot.androidgcs;
import android.widget.AbsListView;
import android.widget.TextView;
import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
/**
* @author jcotton81
*
*/
public class ObjBrowserExpandableListAdapter extends BaseExpandableListAdapter {
// Sample data set. children[i] contains the children (String[]) for
// groups[i].
private String[] groups = { "Parent1", "Parent2", "Parent3" };
private String[][] children = { { "Child1" },{ "Child2" }, { "Child3" },{ "Child4" }, { "Child5" } };
private Context context;
public ObjBrowserExpandableListAdapter(Context context) {
this.context = context;
}
public Object getChild(int groupPosition, int childPosition) {
return children[groupPosition][childPosition];
}
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
public int getChildrenCount(int groupPosition) {
int i = 0;
try {
i = children[groupPosition].length;
} catch (Exception e) {
}
return i;
}
public TextView getGenericView() {
// Layout parameters for the ExpandableListView
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, 64);
TextView textView = new TextView(context);
textView.setLayoutParams(lp);
// Center the text vertically
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
// Set the text starting position
textView.setPadding(36, 0, 0, 0);
return textView;
}
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
TextView textView = getGenericView();
textView.setText(getChild(groupPosition, childPosition).toString());
return textView;
}
public Object getGroup(int groupPosition) {
return groups[groupPosition];
}
public int getGroupCount() {
return groups.length;
}
public long getGroupId(int groupPosition) {
return groupPosition;
}
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
TextView textView = getGenericView();
textView.setText(getGroup(groupPosition).toString());
return textView;
}
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
public boolean hasStableIds() {
return true;
}
}

View File

@ -0,0 +1,21 @@
package org.openpilot.androidgcs;
import android.app.Activity;
import android.os.Bundle;
import android.widget.*;
public class ObjectBrowser extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.objectbrowser);
ExpandableListAdapter mAdapter;
ExpandableListView epView = (ExpandableListView) findViewById(R.id.objects);
mAdapter = new ObjBrowserExpandableListAdapter(this);
epView.setAdapter(mAdapter);
}
}

View File

@ -0,0 +1,27 @@
package org.openpilot.uavtalk;
public abstract class UAVDataObject extends UAVObject {
public UAVDataObject(int objID, Boolean isSingleInst, Boolean isSet, String name) {
super(objID, isSingleInst, name);
}
public void initialize(int instID, UAVMetaObject mobj) {
}
public void initialize(UAVMetaObject mobj) {
}
Boolean isSettings() {
return null;
}
UAVMetaObject getMetaObject() {
return null;
}
public abstract UAVDataObject clone(int instID);
}

View File

@ -0,0 +1,50 @@
package org.openpilot.uavtalk;
public class UAVMetaObject extends UAVObject {
public UAVMetaObject(int objID, Boolean isSingleInst, String name) {
super(objID, isSingleInst, name);
// TODO Auto-generated constructor stub
}
public UAVMetaObject(int objID, String mname, UAVDataObject obj) {
// TODO Auto-generated constructor stub
}
@Override
public void deserialize(byte[] arr, int offset) {
// TODO Auto-generated method stub
}
@Override
public UAVMetaObject getDefaultMetadata() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getDescription() {
// TODO Auto-generated method stub
return null;
}
@Override
public int getObjID() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getObjName() {
// TODO Auto-generated method stub
return null;
}
@Override
public byte[] serialize() {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -0,0 +1,117 @@
package org.openpilot.uavtalk;
public abstract class UAVObject {
/**
* Object update mode
*/
public enum UpdateMode {
UPDATEMODE_PERIODIC, /** Automatically update object at periodic intervals */
UPDATEMODE_ONCHANGE, /** Only update object when its data changes */
UPDATEMODE_MANUAL, /** Manually update object, by calling the updated() function */
UPDATEMODE_NEVER /** Object is never updated */
} ;
/**
* Access mode
*/
public enum AccessMode{
ACCESS_READWRITE,
ACCESS_READONLY
} ;
private Boolean isSingleInst;
private int instID;
private UAVMetaObject meta;
public UAVObject(int objID, Boolean isSingleInst, String name) {
assert(objID == getObjID()); // ID is in implementation code, make sure it matches object
assert(name.equals(getName()));
this.isSingleInst = isSingleInst;
meta = getDefaultMetadata();
};
public void initialize(int instID) {
this.instID = instID;
}
public int getInstID() { return instID; }
public Boolean isSingleInstance() { return isSingleInst; }
public String getName() { return getObjName(); } // matching QT API to the current autogen code
public abstract int getObjID();
public abstract String getDescription();
public abstract String getObjName();
int getNumBytes() {
return serialize().length;
}
// The name of the serializer and deserialize from the autogenerated code
public abstract byte[] serialize();
public abstract void deserialize(byte[] arr,int offset);
byte [] pack() {
return serialize();
}
Boolean unpack(byte [] data) {
deserialize(data, 0);
return true;
}
public void setMetadata(UAVMetaObject obj) { meta = obj; }
public UAVMetaObject getMetadata() { return meta; }
public abstract UAVMetaObject getDefaultMetadata();
/*
// Unported code from QT
bool save();
bool save(QFile& file);
bool load();
bool load(QFile& file);
virtual void setMetadata(const Metadata& mdata) = 0;
virtual Metadata getMetadata() = 0;
virtual Metadata getDefaultMetadata() = 0;
void requestUpdate();
void updated();
void lock();
void lock(int timeoutMs);
void unlock();
QMutex* getMutex();
qint32 getNumFields();
QList<UAVObjectField*> getFields();
UAVObjectField* getField(const QString& name);
QString toString();
QString toStringBrief();
QString toStringData();
void emitTransactionCompleted(bool success);
signals:
void objectUpdated(UAVObject* obj);
void objectUpdatedAuto(UAVObject* obj);
void objectUpdatedManual(UAVObject* obj);
void objectUnpacked(UAVObject* obj);
void updateRequested(UAVObject* obj);
void transactionCompleted(UAVObject* obj, bool success);
private slots:
void fieldUpdated(UAVObjectField* field);
protected:
quint32 objID;
quint32 instID;
bool isSingleInst;
QString name;
QString description;
quint32 numBytes;
QMutex* mutex;
quint8* data;
QList<UAVObjectField*> fields;
void initializeFields(QList<UAVObjectField*>& fields, quint8* data, quint32 numBytes);
void setDescription(const QString& description);
*/
}

View File

@ -0,0 +1,332 @@
package org.openpilot.uavtalk;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class UAVObjectManager {
private final int MAX_INSTANCES = 10;
// Use array list to store objects since rarely added or deleted
private List<List<UAVObject>> objects = new ArrayList<List<UAVObject>>();
public UAVObjectManager()
{
//mutex = new QMutex(QMutex::Recursive);
}
/**
* Register an object with the manager. This function must be called for all newly created instances.
* A new instance can be created directly by instantiating a new object or by calling clone() of
* an existing object. The object will be registered and will be properly initialized so that it can accept
* updates.
*/
Boolean registerObject(UAVDataObject obj)
{
// QMutexLocker locker(mutex);
ListIterator<List<UAVObject>> objIt = objects.listIterator(0);
// Check if this object type is already in the list
while(objIt.hasNext()) {
List<UAVObject> instList = objIt.next();
// Check if the object ID is in the list
if( (instList.size() > 0) && (instList.get(0).getObjID() == obj.getObjID() )) {
// Check if this is a single instance object, if yes we can not add a new instance
if(obj.isSingleInstance()) {
return false;
}
// The object type has alredy been added, so now we need to initialize the new instance with the appropriate id
// There is a single metaobject for all object instances of this type, so no need to create a new one
// Get object type metaobject from existing instance
UAVDataObject refObj = (UAVDataObject) instList.get(0);
if (refObj == null)
{
return false;
}
UAVMetaObject mobj = refObj.getMetaObject();
// Make sure we aren't requesting to create too many instances
if(obj.getInstID() >= MAX_INSTANCES || instList.size() >= MAX_INSTANCES || obj.getInstID() < 0) {
return false;
}
// If InstID is zero then we find the next open instId and create it
if (obj.getInstID() == 0)
{
// Assign the next available ID and initialize the object instance the nadd
obj.initialize(instList.size(), mobj);
instList.add(obj);
return true;
}
// Check if that inst ID already exists
ListIterator<UAVObject> instIter = instList.listIterator();
while(instIter.hasNext()) {
UAVObject testObj = instIter.next();
if(testObj.getInstID() == obj.getInstID()) {
return false;
}
}
// If the instance ID is specified and not at the default value (0) then we need to make sure
// that there are no gaps in the instance list. If gaps are found then then additional instances
// will be created.
for(int instID = instList.size(); instID < obj.getInstID(); instID++) {
UAVDataObject newObj = obj.clone(instID);
newObj.initialize(mobj);
instList.add(newObj);
// emit new instance signal
}
obj.initialize(mobj);
//emit new instance signal
instList.add(obj);
instIter = instList.listIterator();
while(instIter.hasNext()) {
UAVObject testObj = instIter.next();
if(testObj.getInstID() == obj.getInstID()) {
return false;
}
}
// Check if there are any gaps between the requested instance ID and the ones in the list,
// if any then create the missing instances.
for (int instId = instList.size(); instId < obj.getInstID(); ++instId)
{
UAVDataObject cobj = obj.clone(instId);
cobj.initialize(mobj);
instList.add(cobj);
// emit newInstance(cobj);
}
// Finally, initialize the actual object instance
obj.initialize(mobj);
// Add the actual object instance in the list
instList.add(obj);
//emit newInstance(obj);
return true;
}
}
// If this point is reached then this is the first time this object type (ID) is added in the list
// create a new list of the instances, add in the object collection and create the object's metaobject
// Create metaobject
String mname = obj.getName();
mname += "Meta";
UAVMetaObject mobj = new UAVMetaObject(obj.getObjID()+1, mname, obj);
// Initialize object
obj.initialize(0, mobj);
// Add to list
addObject(obj);
addObject(mobj);
return true;
}
void addObject(UAVObject obj)
{
// Add to list
List<UAVObject> ls = new ArrayList<UAVObject>();
ls.add(obj);
objects.add(ls);
//emit newObject(obj);
}
/**
* Get all objects. A two dimentional QList is returned. Objects are grouped by
* instances of the same object type.
*/
List<List<UAVObject>> getObjects()
{
//QMutexLocker locker(mutex);
return objects;
}
/**
* Same as getObjects() but will only return DataObjects.
*/
List< List<UAVDataObject> > getDataObjects()
{
return new ArrayList<List<UAVDataObject>>();
/* QMutexLocker locker(mutex);
QList< QList<UAVDataObject*> > dObjects;
// Go through objects and copy to new list when types match
for (int objidx = 0; objidx < objects.length(); ++objidx)
{
if (objects[objidx].length() > 0)
{
// Check type
UAVDataObject* obj = dynamic_cast<UAVDataObject*>(objects[objidx][0]);
if (obj != NULL)
{
// Create instance list
QList<UAVDataObject*> list;
// Go through instances and cast them to UAVDataObject, then add to list
for (int instidx = 0; instidx < objects[objidx].length(); ++instidx)
{
obj = dynamic_cast<UAVDataObject*>(objects[objidx][instidx]);
if (obj != NULL)
{
list.append(obj);
}
}
// Append to object list
dObjects.append(list);
}
}
}*/
// Done
}
/**
* Same as getObjects() but will only return MetaObjects.
*/
List <List<UAVMetaObject> > getMetaObjects()
{
return new ArrayList< List<UAVMetaObject> >();
/*
QMutexLocker locker(mutex);
QList< QList<UAVMetaObject*> > mObjects;
// Go through objects and copy to new list when types match
for (int objidx = 0; objidx < objects.length(); ++objidx)
{
if (objects[objidx].length() > 0)
{
// Check type
UAVMetaObject* obj = dynamic_cast<UAVMetaObject*>(objects[objidx][0]);
if (obj != NULL)
{
// Create instance list
QList<UAVMetaObject*> list;
// Go through instances and cast them to UAVMetaObject, then add to list
for (int instidx = 0; instidx < objects[objidx].length(); ++instidx)
{
obj = dynamic_cast<UAVMetaObject*>(objects[objidx][instidx]);
if (obj != NULL)
{
list.append(obj);
}
}
// Append to object list
mObjects.append(list);
}
}
}
// Done
return mObjects;
*/
}
/**
* Get a specific object given its name and instance ID
* @returns The object is found or NULL if not
*/
UAVObject getObject(String name, int instId)
{
return getObject(name, 0, instId);
}
/**
* Get a specific object given its object and instance ID
* @returns The object is found or NULL if not
*/
UAVObject getObject(int objId, int instId)
{
return getObject(null, objId, instId);
}
/**
* Helper function for the public getObject() functions.
*/
UAVObject getObject(String name, int objId, int instId)
{
//QMutexLocker locker(mutex);
// Check if this object type is already in the list
ListIterator<List<UAVObject>> objIter = objects.listIterator();
while(objIter.hasNext()) {
List<UAVObject> instList = objIter.next();
if (instList.size() > 0) {
if ( (name != null && instList.get(0).getName().compareTo(name) == 0) || (name == null && instList.get(0).getObjID() == objId) ) {
// Look for the requested instance ID
ListIterator<UAVObject> iter = instList.listIterator();
while(iter.hasNext()) {
UAVObject obj = iter.next();
if(obj.getInstID() == instId) {
return obj;
}
}
}
}
}
return null;
}
/**
* Get all the instances of the object specified by name
*/
List<UAVObject> getObjectInstances(String name)
{
return getObjectInstances(name, 0);
}
/**
* Get all the instances of the object specified by its ID
*/
List<UAVObject> getObjectInstances(int objId)
{
return getObjectInstances(null, objId);
}
/**
* Helper function for the public getObjectInstances()
*/
List<UAVObject> getObjectInstances(String name, int objId)
{
//QMutexLocker locker(mutex);
// Check if this object type is already in the list
ListIterator<List<UAVObject>> objIter = objects.listIterator();
while(objIter.hasNext()) {
List<UAVObject> instList = objIter.next();
if (instList.size() > 0) {
if ( (name != null && instList.get(0).getName().compareTo(name) == 0) || (name == null && instList.get(0).getObjID() == objId) ) {
return instList;
}
}
}
return null;
}
/**
* Get the number of instances for an object given its name
*/
int getNumInstances(String name)
{
return getNumInstances(name, 0);
}
/**
* Get the number of instances for an object given its ID
*/
int getNumInstances(int objId)
{
return getNumInstances(null, objId);
}
/**
* Helper function for public getNumInstances
*/
int getNumInstances(String name, int objId)
{
return getObjectInstances(name,objId).size();
}
}