1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-18 08:54:15 +01:00

Generate properties for UAVDataObject fields.

Also changed UAVObject::requestUpdate() and UAVObject::update() to be slots.

This makes possible to use objects directly from QML.
This commit is contained in:
Dmytro Poplavskiy 2012-02-05 13:58:17 +10:00
parent 64202ce092
commit aead288304
4 changed files with 119 additions and 2 deletions

View File

@ -99,8 +99,6 @@ public:
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();
@ -113,6 +111,10 @@ public:
QString toStringData();
void emitTransactionCompleted(bool success);
public slots:
void requestUpdate();
void updated();
signals:
void objectUpdated(UAVObject* obj);
void objectUpdatedAuto(UAVObject* obj);

View File

@ -50,6 +50,9 @@ $(FIELDSINIT)
setDefaultFieldValues();
// Set the object description
setDescription(DESCRIPTION);
connect(this, SIGNAL(objectUpdated(UAVObject*)),
SLOT(emitNotifications()));
}
/**
@ -107,6 +110,11 @@ void $(NAME)::setData(const DataFields& data)
}
}
void $(NAME)::emitNotifications()
{
$(NOTIFY_PROPERTIES_CHANGED)
}
/**
* Create a clone of this object, a new instance ID must be specified.
* Do not use this function directly to create new instances, the
@ -126,3 +134,5 @@ $(NAME)* $(NAME)::GetInstance(UAVObjectManager* objMngr, quint32 instID)
{
return dynamic_cast<$(NAME)*>(objMngr->getObject($(NAME)::OBJID, instID));
}
$(PROPERTIES_IMPL)

View File

@ -39,6 +39,7 @@
class UAVOBJECTS_EXPORT $(NAME): public UAVDataObject
{
Q_OBJECT
$(PROPERTIES)
public:
// Field structure
@ -66,6 +67,17 @@ $(DATAFIELDINFO)
UAVDataObject* clone(quint32 instID);
static $(NAME)* GetInstance(UAVObjectManager* objMngr, quint32 instID = 0);
$(PROPERTY_GETTERS)
public slots:
$(PROPERTY_SETTERS)
signals:
$(PROPERTY_NOTIFICATIONS)
private slots:
void emitNotifications();
private:
DataFields data;

View File

@ -107,6 +107,99 @@ bool UAVObjectGeneratorGCS::process_object(ObjectInfo* info)
}
outInclude.replace(QString("$(DATAFIELDS)"), fields);
// Replace $(PROPERTIES) and related tags
QString properties;
QString propertiesImpl;
QString propertyGetters;
QString propertySetters;
QString propertyNotifications;
QString propertyNotificationsImpl;
//to avoid name conflicts
QStringList reservedProperties;
reservedProperties << "Description" << "Metadata";
for (int n = 0; n < info->fields.length(); ++n)
{
FieldInfo *field = info->fields[n];
if (reservedProperties.contains(field->name))
continue;
// Determine type
type = fieldTypeStrCPP[field->type];
// Append field
if ( field->numElements > 1 ) {
propertyGetters +=
QString(" Q_INVOKABLE %1 get%2(quint32 index) const;\n")
.arg(type).arg(field->name);
propertiesImpl +=
QString("%1 %2::get%3(quint32 index) const\n"
"{\n"
" QMutexLocker locker(mutex);\n"
" return data.%3[index];\n"
"}\n")
.arg(type).arg(info->name).arg(field->name);
propertySetters +=
QString(" void set%1(quint32 index, %2 value);\n")
.arg(field->name).arg(type);
propertiesImpl +=
QString("void %1::set%2(quint32 index, %3 value)\n"
"{\n"
" mutex->lock();\n"
" bool changed = data.%2[index] != value;\n"
" data.%2[index] = value;\n"
" mutex->unlock();\n"
" if (changed) emit %2Changed(index,value);\n"
"}\n\n")
.arg(info->name).arg(field->name).arg(type);
propertyNotifications +=
QString(" void %1Changed(quint32 index, %2 value);\n")
.arg(field->name).arg(type);
} else {
properties += QString(" Q_PROPERTY(%1 %2 READ get%2 WRITE set%2 NOTIFY %2Changed);\n")
.arg(type).arg(field->name);
propertyGetters +=
QString(" Q_INVOKABLE %1 get%2() const;\n")
.arg(type).arg(field->name);
propertiesImpl +=
QString("%1 %2::get%3() const\n"
"{\n"
" QMutexLocker locker(mutex);\n"
" return data.%3;\n"
"}\n")
.arg(type).arg(info->name).arg(field->name);
propertySetters +=
QString(" void set%1(%2 value);\n")
.arg(field->name).arg(type);
propertiesImpl +=
QString("void %1::set%2(%3 value)\n"
"{\n"
" mutex->lock();\n"
" bool changed = data.%2 != value;\n"
" data.%2 = value;\n"
" mutex->unlock();\n"
" if (changed) emit %2Changed(value);\n"
"}\n\n")
.arg(info->name).arg(field->name).arg(type);
propertyNotifications +=
QString(" void %1Changed(%2 value);\n")
.arg(field->name).arg(type);
propertyNotificationsImpl +=
QString(" //if (data.%1 != oldData.%1)\n"
" emit %1Changed(data.%1);\n")
.arg(field->name);
}
}
outInclude.replace(QString("$(PROPERTIES)"), properties);
outInclude.replace(QString("$(PROPERTY_GETTERS)"), propertyGetters);
outInclude.replace(QString("$(PROPERTY_SETTERS)"), propertySetters);
outInclude.replace(QString("$(PROPERTY_NOTIFICATIONS)"), propertyNotifications);
outCode.replace(QString("$(PROPERTIES_IMPL)"), propertiesImpl);
outCode.replace(QString("$(NOTIFY_PROPERTIES_CHANGED)"), propertyNotificationsImpl);
// Replace the $(FIELDSINIT) tag
QString finit;
for (int n = 0; n < info->fields.length(); ++n)