diff --git a/flight/UAVObjects/inc/uavobjectmanager.h b/flight/UAVObjects/inc/uavobjectmanager.h index bd1dc7f5f..fe7c21d07 100644 --- a/flight/UAVObjects/inc/uavobjectmanager.h +++ b/flight/UAVObjects/inc/uavobjectmanager.h @@ -59,10 +59,10 @@ typedef void* UAVObjHandle; * Object update mode, used by multiple modules (e.g. telemetry and logger) */ typedef enum { - UPDATEMODE_PERIODIC = 0, /** Automatically update object at periodic intervals */ - UPDATEMODE_ONCHANGE = 1, /** Only update object when its data changes */ - UPDATEMODE_THROTTLED = 2, /** Object is updated on change, but not more often than the interval time */ - UPDATEMODE_MANUAL = 3 /** Manually update object, by calling the updated() function */ + UPDATEMODE_MANUAL = 0, /** Manually update object, by calling the updated() function */ + UPDATEMODE_PERIODIC = 1, /** Automatically update object at periodic intervals */ + UPDATEMODE_ONCHANGE = 2, /** Only update object when its data changes */ + UPDATEMODE_THROTTLED = 3 /** Object is updated on change, but not more often than the interval time */ } UAVObjUpdateMode; /** diff --git a/ground/openpilotgcs/src/plugins/uavobjectbrowser/uavobjecttreemodel.cpp b/ground/openpilotgcs/src/plugins/uavobjectbrowser/uavobjecttreemodel.cpp index 9bd8b20b4..120d9d0d8 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectbrowser/uavobjecttreemodel.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectbrowser/uavobjecttreemodel.cpp @@ -176,6 +176,7 @@ void UAVObjectTreeModel::addSingleField(int index, UAVObjectField *field, TreeIt FieldTreeItem *item; UAVObjectField::FieldType type = field->getType(); switch (type) { + case UAVObjectField::BITFIELD: case UAVObjectField::ENUM: { QStringList options = field->getOptions(); QVariant value = field->getValue(); diff --git a/ground/openpilotgcs/src/plugins/uavobjects/uavmetaobject.cpp b/ground/openpilotgcs/src/plugins/uavobjects/uavmetaobject.cpp index bb45495f5..e190b4f27 100644 --- a/ground/openpilotgcs/src/plugins/uavobjects/uavmetaobject.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjects/uavmetaobject.cpp @@ -38,17 +38,13 @@ UAVMetaObject::UAVMetaObject(quint32 objID, const QString& name, UAVObject* pare // Setup default metadata of metaobject (can not be changed) UAVObject::MetadataInitialize(ownMetadata); // Setup fields - QStringList boolEnum; - boolEnum << tr("False") << tr("True"); - QStringList updateModeEnum; - updateModeEnum << tr("Periodic") << tr("On Change") << tr("Manual") << tr("Never"); - QStringList accessModeEnum; - accessModeEnum << tr("Read/Write") << tr("Read Only"); + QStringList modesBitField; + modesBitField << tr("FlightReadOnly") << tr("GCSReadOnly") << tr("FlightTelemetryAcked") << tr("GCSTelemetryAcked") << tr("FlightUpdatePeriodic") << tr("FlightUpdateOnChange") << tr("GCSUpdatePeriodic") << tr("GCSUpdateOnChange"); QList fields; - fields.append( new UAVObjectField(tr("Modes"), tr(""), UAVObjectField::UINT8, 1, accessModeEnum) ); - fields.append( new UAVObjectField(tr("Flight Telemetry Update Period"), tr(""), UAVObjectField::UINT16, 1, QStringList()) ); - fields.append( new UAVObjectField(tr("GCS Telemetry Update Period"), tr(""), UAVObjectField::UINT16, 1, QStringList()) ); - fields.append( new UAVObjectField(tr("Logging Update Period"), tr(""), UAVObjectField::UINT16, 1, QStringList()) ); + fields.append( new UAVObjectField(tr("Modes"), tr("boolean"), UAVObjectField::BITFIELD, modesBitField, QStringList()) ); + fields.append( new UAVObjectField(tr("Flight Telemetry Update Period"), tr("ms"), UAVObjectField::UINT16, 1, QStringList()) ); + fields.append( new UAVObjectField(tr("GCS Telemetry Update Period"), tr("ms"), UAVObjectField::UINT16, 1, QStringList()) ); + fields.append( new UAVObjectField(tr("Logging Update Period"), tr("ms"), UAVObjectField::UINT16, 1, QStringList()) ); // Initialize parent UAVObject::initialize(0); UAVObject::initializeFields(fields, (quint8*)&parentMetadata, sizeof(Metadata)); diff --git a/ground/openpilotgcs/src/plugins/uavobjects/uavobject.h b/ground/openpilotgcs/src/plugins/uavobjects/uavobject.h index 945672c61..0962ea73d 100644 --- a/ground/openpilotgcs/src/plugins/uavobjects/uavobject.h +++ b/ground/openpilotgcs/src/plugins/uavobjects/uavobject.h @@ -59,10 +59,10 @@ public: * Object update mode */ typedef enum { - UPDATEMODE_PERIODIC = 0, /** Automatically update object at periodic intervals */ - UPDATEMODE_ONCHANGE = 1, /** Only update object when its data changes */ - UPDATEMODE_THROTTLED = 2, /** Object is updated on change, but not more often than the interval time */ - UPDATEMODE_MANUAL = 3 /** Manually update object, by calling the updated() function */ + UPDATEMODE_MANUAL = 0, /** Manually update object, by calling the updated() function */ + UPDATEMODE_PERIODIC = 1, /** Automatically update object at periodic intervals */ + UPDATEMODE_ONCHANGE = 2, /** Only update object when its data changes */ + UPDATEMODE_THROTTLED = 3 /** Object is updated on change, but not more often than the interval time */ } UpdateMode; /** diff --git a/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp b/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp index f5df52396..79590fad8 100644 --- a/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp @@ -86,6 +86,10 @@ void UAVObjectField::constructorInitialize(const QString& name, const QString& u case ENUM: numBytesPerElement = sizeof(quint8); break; + case BITFIELD: + numBytesPerElement = sizeof(quint8); + this->options = QStringList()<=struc.values.at(0).toUInt() && var.toUInt()<=struc.values.at(1).toUInt())) return false; return true; @@ -316,6 +324,7 @@ bool UAVObjectField::isWithinLimits(QVariant var,quint32 index) case UINT8: case UINT16: case UINT32: + case BITFIELD: if(!(var.toUInt()>=struc.values.at(0).toUInt())) return false; return true; @@ -350,6 +359,7 @@ bool UAVObjectField::isWithinLimits(QVariant var,quint32 index) case UINT8: case UINT16: case UINT32: + case BITFIELD: if(!(var.toUInt()<=struc.values.at(0).toUInt())) return false; return true; @@ -457,6 +467,8 @@ QString UAVObjectField::getTypeAsString() return "float32"; case UAVObjectField::ENUM: return "enum"; + case UAVObjectField::BITFIELD: + return "bitfield"; case UAVObjectField::STRING: return "string"; default: @@ -477,7 +489,15 @@ UAVObject* UAVObjectField::getObject() void UAVObjectField::clear() { QMutexLocker locker(obj->getMutex()); - memset(&data[offset], 0, numBytesPerElement*numElements); + switch (type) + { + case BITFIELD: + memset(&data[offset], 0, numBytesPerElement*((quint32)(numElements/8))); + break; + default: + memset(&data[offset], 0, numBytesPerElement*numElements); + break; + } } QString UAVObjectField::getName() @@ -507,7 +527,15 @@ quint32 UAVObjectField::getDataOffset() quint32 UAVObjectField::getNumBytes() { - return numBytesPerElement * numElements; + switch (type) + { + case BITFIELD: + return numBytesPerElement * ((quint32) (numElements/8)); + break; + default: + return numBytesPerElement * numElements; + break; + } } QString UAVObjectField::toString() @@ -584,6 +612,12 @@ qint32 UAVObjectField::pack(quint8* dataOut) dataOut[numBytesPerElement*index] = data[offset + numBytesPerElement*index]; } break; + case BITFIELD: + for (quint32 index = 0; index < (quint32)(numElements/8); ++index) + { + dataOut[numBytesPerElement*index] = data[offset + numBytesPerElement*index]; + } + break; case STRING: memcpy(dataOut, &data[offset], numElements); break; @@ -653,6 +687,12 @@ qint32 UAVObjectField::unpack(const quint8* dataIn) data[offset + numBytesPerElement*index] = dataIn[numBytesPerElement*index]; } break; + case BITFIELD: + for (quint32 index = 0; index < (quint32)(numElements/8); ++index) + { + data[offset + numBytesPerElement*index] = dataIn[numBytesPerElement*index]; + } + break; case STRING: memcpy(&data[offset], dataIn, numElements); break; @@ -661,11 +701,6 @@ qint32 UAVObjectField::unpack(const quint8* dataIn) return getNumBytes(); } -quint32 UAVObjectField::getNumBytesElement() -{ - return numBytesPerElement; -} - bool UAVObjectField::isNumeric() { switch (type) @@ -694,6 +729,9 @@ bool UAVObjectField::isNumeric() case ENUM: return false; break; + case BITFIELD: + return true; + break; case STRING: return false; break; @@ -730,6 +768,9 @@ bool UAVObjectField::isText() case ENUM: return true; break; + case BITFIELD: + return false; + break; case STRING: return true; break; @@ -810,6 +851,14 @@ QVariant UAVObjectField::getValue(quint32 index) return QVariant( options[tmpenum] ); break; } + case BITFIELD: + { + quint8 tmpbitfield; + memcpy(&tmpbitfield, &data[offset + numBytesPerElement*((quint32)(index/8))], numBytesPerElement); + tmpbitfield = (tmpbitfield >> (index % 8)) & 1; + return QVariant( tmpbitfield ); + break; + } case STRING: { data[offset + numElements - 1] = '\0'; @@ -845,6 +894,7 @@ bool UAVObjectField::checkValue(const QVariant& value, quint32 index) case UINT32: case FLOAT32: case STRING: + case BITFIELD: return true; break; case ENUM: @@ -926,6 +976,14 @@ void UAVObjectField::setValue(const QVariant& value, quint32 index) memcpy(&data[offset + numBytesPerElement*index], &tmpenum, numBytesPerElement); break; } + case BITFIELD: + { + quint8 tmpbitfield; + memcpy(&tmpbitfield, &data[offset + numBytesPerElement*((quint32)(index/8))], numBytesPerElement); + tmpbitfield = (tmpbitfield & ~(1 << (index % 8))) | ( (value.toUInt()!=0?1:0) << (index % 8) ); + memcpy(&data[offset + numBytesPerElement*((quint32)(index/8))], &tmpbitfield, numBytesPerElement); + break; + } case STRING: { QString str = value.toString(); diff --git a/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.h b/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.h index faad2e568..c99db17a2 100644 --- a/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.h +++ b/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.h @@ -42,7 +42,7 @@ class UAVOBJECTS_EXPORT UAVObjectField: public QObject Q_OBJECT public: - typedef enum { INT8 = 0, INT16, INT32, UINT8, UINT16, UINT32, FLOAT32, ENUM, STRING } FieldType; + typedef enum { INT8 = 0, INT16, INT32, UINT8, UINT16, UINT32, FLOAT32, ENUM, BITFIELD, STRING } FieldType; typedef enum { EQUAL,NOT_EQUAL,BETWEEN,BIGGER,SMALLER } LimitType; typedef struct { @@ -70,7 +70,6 @@ public: void setDouble(double value, quint32 index = 0); quint32 getDataOffset(); quint32 getNumBytes(); - quint32 getNumBytesElement(); bool isNumeric(); bool isText(); QString toString();