1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2024-12-01 09:24:10 +01:00

AndroidGCS: Dynamically load /data/uavobjects.jar for the objects

This commit is contained in:
James Cotton 2012-10-05 23:10:18 -05:00
parent 1a1aa85d1a
commit c6341139c2
2 changed files with 71 additions and 0 deletions

View File

@ -26,11 +26,15 @@
*/ */
package org.openpilot.androidgcs.telemetry; package org.openpilot.androidgcs.telemetry;
import java.io.File;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.openpilot.uavtalk.UAVObjectManager; import org.openpilot.uavtalk.UAVObjectManager;
import android.app.Service; import android.app.Service;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Binder; import android.os.Binder;
@ -43,6 +47,7 @@ import android.os.Process;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import dalvik.system.DexClassLoader;
public class OPTelemetryService extends Service { public class OPTelemetryService extends Service {
@ -270,4 +275,53 @@ public class OPTelemetryService extends Service {
public interface TelemTask { public interface TelemTask {
public UAVObjectManager getObjectManager(); public UAVObjectManager getObjectManager();
}; };
/**
* Load the UAVObjects from a JAR file. This method must be called in the
* service context.
* @return True if success, False otherwise
*/
public boolean loadUavobjects(String jar, UAVObjectManager objMngr) {
final String JAR_DIR = "/data/";
final String DEX_DIR = "optimized_dex";
Log.d(TAG, "Starting dex loader");
File dexDir = getDir(DEX_DIR, Context.MODE_WORLD_READABLE);
// Necessary to get dexOpt to run
//if (dexDir.exists())
// deleteDirectoryContents(dexDir);
File jarsDir = getDir(JAR_DIR, MODE_WORLD_READABLE);
String classpath = new File(jarsDir, jar).getAbsolutePath();
DexClassLoader loader = new DexClassLoader(classpath, dexDir.getAbsolutePath(), null, getClassLoader());
Object initInstance = null;
try {
Class<?> initClass = loader.loadClass("org.openpilot.uavtalk.uavobjects.UAVObjectsInitialize");
initInstance = initClass.newInstance();
Method initMethod = initClass.getMethod("register", UAVObjectManager.class);
initMethod.invoke(initInstance, objMngr);
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (InstantiationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (NoSuchMethodException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
} }

View File

@ -8,6 +8,7 @@ import java.util.Observer;
import org.openpilot.uavtalk.Telemetry; import org.openpilot.uavtalk.Telemetry;
import org.openpilot.uavtalk.TelemetryMonitor; import org.openpilot.uavtalk.TelemetryMonitor;
import org.openpilot.uavtalk.UAVObject;
import org.openpilot.uavtalk.UAVObjectManager; import org.openpilot.uavtalk.UAVObjectManager;
import org.openpilot.uavtalk.UAVTalk; import org.openpilot.uavtalk.UAVTalk;
import org.openpilot.uavtalk.uavobjects.UAVObjectsInitialize; import org.openpilot.uavtalk.uavobjects.UAVObjectsInitialize;
@ -91,6 +92,17 @@ public abstract class TelemetryTask implements Runnable {
*/ */
abstract boolean attemptConnection(); abstract boolean attemptConnection();
private final Observer firmwareIapUpdated = new Observer() {
@Override
public void update(Observable observable, Object data) {
Log.d(TAG, "Received firmware IAP Updated message");
telemService.loadUavobjects("uavobjects.jar", objMngr);
UAVObject obj = objMngr.getObject("FirmwareIAPObj");
obj.removeUpdatedObserver(this);
}
};
/** /**
* Called when a physical channel is opened * Called when a physical channel is opened
* *
@ -105,6 +117,11 @@ public abstract class TelemetryTask implements Runnable {
objMngr = new UAVObjectManager(); objMngr = new UAVObjectManager();
UAVObjectsInitialize.register(objMngr); UAVObjectsInitialize.register(objMngr);
// Register to get an update from FirmwareIAP in order to register
// the appropriate objects
UAVObject obj = objMngr.getObject("FirmwareIAPObj");
obj.addUpdatedObserver(firmwareIapUpdated);
// Create the required telemetry objects attached to this // Create the required telemetry objects attached to this
// data stream // data stream
uavTalk = new UAVTalk(inStream, outStream, objMngr); uavTalk = new UAVTalk(inStream, outStream, objMngr);