Skip to content

Commit 230d770

Browse files
mindneverf5soh
authored andcommitted
Merged in mindnever/librepilot/LP-599_Extend_cloneof_attribute_functionality_in_uavobject_xml (pull request #514)
LP-599 Extend cloneof attribute functionality in uavobject xml Approved-by: Vladimir Zidar <mr_w@mindnever.org> Approved-by: Jan NIJS <dr.oblivium@gmail.com> Approved-by: Philippe Renon <philippe_renon@yahoo.fr> Approved-by: Lalanne Laurent <f5soh@free.fr>
2 parents 07871ca + 8dbf25e commit 230d770

6 files changed

Lines changed: 298 additions & 144 deletions

File tree

flight/uavobjects/inc/uavobject.h.template

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#ifndef $(NAMEUC)_H
4141
#define $(NAMEUC)_H
4242
#include <stdbool.h>
43+
$(INCLUDE)
4344
/* Object constants */
4445
#define $(NAMEUC)_OBJID $(OBJIDHEX)
4546
#define $(NAMEUC)_ISSINGLEINST $(ISSINGLEINST)

ground/gcs/src/plugins/uavobjects/uavobject.h.template

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#define $(NAMEUC)_H
3636

3737
#include "uavdataobject.h"
38+
$(INCLUDE)
3839

3940
class UAVObjectManager;
4041

ground/uavobjgenerator/generators/flight/uavobjectgeneratorflight.cpp

Lines changed: 72 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2525
*/
2626

27+
#include <QSet>
2728
#include "uavobjectgeneratorflight.h"
2829

2930
using namespace std;
@@ -169,52 +170,91 @@ bool UAVObjectGeneratorFlight::process_object(ObjectInfo *info)
169170
enums.append(QString("/* Field %1 information */\n").arg(info->fields[n]->name));
170171
// Only for enum types
171172
if (info->fields[n]->type == FIELDTYPE_ENUM) {
172-
enums.append(QString("\n// Enumeration options for field %1\n").arg(info->fields[n]->name));
173-
enums.append("typedef enum __attribute__ ((__packed__)) {\n");
174-
// Go through each option
175-
QStringList options = info->fields[n]->options;
176-
for (int m = 0; m < options.length(); ++m) {
177-
QString s = (m == (options.length() - 1)) ? " %1_%2_%3=%4\n" : " %1_%2_%3=%4,\n";
178-
enums.append(s
179-
.arg(info->name.toUpper())
180-
.arg(info->fields[n]->name.toUpper())
181-
.arg(options[m].toUpper().replace(QRegExp(ENUM_SPECIAL_CHARS), ""))
182-
.arg(m));
173+
if (info->fields[n]->parentObjectName.length() > 0) {
174+
enums.append(QString("typedef %1%2Options %3%4Options;\n")
175+
.arg(info->fields[n]->parentObjectName)
176+
.arg(info->fields[n]->parentFieldName)
177+
.arg(info->name)
178+
.arg(info->fields[n]->name));
179+
} else {
180+
enums.append(QString("\n// Enumeration options for field %1\n").arg(info->fields[n]->name));
181+
enums.append("typedef enum __attribute__ ((__packed__)) {\n");
182+
// Go through each option
183+
QStringList options = info->fields[n]->options;
184+
for (int m = 0; m < options.length(); ++m) {
185+
QString s = (m == (options.length() - 1)) ? " %1_%2_%3=%4\n" : " %1_%2_%3=%4,\n";
186+
enums.append(s
187+
.arg(info->name.toUpper())
188+
.arg(info->fields[n]->name.toUpper())
189+
.arg(options[m].toUpper().replace(QRegExp(ENUM_SPECIAL_CHARS), ""))
190+
.arg(m));
191+
}
192+
enums.append(QString("} %1%2Options;\n")
193+
.arg(info->name)
194+
.arg(info->fields[n]->name));
183195
}
184-
enums.append(QString("} %1%2Options;\n")
185-
.arg(info->name)
186-
.arg(info->fields[n]->name));
187196
}
188197
// Generate element names (only if field has more than one element)
189198
if (info->fields[n]->numElements > 1 && !info->fields[n]->defaultElementNames) {
190-
enums.append(QString("\n// Array element names for field %1\n").arg(info->fields[n]->name));
191-
enums.append("typedef enum {\n");
192-
// Go through the element names
193-
QStringList elemNames = info->fields[n]->elementNames;
194-
for (int m = 0; m < elemNames.length(); ++m) {
195-
QString s = (m != (elemNames.length() - 1)) ? " %1_%2_%3=%4,\n" : " %1_%2_%3=%4\n";
196-
enums.append(s
197-
.arg(info->name.toUpper())
198-
.arg(info->fields[n]->name.toUpper())
199-
.arg(elemNames[m].toUpper())
200-
.arg(m));
199+
if (info->fields[n]->parentObjectName.length() > 0) {
200+
enums.append(QString("typedef %1%2Elem %3%4Elem;\n")
201+
.arg(info->fields[n]->parentObjectName)
202+
.arg(info->fields[n]->parentFieldName)
203+
.arg(info->name)
204+
.arg(info->fields[n]->name));
205+
} else {
206+
enums.append(QString("\n// Array element names for field %1\n").arg(info->fields[n]->name));
207+
enums.append("typedef enum {\n");
208+
// Go through the element names
209+
QStringList elemNames = info->fields[n]->elementNames;
210+
for (int m = 0; m < elemNames.length(); ++m) {
211+
QString s = (m != (elemNames.length() - 1)) ? " %1_%2_%3=%4,\n" : " %1_%2_%3=%4\n";
212+
enums.append(s
213+
.arg(info->name.toUpper())
214+
.arg(info->fields[n]->name.toUpper())
215+
.arg(elemNames[m].toUpper())
216+
.arg(m));
217+
}
218+
enums.append(QString("} %1%2Elem;\n")
219+
.arg(info->name)
220+
.arg(info->fields[n]->name));
201221
}
202-
enums.append(QString("} %1%2Elem;\n")
203-
.arg(info->name)
204-
.arg(info->fields[n]->name));
205222
}
206223
// Generate array information
207224
if (info->fields[n]->numElements > 1) {
208225
enums.append(QString("\n// Number of elements for field %1\n").arg(info->fields[n]->name));
209-
enums.append(QString("#define %1_%2_NUMELEM %3\n")
210-
.arg(info->name.toUpper())
211-
.arg(info->fields[n]->name.toUpper())
212-
.arg(info->fields[n]->numElements));
226+
if (info->fields[n]->parentObjectName.length() > 0) {
227+
enums.append(QString("#define %1_%2_NUMELEM %3_%4_NUMELEM\n")
228+
.arg(info->name.toUpper())
229+
.arg(info->fields[n]->name.toUpper())
230+
.arg(info->fields[n]->parentObjectName.toUpper())
231+
.arg(info->fields[n]->parentFieldName.toUpper()));
232+
} else {
233+
enums.append(QString("#define %1_%2_NUMELEM %3\n")
234+
.arg(info->name.toUpper())
235+
.arg(info->fields[n]->name.toUpper())
236+
.arg(info->fields[n]->numElements));
237+
}
213238
}
214239

215240
enums.append(QString("\n"));
216241
}
242+
243+
QString includes;
244+
QSet<QString> parentObjects;
245+
246+
for (int n = 0; n < info->fields.length(); ++n) {
247+
if (info->fields[n]->parentObjectName.length() > 0) {
248+
parentObjects.insert(info->fields[n]->parentObjectName);
249+
}
250+
}
251+
252+
foreach(const QString &objectName, parentObjects) {
253+
includes.append("#include \"" + objectName.toLower() + ".h\"\n");
254+
}
255+
217256
outInclude.replace(QString("$(DATAFIELDINFO)"), enums);
257+
outInclude.replace(QString("$(INCLUDE)"), includes);
218258

219259
// Replace the $(INITFIELDS) tag
220260
QString initfields;

0 commit comments

Comments
 (0)