mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-12-02 10:24:11 +01:00
AndroidGCS Telemetry: Fix the determination of whether a transaction is pending
This commit is contained in:
parent
7f028f6d42
commit
8a5819379a
@ -30,8 +30,10 @@ import java.util.List;
|
|||||||
import java.util.ListIterator;
|
import java.util.ListIterator;
|
||||||
import java.util.Observable;
|
import java.util.Observable;
|
||||||
import java.util.Observer;
|
import java.util.Observer;
|
||||||
|
import java.util.Queue;
|
||||||
import java.util.Timer;
|
import java.util.Timer;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
|
|
||||||
import junit.framework.Assert;
|
import junit.framework.Assert;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@ -487,8 +489,14 @@ public class Telemetry {
|
|||||||
private static final int MAX_UPDATE_PERIOD_MS = 1000;
|
private static final int MAX_UPDATE_PERIOD_MS = 1000;
|
||||||
private static final int MIN_UPDATE_PERIOD_MS = 1;
|
private static final int MIN_UPDATE_PERIOD_MS = 1;
|
||||||
|
|
||||||
private final ObjectUpdateHandler handler;
|
static private ObjectUpdateHandler handler;
|
||||||
|
|
||||||
|
//! Accessor for the object updated handler
|
||||||
|
ObjectUpdateHandler getHandler() { return handler; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler which posts all the messages for individual object updates
|
||||||
|
*/
|
||||||
public class ObjectUpdateHandler extends Handler {
|
public class ObjectUpdateHandler extends Handler {
|
||||||
|
|
||||||
// ! This can only be created while attaching to a particular looper
|
// ! This can only be created while attaching to a particular looper
|
||||||
@ -496,6 +504,8 @@ public class Telemetry {
|
|||||||
super(l);
|
super(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Queue<ObjectQueueInfo> objQueue = new ConcurrentLinkedQueue<ObjectQueueInfo>();
|
||||||
|
|
||||||
// ! Generic enqueue
|
// ! Generic enqueue
|
||||||
void enqueueObjectUpdates(UAVObject obj, int event,
|
void enqueueObjectUpdates(UAVObject obj, int event,
|
||||||
boolean allInstances, boolean priority) {
|
boolean allInstances, boolean priority) {
|
||||||
@ -507,7 +517,26 @@ public class Telemetry {
|
|||||||
objInfo.event = event;
|
objInfo.event = event;
|
||||||
objInfo.allInstances = allInstances;
|
objInfo.allInstances = allInstances;
|
||||||
|
|
||||||
post(new ObjectRunnable(objInfo));
|
// For now maintain a list of objects in the queue so we don't add duplicates
|
||||||
|
// later we should make the runnables static to each class so we can use removeCallback
|
||||||
|
synchronized(objQueue) {
|
||||||
|
if (objQueue.contains(objInfo)) {
|
||||||
|
if (WARN) Log.w(TAG, "Found previously scheduled queue element: " + objInfo.obj.getName());
|
||||||
|
} else {
|
||||||
|
objQueue.add(objInfo);
|
||||||
|
post(new ObjectRunnable(objInfo));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean removeActivatedQueue(ObjectQueueInfo objInfo) {
|
||||||
|
synchronized(objQueue) {
|
||||||
|
if (objQueue.remove(objInfo)) {
|
||||||
|
if (WARN) Log.w(TAG, "Unable to find queue element to remove");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ! Enqueue an unpacked event
|
// ! Enqueue an unpacked event
|
||||||
@ -592,13 +621,13 @@ public class Telemetry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Determine if this will schedule a new transaction
|
// Determine if this will schedule a new transaction
|
||||||
newTransactionPending = !(newTrans.objRequest || newTrans.acked);
|
newTransactionPending = (newTrans.objRequest || newTrans.acked);
|
||||||
|
|
||||||
synchronized (transInfo) {
|
synchronized (transInfo) {
|
||||||
|
|
||||||
// If there is a transaction pending and this would set up a new one reschedule it
|
// If there is a transaction pending and this would set up a new one reschedule it
|
||||||
if (transPending && newTransactionPending) {
|
if (transPending && newTransactionPending) {
|
||||||
if (WARN) Log.w(TAG, "Postponing transaction for" + newTrans.obj.getName());
|
if (WARN) Log.w(TAG, "Postponing transaction for" + newTrans.obj.getName() + " existing transaction for " + transInfo.obj.getName());
|
||||||
handler.postDelayed(this, 100);
|
handler.postDelayed(this, 100);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -609,11 +638,14 @@ public class Telemetry {
|
|||||||
|
|
||||||
if (DEBUG) Log.d(TAG, "Process Object transaction for " + transInfo.obj.getName());
|
if (DEBUG) Log.d(TAG, "Process Object transaction for " + transInfo.obj.getName());
|
||||||
|
|
||||||
|
// Remove this one from the list of pending transactions
|
||||||
|
handler.removeActivatedQueue(objInfo);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
// 3. Execute transaction by sending the appropriate UAVTalk command
|
// 3. Execute transaction by sending the appropriate UAVTalk command
|
||||||
if (transInfo.objRequest) {
|
if (transInfo.objRequest) {
|
||||||
if (DEBUG) Log.d(TAG, "Sending object request" + transInfo.obj.getName());
|
if (DEBUG) Log.d(TAG, "Sending object request " + transInfo.obj.getName());
|
||||||
utalk.sendObjectRequest(transInfo.obj, transInfo.allInstances);
|
utalk.sendObjectRequest(transInfo.obj, transInfo.allInstances);
|
||||||
} else {
|
} else {
|
||||||
if (DEBUG) Log.d(TAG, "Sending object " + transInfo.obj.getName());
|
if (DEBUG) Log.d(TAG, "Sending object " + transInfo.obj.getName());
|
||||||
|
Loading…
Reference in New Issue
Block a user