From c736488c3bd80a9e423261adc146ed284cc5ddbd Mon Sep 17 00:00:00 2001 From: James Cotton Date: Thu, 2 Aug 2012 11:04:35 -0500 Subject: [PATCH] First step to fixing metat data representation for android --- .../org/openpilot/uavtalk/UAVMetaObject.java | 46 ++++-------- .../src/org/openpilot/uavtalk/UAVObject.java | 70 +++++++------------ .../org/openpilot/uavtalk/UAVObjectField.java | 48 ++++++++++++- 3 files changed, 85 insertions(+), 79 deletions(-) diff --git a/androidgcs/src/org/openpilot/uavtalk/UAVMetaObject.java b/androidgcs/src/org/openpilot/uavtalk/UAVMetaObject.java index 7aab176ef..c57b6c2fe 100644 --- a/androidgcs/src/org/openpilot/uavtalk/UAVMetaObject.java +++ b/androidgcs/src/org/openpilot/uavtalk/UAVMetaObject.java @@ -13,43 +13,25 @@ public class UAVMetaObject extends UAVObject { ownMetadata = new Metadata(); - ownMetadata.flightAccess = UAVObject.AccessMode.ACCESS_READWRITE; - ownMetadata.gcsAccess = UAVObject.AccessMode.ACCESS_READWRITE; - ownMetadata.flightTelemetryAcked = UAVObject.Acked.TRUE; - ownMetadata.flightTelemetryUpdateMode = UAVObject.UpdateMode.UPDATEMODE_ONCHANGE; - ownMetadata.flightTelemetryUpdatePeriod = 0; - ownMetadata.gcsTelemetryAcked = UAVObject.Acked.TRUE; - ownMetadata.gcsTelemetryUpdateMode = UAVObject.UpdateMode.UPDATEMODE_ONCHANGE; + ownMetadata.flags = 0; // TODO: Fix flags ownMetadata.gcsTelemetryUpdatePeriod = 0; - ownMetadata.loggingUpdateMode = UAVObject.UpdateMode.UPDATEMODE_ONCHANGE; ownMetadata.loggingUpdatePeriod = 0; - // Setup fields - List boolEnum = new ArrayList(); - boolEnum.add("False"); - boolEnum.add("True"); - List updateModeEnum = new ArrayList(); - updateModeEnum.add("Periodic"); - updateModeEnum.add("On Change"); - updateModeEnum.add("Manual"); - updateModeEnum.add("Never"); + List modesBitField = new ArrayList(); + modesBitField.add("FlightReadOnly"); + modesBitField.add("GCSReadOnly"); + modesBitField.add("FlightTelemetryAcked"); + modesBitField.add("GCSTelemetryAcked"); + modesBitField.add("FlightUpdatePeriodic"); + modesBitField.add("FlightUpdateOnChange"); + modesBitField.add("GCSUpdatePeriodic"); + modesBitField.add("GCSUpdateOnChange"); - List accessModeEnum = new ArrayList(); - accessModeEnum.add("Read/Write"); - accessModeEnum.add("Read Only"); - - List fields = new ArrayList(); - fields.add( new UAVObjectField("Flight Access Mode", "", UAVObjectField.FieldType.ENUM, 1, accessModeEnum) ); - fields.add( new UAVObjectField("GCS Access Mode", "", UAVObjectField.FieldType.ENUM, 1, accessModeEnum) ); - fields.add( new UAVObjectField("Flight Telemetry Acked", "", UAVObjectField.FieldType.ENUM, 1, boolEnum) ); - fields.add( new UAVObjectField("Flight Telemetry Update Mode", "", UAVObjectField.FieldType.ENUM, 1, updateModeEnum) ); - fields.add( new UAVObjectField("Flight Telemetry Update Period", "", UAVObjectField.FieldType.UINT32, 1, null) ); - fields.add( new UAVObjectField("GCS Telemetry Acked", "", UAVObjectField.FieldType.ENUM, 1, boolEnum) ); - fields.add( new UAVObjectField("GCS Telemetry Update Mode", "", UAVObjectField.FieldType.ENUM, 1, updateModeEnum) ); - fields.add( new UAVObjectField("GCS Telemetry Update Period", "", UAVObjectField.FieldType.UINT32, 1, null ) ); - fields.add( new UAVObjectField("Logging Update Mode", "", UAVObjectField.FieldType.ENUM, 1, updateModeEnum) ); - fields.add( new UAVObjectField("Logging Update Period", "", UAVObjectField.FieldType.UINT32, 1, null ) ); + fields.add( new UAVObjectField("Modes", "", UAVObjectField.FieldType.BITFIELD, 1, modesBitField) ); + fields.add( new UAVObjectField("Flight Telemetry Update Period", "ms", UAVObjectField.FieldType.UINT16, 1, null) ); + fields.add( new UAVObjectField("GCS Telemetry Update Period", "ms", UAVObjectField.FieldType.UINT16, 1, null) ); + fields.add( new UAVObjectField("Logging Update Period", "ms", UAVObjectField.FieldType.UINT16, 1, null) ); int numBytes = 0; ListIterator li = fields.listIterator(); diff --git a/androidgcs/src/org/openpilot/uavtalk/UAVObject.java b/androidgcs/src/org/openpilot/uavtalk/UAVObject.java index 940b076a5..20d4cb02a 100644 --- a/androidgcs/src/org/openpilot/uavtalk/UAVObject.java +++ b/androidgcs/src/org/openpilot/uavtalk/UAVObject.java @@ -120,17 +120,10 @@ public abstract class UAVObject { * Object update mode */ public enum UpdateMode { - UPDATEMODE_PERIODIC, /** - * Automatically update object at periodic - * intervals - */ + UPDATEMODE_MANUAL, /** Manually update object, by calling the updated() function */ + 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 */ + UPDATEMODE_THROTTLED /** Object is updated on change, but not more often than the interval time */ }; /** @@ -140,47 +133,32 @@ public abstract class UAVObject { ACCESS_READWRITE, ACCESS_READONLY }; - /** - * Access mode - */ - public enum Acked { - FALSE, TRUE - }; - public final class Metadata { - public AccessMode flightAccess; /** - * Defines the access level for the local flight transactions (readonly - * and readwrite) + * Object metadata, each object has a meta object that holds its metadata. The metadata define + * properties for each object and can be used by multiple modules (e.g. telemetry and logger) + * + * The object metadata flags are packed into a single 16 bit integer. + * The bits in the flag field are defined as: + * + * Bit(s) Name Meaning + * ------ ---- ------- + * 0 access Defines the access level for the local transactions (readonly=0 and readwrite=1) + * 1 gcsAccess Defines the access level for the local GCS transactions (readonly=0 and readwrite=1), not used in the flight s/w + * 2 telemetryAcked Defines if an ack is required for the transactions of this object (1:acked, 0:not acked) + * 3 gcsTelemetryAcked Defines if an ack is required for the transactions of this object (1:acked, 0:not acked) + * 4-5 telemetryUpdateMode Update mode used by the telemetry module (UAVObjUpdateMode) + * 6-7 gcsTelemetryUpdateMode Update mode used by the GCS (UAVObjUpdateMode) */ - public AccessMode gcsAccess; - /** - * Defines the access level for the local GCS transactions (readonly and - * readwrite) - */ - public Acked flightTelemetryAcked; - /** - * Defines if an ack is required for the transactions of this object - * (1:acked, 0:not acked) - */ - public UpdateMode flightTelemetryUpdateMode; - /** Update mode used by the autopilot (UpdateMode) */ + public int flags; /** Defines flags for update and logging modes and whether an update should be ACK'd (bits defined above) */ + + /** Update period used by the telemetry module (only if telemetry mode is PERIODIC) */ public int flightTelemetryUpdatePeriod; - /** - * Update period used by the autopilot (only if telemetry mode is - * PERIODIC) - */ - public Acked gcsTelemetryAcked; - /** - * Defines if an ack is required for the transactions of this object - * (1:acked, 0:not acked) - */ - public UpdateMode gcsTelemetryUpdateMode; - /** Update mode used by the GCS (UpdateMode) */ - public int gcsTelemetryUpdatePeriod; + + /** Update period used by the GCS (only if telemetry mode is PERIODIC) */ + public int gcsTelemetryUpdatePeriod; + /** Update period used by the GCS (only if telemetry mode is PERIODIC) */ - public UpdateMode loggingUpdateMode; - /** Update mode used by the logging module (UpdateMode) */ public int loggingUpdatePeriod; /** * Update period used by the logging module (only if logging mode is diff --git a/androidgcs/src/org/openpilot/uavtalk/UAVObjectField.java b/androidgcs/src/org/openpilot/uavtalk/UAVObjectField.java index 286859e63..c2965f6cc 100644 --- a/androidgcs/src/org/openpilot/uavtalk/UAVObjectField.java +++ b/androidgcs/src/org/openpilot/uavtalk/UAVObjectField.java @@ -7,7 +7,7 @@ import java.util.List; public class UAVObjectField { - public enum FieldType { INT8, INT16, INT32, UINT8, UINT16, UINT32, FLOAT32, ENUM, STRING }; + public enum FieldType { INT8, INT16, INT32, UINT8, UINT16, UINT32, FLOAT32, ENUM, BITFIELD, STRING }; public UAVObjectField(String name, String units, FieldType type, int numElements, List options) { List elementNames = new ArrayList(); @@ -56,6 +56,8 @@ public class UAVObjectField { return "float32"; case ENUM: return "enum"; + case BITFIELD: + return "bitfield"; case STRING: return "string"; default: @@ -144,6 +146,11 @@ public class UAVObjectField { for (int index = 0; index < numElements; ++index) dataOut.put((Byte) l.get(index)); break; + case BITFIELD: + for (int index = 0; index < numElements; ++index) { + Integer val = (Integer) getValue(index); + dataOut.put(val.byteValue()); + } case STRING: // TODO: Implement strings throw new Error("Strings not yet implemented"); @@ -224,6 +231,16 @@ public class UAVObjectField { } break; } + case BITFIELD: + { + List l = (List) this.data; + for (int index = 0 ; index < numElements; ++index) { + int signedval = (int) dataIn.get(); // this sign extends it + int unsignedval = signedval & 0xff; // drop sign extension + l.set(index, (short) unsignedval); + } + break; + } case ENUM: { List l = (List) this.data; @@ -275,6 +292,9 @@ public class UAVObjectField { return options.get(val); } + case BITFIELD: + return ((List) data).get(index).intValue(); + case STRING: { //throw new Exception("Shit I should do this"); @@ -354,6 +374,12 @@ public class UAVObjectField { l.set(index, val); break; } + case BITFIELD: + { + List l = (List) this.data; + l.set(index, bound(data).shortValue()); + break; + } case STRING: { //throw new Exception("Sorry I haven't implemented strings yet"); @@ -404,6 +430,8 @@ public class UAVObjectField { return true; case ENUM: return false; + case BITFIELD: + return true; case STRING: return false; default: @@ -430,6 +458,8 @@ public class UAVObjectField { return false; case ENUM: return true; + case BITFIELD: + return false; case STRING: return true; default: @@ -493,6 +523,12 @@ public class UAVObjectField { ((ArrayList) data).add((float) 0); } break; + case BITFIELD: + ((ArrayList) data).clear(); + for(int index = 0; index < numElements; ++index) { + ((ArrayList) data).add((short) 0); + } + break; case ENUM: ((ArrayList) data).clear(); for(int index = 0; index < numElements; ++index) { @@ -549,6 +585,10 @@ public class UAVObjectField { data = (Object) new ArrayList(this.numElements); numBytesPerElement = 1; break; + case BITFIELD: + data = (Object) new ArrayList(this.numElements); + numBytesPerElement = 1; + break; case STRING: data = (Object) new ArrayList(this.numElements); numBytesPerElement = 1; @@ -614,6 +654,12 @@ public class UAVObjectField { if(num > 4294967295L) return 4294967295L; return num; + case BITFIELD: + if(num < 0) + return (long) 0; + if(num > 255) + return (long) 255; + return num; } return num;