From 53e2db3b2421889c039a4c843c4b594e16eaeb41 Mon Sep 17 00:00:00 2001 From: "Richard Flay (Hyper)" Date: Sat, 8 Sep 2012 14:41:55 +0930 Subject: [PATCH 01/18] Added a backwards-compatible way to specify UAVO field element names and options as lists of child elements of the field element. Added the ability to specify that a field is a clone of another field, just with a different name --- ground/uavobjgenerator/main.cpp | 3 + ground/uavobjgenerator/uavobjectparser.cpp | 96 +++++++++++++++++--- shared/uavobjectdefinition/mixersettings.xml | 93 ++++++++++++++----- shared/uavobjectdefinition/taskinfo.xml | 73 ++++++++++++++- 4 files changed, 224 insertions(+), 41 deletions(-) diff --git a/ground/uavobjgenerator/main.cpp b/ground/uavobjgenerator/main.cpp index 725d65cd3..8bce4fd09 100644 --- a/ground/uavobjgenerator/main.cpp +++ b/ground/uavobjgenerator/main.cpp @@ -161,6 +161,9 @@ int main(int argc, char *argv[]) QString res = parser->parseXML(xmlstr, filename); if (!res.isNull()) { + if (!verbose) { + cout << "Error in XML file: " << fileinfo.fileName().toStdString() << endl; + } cout << "Error parsing " << res.toStdString() << endl; return RETURN_ERR_XML; } diff --git a/ground/uavobjgenerator/uavobjectparser.cpp b/ground/uavobjgenerator/uavobjectparser.cpp index 73c4833b0..2d1d28c66 100644 --- a/ground/uavobjgenerator/uavobjectparser.cpp +++ b/ground/uavobjgenerator/uavobjectparser.cpp @@ -213,6 +213,9 @@ QString UAVObjectParser::parseXML(QString& xml, QString& filename) qStableSort(info->fields.begin(), info->fields.end(), fieldTypeLessThan); // Make sure that required elements were found + if ( !fieldFound ) + return QString("Object::field element is missing"); + if ( !accessFound ) return QString("Object::access element is missing"); @@ -381,11 +384,38 @@ QString UAVObjectParser::processObjectFields(QDomNode& childNode, ObjectInfo* in // Get name attribute QDomNamedNodeMap elemAttributes = childNode.attributes(); QDomNode elemAttr = elemAttributes.namedItem("name"); - if ( elemAttr.isNull() ) + if (elemAttr.isNull()) { return QString("Object:field:name attribute is missing"); + } + QString name = elemAttr.nodeValue(); - field->name = elemAttr.nodeValue(); - + // Check to see is this field is a clone of another + // field that has already been declared + elemAttr = elemAttributes.namedItem("cloneof"); + if (!elemAttr.isNull()) { + QString parentName = elemAttr.nodeValue(); + if (!parentName.isEmpty()) { + foreach(FieldInfo * parent, info->fields) { + if (parent->name == parentName) { + // clone from this parent + *field = *parent; // safe shallow copy, no ptrs in struct + field->name = name; // set our name + // Add field to object + info->fields.append(field); + // Done + return QString(); + } + } + return QString("Object:field::cloneof parent unknown"); + } + else { + return QString("Object:field:cloneof attribute is empty"); + } + } + else { + // this field is not a clone, so remember its name + field->name = name; + } // Get units attribute elemAttr = elemAttributes.namedItem("units"); @@ -410,6 +440,8 @@ QString UAVObjectParser::processObjectFields(QDomNode& childNode, ObjectInfo* in } // Get numelements or elementnames attribute + field->numElements = 0; + // Look for element names as an attribute first elemAttr = elemAttributes.namedItem("elementnames"); if ( !elemAttr.isNull() ) { // Get element names @@ -422,9 +454,26 @@ QString UAVObjectParser::processObjectFields(QDomNode& childNode, ObjectInfo* in field->defaultElementNames = false; } else { + // Look for a list of child elementname nodes + QDomNode listNode = childNode.firstChildElement("elementnames"); + if (!listNode.isNull()) { + for (QDomElement node = listNode.firstChildElement("elementname"); + !node.isNull(); node = node.nextSiblingElement("elementname")) { + QDomNode name = node.firstChild(); + if (!name.isNull() && name.isText() && !name.nodeValue().isEmpty()) { + field->elementNames.append(name.nodeValue()); + } + } + field->numElements = field->elementNames.length(); + field->defaultElementNames = false; + } + } + // If no element names were found, then fall back to looking + // for the number of elements in the 'elements' attribute + if (field->numElements == 0) { elemAttr = elemAttributes.namedItem("elements"); if ( elemAttr.isNull() ) { - return QString("Object:field:elements and Object:field:elementnames attribute is missing"); + return QString("Object:field:elements and Object:field:elementnames attribute/element is missing"); } else { field->numElements = elemAttr.nodeValue().toInt(); @@ -434,19 +483,34 @@ QString UAVObjectParser::processObjectFields(QDomNode& childNode, ObjectInfo* in field->defaultElementNames = true; } } - // Get options attribute (only if an enum type) + // Get options attribute or child elements (only if an enum type) if (field->type == FIELDTYPE_ENUM) { - // Get options attribute + // Look for options attribute elemAttr = elemAttributes.namedItem("options"); - if ( elemAttr.isNull() ) - return QString("Object:field:options attribute is missing"); - - QStringList options = elemAttr.nodeValue().split(",", QString::SkipEmptyParts); - for (int n = 0; n < options.length(); ++n) - options[n] = options[n].trimmed(); - - field->options = options; + if (!elemAttr.isNull()) { + QStringList options = elemAttr.nodeValue().split(",", QString::SkipEmptyParts); + for (int n = 0; n < options.length(); ++n) { + options[n] = options[n].trimmed(); + } + field->options = options; + } + else { + // Look for a list of child 'option' nodes + QDomNode listNode = childNode.firstChildElement("options"); + if (!listNode.isNull()) { + for (QDomElement node = listNode.firstChildElement("option"); + !node.isNull(); node = node.nextSiblingElement("option")) { + QDomNode name = node.firstChild(); + if (!name.isNull() && name.isText() && !name.nodeValue().isEmpty()) { + field->options.append(name.nodeValue()); + } + } + } + } + if (field->options.length() == 0) { + return QString("Object:field:options attribute/element is missing"); + } } // Get the default value attribute (required for settings objects, optional for the rest) @@ -466,12 +530,14 @@ QString UAVObjectParser::processObjectFields(QDomNode& childNode, ObjectInfo* in return QString("Object:field:incorrect number of default values"); /*support legacy single default for multiple elements - We sould really issue a warning*/ + We should really issue a warning*/ for(int ct=1; ct< field->numElements; ct++) defaults.append(defaults[0]); } field->defaultValues = defaults; } + + // Limits attribute elemAttr = elemAttributes.namedItem("limits"); if ( elemAttr.isNull() ) { field->limitValues=QString(); diff --git a/shared/uavobjectdefinition/mixersettings.xml b/shared/uavobjectdefinition/mixersettings.xml index 6e0d519f1..ffbc067f9 100644 --- a/shared/uavobjectdefinition/mixersettings.xml +++ b/shared/uavobjectdefinition/mixersettings.xml @@ -5,29 +5,76 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ThrottleCurve1 + ThrottleCurve2 + Roll + Pitch + Yaw + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/shared/uavobjectdefinition/taskinfo.xml b/shared/uavobjectdefinition/taskinfo.xml index 551167501..e4f2ae652 100644 --- a/shared/uavobjectdefinition/taskinfo.xml +++ b/shared/uavobjectdefinition/taskinfo.xml @@ -1,9 +1,76 @@ Task information - - - + + + System + Actuator + Attitude + Sensors + TelemetryTx + TelemetryTxPri + TelemetryRx + GPS + ManualControl + Altitude + Stabilization + AltitudeHold + Guidance + FlightPlan + Com2UsbBridge + Usb2ComBridge + OveroSync + EventDispatcher + + + + + System + Actuator + Attitude + Sensors + TelemetryTx + TelemetryTxPri + TelemetryRx + GPS + ManualControl + Altitude + Stabilization + AltitudeHold + Guidance + FlightPlan + Com2UsbBridge + Usb2ComBridge + OveroSync + EventDispatcher + + + + + + + + + System + Actuator + Attitude + Sensors + TelemetryTx + TelemetryTxPri + TelemetryRx + GPS + ManualControl + Altitude + Stabilization + AltitudeHold + Guidance + FlightPlan + Com2UsbBridge + Usb2ComBridge + OveroSync + EventDispatcher + + From 6d7fa8a083bb162aeb3fa82a8ddd1145351f2935 Mon Sep 17 00:00:00 2001 From: PT_Dreamer Date: Fri, 14 Sep 2012 23:31:13 +0100 Subject: [PATCH 02/18] Flight-Added sha1 uavo directory calculation to fw_version_info struct. --- make/firmware-defs.mk | 3 ++- make/scripts/version-info.py | 38 ++++++++++++++++++++++++++- make/templates/firmwareinfotemplate.c | 4 ++- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/make/firmware-defs.mk b/make/firmware-defs.mk index 522d2e320..e77e71d2a 100644 --- a/make/firmware-defs.mk +++ b/make/firmware-defs.mk @@ -131,7 +131,8 @@ $(1).firmwareinfo.c: $(1) $(TOP)/make/templates/firmwareinfotemplate.c FORCE --outfile=$$@ \ --image=$(1) \ --type=$(2) \ - --revision=$(3) + --revision=$(3) \ + --uavodir=$(TOP)/shared/uavobjectdefinition $(eval $(call COMPILE_C_TEMPLATE, $(1).firmwareinfo.c)) diff --git a/make/scripts/version-info.py b/make/scripts/version-info.py index 8c4fe901e..12ab9895b 100644 --- a/make/scripts/version-info.py +++ b/make/scripts/version-info.py @@ -250,6 +250,40 @@ def xtrim(string, suffix, length): assert n > 0, "length of truncated string+suffix exceeds maximum length" return ''.join([string[:n], '+', suffix]) +def GetHashofDirs(directory, verbose=0): + import hashlib, os + SHAhash = hashlib.sha1() + if not os.path.exists (directory): + return -1 + + try: + for root, dirs, files in os.walk(directory): + for names in files: + if verbose == 1: + print 'Hashing', names + filepath = os.path.join(root,names) + try: + f1 = open(filepath, 'rb') + except: + # You can't open the file for some reason + f1.close() + continue + + while 1: + # Read file in as little chunks + buf = f1.read(4096) + if not buf : break + SHAhash.update(hashlib.sha1(buf).hexdigest()) + f1.close() + + except: + import traceback + # Print the stack traceback + traceback.print_exc() + return -2 + hex_stream = lambda s:",".join(['0x'+hex(ord(c))[2:].zfill(2) for c in s]) + return hex_stream(SHAhash.digest()) + def main(): """This utility uses git repository in the current working directory or from the given path to extract some info about it and HEAD commit. @@ -302,7 +336,8 @@ dependent targets. help='board type, for example, 0x04 for CopterControl'); parser.add_option('--revision', default = "", help='board revision, for example, 0x01'); - + parser.add_option('--uavodir', default = "", + help='uav object definition directory'); (args, positional_args) = parser.parse_args() if len(positional_args) != 0: parser.error("incorrect number of arguments, try --help for help") @@ -328,6 +363,7 @@ dependent targets. BOARD_TYPE = args.type, BOARD_REVISION = args.revision, SHA1 = sha1(args.image), + UAVOSHA1= GetHashofDirs(args.uavodir,0), ) if args.info: diff --git a/make/templates/firmwareinfotemplate.c b/make/templates/firmwareinfotemplate.c index b9297273e..b876b64dd 100644 --- a/make/templates/firmwareinfotemplate.c +++ b/make/templates/firmwareinfotemplate.c @@ -53,7 +53,8 @@ struct __attribute__((packed)) fw_version_info { uint8_t board_revision; uint8_t commit_tag_name[26]; uint8_t sha1sum[20]; - uint8_t pad[40]; + uint8_t uavosha1[20]; + uint8_t pad[20]; }; const struct fw_version_info fw_version_blob __attribute__((used)) __attribute__((__section__(".fw_version_blob"))) = { @@ -64,6 +65,7 @@ const struct fw_version_info fw_version_blob __attribute__((used)) __attribute__ .board_revision = ${BOARD_REVISION}, .commit_tag_name = "${FWTAG}", .sha1sum = { ${SHA1} }, + .uavosha1 = { ${UAVOSHA1} }, }; /** From fa2aa81079769606594e938944890953c5868164 Mon Sep 17 00:00:00 2001 From: PT_Dreamer Date: Sat, 15 Sep 2012 23:02:45 +0100 Subject: [PATCH 03/18] First pass on using the uavo hash to check compatability between GCS and FW --- .../src/plugins/coreplugin/coreconstants.h | 2 ++ .../plugins/uavobjectutil/devicedescriptorstruct.h | 1 + .../plugins/uavobjectutil/uavobjectutilmanager.cpp | 4 +++- .../src/plugins/uploader/uploadergadgetwidget.cpp | 14 ++++++-------- make/templates/gcsversioninfotemplate.h | 2 +- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/coreplugin/coreconstants.h b/ground/openpilotgcs/src/plugins/coreplugin/coreconstants.h index c7a1db3b4..2117843b8 100644 --- a/ground/openpilotgcs/src/plugins/coreplugin/coreconstants.h +++ b/ground/openpilotgcs/src/plugins/coreplugin/coreconstants.h @@ -52,8 +52,10 @@ const char * const GCS_YEAR = "2012"; const char * const GCS_HELP = "http://wiki.openpilot.org"; #ifdef GCS_REVISION const char * const GCS_REVISION_STR = STRINGIFY(GCS_REVISION); +const char * const UAVOSHA1_STR = STRINGIFY(UAVO_HASH); #else const char * const GCS_REVISION_STR = ""; +const char * const UAVOSHA1_STR = ""; #endif #undef GCS_VERSION diff --git a/ground/openpilotgcs/src/plugins/uavobjectutil/devicedescriptorstruct.h b/ground/openpilotgcs/src/plugins/uavobjectutil/devicedescriptorstruct.h index b83a76a15..a2a8bbab7 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectutil/devicedescriptorstruct.h +++ b/ground/openpilotgcs/src/plugins/uavobjectutil/devicedescriptorstruct.h @@ -8,6 +8,7 @@ public: QString gitHash; QString gitDate; QString gitTag; + QString uavoHash; int boardType; int boardRevision; static QString idToBoardName(int id) diff --git a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp index 1c69c63e9..6538b0bfc 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp @@ -641,7 +641,8 @@ bool UAVObjectUtilManager::descriptionToStructure(QByteArray desc, deviceDescrip * 26 bytes: commit tag if it is there, otherwise "Unreleased". Zero-padded * ---- 40 bytes limit --- * 20 bytes: SHA1 sum of the firmware. - * 40 bytes: free for now. + * 20 bytes: SHA1 sum of the UAVO definition files. + * 20 bytes: free for now. */ // Note: the ARM binary is big-endian: @@ -667,6 +668,7 @@ bool UAVObjectUtilManager::descriptionToStructure(QByteArray desc, deviceDescrip struc->boardType = (int)targetPlatform.at(0); struc->boardRevision = (int)targetPlatform.at(1); + struc->uavoHash=desc.mid(46,20); return true; } return false; diff --git a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp index 160944b8b..1d296946e 100755 --- a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp @@ -651,16 +651,14 @@ void UploaderGadgetWidget::versionMatchCheck() UAVObjectUtilManager *utilMngr = pm->getObject(); deviceDescriptorStruct boardDescription = utilMngr->getBoardDescriptionStruct(); - QString gcsDescription = QString::fromLatin1(Core::Constants::GCS_REVISION_STR); - QString gcsGitHash = gcsDescription.mid(gcsDescription.indexOf(":")+1, 8); - gcsGitHash.remove( QRegExp("^[0]*") ); - QString gcsGitDate = gcsDescription.mid(gcsDescription.indexOf(" ")+1, 14); - QString gcsVersion = gcsGitDate + " (" + gcsGitHash + ")"; - QString fwVersion = boardDescription.gitDate + " (" + boardDescription.gitHash + ")"; + QString uavoHash = QString::fromLatin1(Core::Constants::UAVOSHA1_STR); + uavoHash.remove( QRegExp("^[0]*") ); + QString gcsVersion = uavoHash; + QString fwVersion = boardDescription.gitHash; - if (boardDescription.gitHash != gcsGitHash) { + if (boardDescription.uavoHash != uavoHash) { QString warning = QString(tr( - "GCS and firmware versions do not match which can cause configuration problems. " + "GCS and firmware versions of the UAV object set do not match which can cause configuration problems. " "GCS version: %1. Firmware version: %2.")).arg(gcsVersion).arg(fwVersion); msg->showMessage(warning); } diff --git a/make/templates/gcsversioninfotemplate.h b/make/templates/gcsversioninfotemplate.h index 2130f59bf..da8a64968 100644 --- a/make/templates/gcsversioninfotemplate.h +++ b/make/templates/gcsversioninfotemplate.h @@ -26,7 +26,7 @@ */ #define GCS_REVISION ${TAG_OR_BRANCH}:${HASH8}${DIRTY} ${DATETIME} - +#define UAVO_HASH ${UAVOSHA1} /** * @} */ From 524cff1c4083737179ec569f4d8cd1e185577661 Mon Sep 17 00:00:00 2001 From: lilvinz Date: Sun, 16 Sep 2012 21:25:06 +0200 Subject: [PATCH 04/18] pios_mpu6000: fixed masked locals mistake --- flight/PiOS/Common/pios_mpu6000.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/flight/PiOS/Common/pios_mpu6000.c b/flight/PiOS/Common/pios_mpu6000.c index 56e8cccbd..b77a4f6df 100644 --- a/flight/PiOS/Common/pios_mpu6000.c +++ b/flight/PiOS/Common/pios_mpu6000.c @@ -435,9 +435,6 @@ void PIOS_MPU6000_IRQHandler(void) if(PIOS_MPU6000_ClaimBus() != 0) return; - uint8_t mpu6000_send_buf[1+sizeof(struct pios_mpu6000_data)] = {PIOS_MPU6000_FIFO_REG | 0x80, 0, 0, 0, 0, 0, 0, 0, 0}; - uint8_t mpu6000_rec_buf[1+sizeof(struct pios_mpu6000_data)]; - if(PIOS_SPI_TransferBlock(dev->spi_id, &mpu6000_send_buf[0], &mpu6000_rec_buf[0], sizeof(mpu6000_send_buf), NULL) < 0) { PIOS_MPU6000_ReleaseBus(); mpu6000_fails++; From fb073059ad0dd8756e5839cd5972ee75070a1362 Mon Sep 17 00:00:00 2001 From: PT_Dreamer Date: Mon, 17 Sep 2012 17:08:15 +0100 Subject: [PATCH 05/18] GCS-Use uavo definition hash to check for compatability Unfortunately had to change the iap object. --- .../src/plugins/coreplugin/gcsversioninfo.pri | 2 ++ ground/openpilotgcs/src/plugins/plugins.pro | 1 + .../uavobjectutil/devicedescriptorstruct.h | 3 +- .../uavobjectutil/uavobjectutilmanager.cpp | 27 ++++++++++------ .../uavobjectutil/uavobjectutilmanager.h | 2 +- .../src/plugins/uploader/devicewidget.cpp | 4 +-- .../plugins/uploader/runningdevicewidget.cpp | 2 +- .../plugins/uploader/uploadergadgetwidget.cpp | 31 +++++++++++++++---- make/templates/firmwareinfotemplate.c | 3 +- make/templates/gcsversioninfotemplate.h | 2 +- shared/uavobjectdefinition/firmwareiapobj.xml | 2 +- 11 files changed, 55 insertions(+), 24 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/coreplugin/gcsversioninfo.pri b/ground/openpilotgcs/src/plugins/coreplugin/gcsversioninfo.pri index 559dc3528..70bb8e475 100644 --- a/ground/openpilotgcs/src/plugins/coreplugin/gcsversioninfo.pri +++ b/ground/openpilotgcs/src/plugins/coreplugin/gcsversioninfo.pri @@ -12,12 +12,14 @@ VERSION_INFO_SCRIPT = $$ROOT_DIR/make/scripts/version-info.py VERSION_INFO_TEMPLATE = $$ROOT_DIR/make/templates/gcsversioninfotemplate.h VERSION_INFO_COMMAND = python \"$$VERSION_INFO_SCRIPT\" + UAVO_DEF_PATH = $$ROOT_DIR/shared/uavobjectdefinition # Create custom version_info target which generates a header version_info.target = $$VERSION_INFO_HEADER version_info.commands = $$VERSION_INFO_COMMAND \ --path=\"$$GCS_SOURCE_TREE\" \ --template=\"$$VERSION_INFO_TEMPLATE\" \ + --uavodir=\"$$UAVO_DEF_PATH\" \ --outfile=\"$$VERSION_INFO_HEADER\" version_info.depends = FORCE QMAKE_EXTRA_TARGETS += version_info diff --git a/ground/openpilotgcs/src/plugins/plugins.pro b/ground/openpilotgcs/src/plugins/plugins.pro index fcd84239d..f107e24b5 100644 --- a/ground/openpilotgcs/src/plugins/plugins.pro +++ b/ground/openpilotgcs/src/plugins/plugins.pro @@ -92,6 +92,7 @@ plugin_uploader.subdir = uploader plugin_uploader.depends = plugin_coreplugin plugin_uploader.depends += plugin_uavobjects plugin_uploader.depends += plugin_rawhid +plugin_uploader.depends += plugin_uavobjectutil SUBDIRS += plugin_uploader #Dial gadget diff --git a/ground/openpilotgcs/src/plugins/uavobjectutil/devicedescriptorstruct.h b/ground/openpilotgcs/src/plugins/uavobjectutil/devicedescriptorstruct.h index a2a8bbab7..886ebe649 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectutil/devicedescriptorstruct.h +++ b/ground/openpilotgcs/src/plugins/uavobjectutil/devicedescriptorstruct.h @@ -8,7 +8,8 @@ public: QString gitHash; QString gitDate; QString gitTag; - QString uavoHash; + QByteArray fwHash; + QByteArray uavoHash; int boardType; int boardRevision; static QString idToBoardName(int id) diff --git a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp index 6538b0bfc..a5b60e384 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp @@ -257,7 +257,12 @@ FirmwareIAPObj::DataFields UAVObjectUtilManager::getFirmwareIap() int UAVObjectUtilManager::getBoardModel() { FirmwareIAPObj::DataFields firmwareIapData = getFirmwareIap(); - return (firmwareIapData.BoardType << 8) + firmwareIapData.BoardRevision; + qDebug()<<"Board type="<gitHash = QString::number(gitCommitHash, 16); + struc.gitHash = QString::number(gitCommitHash, 16); quint32 gitDate = desc.at(11) & 0xFF; for (int i = 1; i < 4; i++) { gitDate = gitDate << 8; gitDate += desc.at(11-i) & 0xFF; } - struc->gitDate = QDateTime::fromTime_t(gitDate).toUTC().toString("yyyyMMdd HH:mm"); + struc.gitDate = QDateTime::fromTime_t(gitDate).toUTC().toString("yyyyMMdd HH:mm"); QString gitTag = QString(desc.mid(14,26)); - struc->gitTag = gitTag; + struc.gitTag = gitTag; // TODO: check platform compatibility QByteArray targetPlatform = desc.mid(12,2); - struc->boardType = (int)targetPlatform.at(0); - struc->boardRevision = (int)targetPlatform.at(1); - - struc->uavoHash=desc.mid(46,20); + struc.boardType = (int)targetPlatform.at(0); + struc.boardRevision = (int)targetPlatform.at(1); + struc.fwHash.clear(); + struc.fwHash=desc.mid(40,20); + struc.uavoHash.clear(); + struc.uavoHash=desc.mid(60,20); return true; } return false; diff --git a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.h b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.h index 6f71123b8..11f5f0979 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.h +++ b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.h @@ -68,7 +68,7 @@ public: quint32 getFirmwareCRC(); QByteArray getBoardDescription(); deviceDescriptorStruct getBoardDescriptionStruct(); - static bool descriptionToStructure(QByteArray desc,deviceDescriptorStruct * struc); + static bool descriptionToStructure(QByteArray desc,deviceDescriptorStruct & struc); UAVObjectManager* getObjectManager(); void saveObjectToSD(UAVObject *obj); protected: diff --git a/ground/openpilotgcs/src/plugins/uploader/devicewidget.cpp b/ground/openpilotgcs/src/plugins/uploader/devicewidget.cpp index dec1fefb7..c944f9a37 100644 --- a/ground/openpilotgcs/src/plugins/uploader/devicewidget.cpp +++ b/ground/openpilotgcs/src/plugins/uploader/devicewidget.cpp @@ -154,7 +154,7 @@ void deviceWidget::freeze() */ bool deviceWidget::populateBoardStructuredDescription(QByteArray desc) { - if(UAVObjectUtilManager::descriptionToStructure(desc,&onBoardDescription)) + if(UAVObjectUtilManager::descriptionToStructure(desc,onBoardDescription)) { myDevice->lblGitTag->setText(onBoardDescription.gitHash); myDevice->lblBuildDate->setText(onBoardDescription.gitDate.insert(4,"-").insert(7,"-")); @@ -184,7 +184,7 @@ bool deviceWidget::populateBoardStructuredDescription(QByteArray desc) } bool deviceWidget::populateLoadedStructuredDescription(QByteArray desc) { - if(UAVObjectUtilManager::descriptionToStructure(desc,&LoadedDescription)) + if(UAVObjectUtilManager::descriptionToStructure(desc,LoadedDescription)) { myDevice->lblGitTagL->setText(LoadedDescription.gitHash); myDevice->lblBuildDateL->setText( LoadedDescription.gitDate.insert(4,"-").insert(7,"-")); diff --git a/ground/openpilotgcs/src/plugins/uploader/runningdevicewidget.cpp b/ground/openpilotgcs/src/plugins/uploader/runningdevicewidget.cpp index 40be848e7..284345b62 100644 --- a/ground/openpilotgcs/src/plugins/uploader/runningdevicewidget.cpp +++ b/ground/openpilotgcs/src/plugins/uploader/runningdevicewidget.cpp @@ -101,7 +101,7 @@ void runningDeviceWidget::populate() QByteArray description = utilMngr->getBoardDescription(); deviceDescriptorStruct devDesc; - if(UAVObjectUtilManager::descriptionToStructure(description,&devDesc)) + if(UAVObjectUtilManager::descriptionToStructure(description,devDesc)) { if(devDesc.gitTag.startsWith("release",Qt::CaseInsensitive)) { diff --git a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp index 1d296946e..afcb32669 100755 --- a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp @@ -650,16 +650,35 @@ void UploaderGadgetWidget::versionMatchCheck() ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); UAVObjectUtilManager *utilMngr = pm->getObject(); deviceDescriptorStruct boardDescription = utilMngr->getBoardDescriptionStruct(); - + QByteArray uavoHashArray; QString uavoHash = QString::fromLatin1(Core::Constants::UAVOSHA1_STR); - uavoHash.remove( QRegExp("^[0]*") ); - QString gcsVersion = uavoHash; - QString fwVersion = boardDescription.gitHash; + uavoHash.chop(2); + uavoHash.remove(0,2); + uavoHash=uavoHash.trimmed(); + bool ok; + foreach(QString str,uavoHash.split(",")) + { + uavoHashArray.append(str.toInt(&ok,16)); + } - if (boardDescription.uavoHash != uavoHash) { + QByteArray fwVersion; + fwVersion=boardDescription.uavoHash; + if (fwVersion != uavoHashArray) { + QString uavoHashStr; + QString fwVersionStr; + foreach(char i, fwVersion) + { + qDebug()<showMessage(warning); } } diff --git a/make/templates/firmwareinfotemplate.c b/make/templates/firmwareinfotemplate.c index b876b64dd..0f0e22978 100644 --- a/make/templates/firmwareinfotemplate.c +++ b/make/templates/firmwareinfotemplate.c @@ -41,7 +41,8 @@ * 26 bytes: commit tag if it is there, otherwise branch name. '-dirty' may be added if needed. Zero-padded. * ---- 40 bytes limit --- * 20 bytes: SHA1 sum of the firmware. - * 40 bytes: free for now. + * 20 bytes: SHA1 sum of the uavo definitions. + * 20 bytes: free for now. * */ diff --git a/make/templates/gcsversioninfotemplate.h b/make/templates/gcsversioninfotemplate.h index da8a64968..7b7dc8100 100644 --- a/make/templates/gcsversioninfotemplate.h +++ b/make/templates/gcsversioninfotemplate.h @@ -26,7 +26,7 @@ */ #define GCS_REVISION ${TAG_OR_BRANCH}:${HASH8}${DIRTY} ${DATETIME} -#define UAVO_HASH ${UAVOSHA1} +#define UAVO_HASH "{ ${UAVOSHA1} }" /** * @} */ diff --git a/shared/uavobjectdefinition/firmwareiapobj.xml b/shared/uavobjectdefinition/firmwareiapobj.xml index be8431ef5..9ce85bfcf 100644 --- a/shared/uavobjectdefinition/firmwareiapobj.xml +++ b/shared/uavobjectdefinition/firmwareiapobj.xml @@ -2,7 +2,7 @@ Queries board for SN, model, revision, and sends reset command - + From 0d3013857121f0942e1a1077fd04faed1c3b8fc7 Mon Sep 17 00:00:00 2001 From: PT_Dreamer Date: Tue, 18 Sep 2012 13:51:44 +0100 Subject: [PATCH 06/18] GCS-Reduced UAVO hash bytes displayed from 20 to 8 --- .../plugins/uploader/uploadergadgetwidget.cpp | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp index afcb32669..5085d1afd 100755 --- a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp @@ -661,24 +661,30 @@ void UploaderGadgetWidget::versionMatchCheck() uavoHashArray.append(str.toInt(&ok,16)); } - QByteArray fwVersion; - fwVersion=boardDescription.uavoHash; + QByteArray fwVersion=boardDescription.uavoHash; if (fwVersion != uavoHashArray) { - QString uavoHashStr; - QString fwVersionStr; + + QString gcsDescription = QString::fromLatin1(Core::Constants::GCS_REVISION_STR); + QString gcsGitHash = gcsDescription.mid(gcsDescription.indexOf(":")+1, 8); + gcsGitHash.remove( QRegExp("^[0]*") ); + QString gcsGitDate = gcsDescription.mid(gcsDescription.indexOf(" ")+1, 14); + + QString gcsUavoHashStr; + QString fwUavoHashStr; foreach(char i, fwVersion) { - qDebug()<showMessage(warning); } } From 6b2d1e3d6fde91632b64ea41dc51f72902d96bb2 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sun, 23 Sep 2012 20:45:06 -0400 Subject: [PATCH 07/18] uavo hash: ensure that uavo hash is stable across OSes In python, os.walk() is not sorted. This can result in the hash being computed over the files in different orders on different OSes, or even after touching a directory. This ensures that the files are considered in lexical order so that the hash is stable. --- make/scripts/version-info.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/make/scripts/version-info.py b/make/scripts/version-info.py index 12ab9895b..2f742962b 100644 --- a/make/scripts/version-info.py +++ b/make/scripts/version-info.py @@ -258,6 +258,11 @@ def GetHashofDirs(directory, verbose=0): try: for root, dirs, files in os.walk(directory): + # os.walk() is unsorted. Must make sure we process files in sorted order so + # that the hash is stable across invocations and across OSes. + if files: + files.sort() + for names in files: if verbose == 1: print 'Hashing', names @@ -269,18 +274,30 @@ def GetHashofDirs(directory, verbose=0): f1.close() continue - while 1: - # Read file in as little chunks - buf = f1.read(4096) - if not buf : break - SHAhash.update(hashlib.sha1(buf).hexdigest()) + # Compute file hash. Same as running "sha1sum ". + f1hash = hashlib.sha1() + while 1: + # Read file in as little chunks + buf = f1.read(4096) + if not buf : break + f1hash.update(buf) f1.close() + if verbose == 1: + print 'Hash is', f1hash.hexdigest() + + # Append the hex representation of the current file's hash into the cumulative hash + SHAhash.update(f1hash.hexdigest()) + except: import traceback # Print the stack traceback traceback.print_exc() return -2 + + if verbose == 1: + print 'Final hash is', SHAhash.hexdigest() + hex_stream = lambda s:",".join(['0x'+hex(ord(c))[2:].zfill(2) for c in s]) return hex_stream(SHAhash.digest()) From c056ac52611153df288997377c04a5e63f7217d1 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 24 Sep 2012 00:53:12 -0400 Subject: [PATCH 08/18] usbcdc: don't assert on calls when CDC is not initialized The CDC interface is always advertised in the FW USB descriptors. It is NOT always enabled/initialized at runtime. Specifically, it can be Disabled in HwSettings. Previously, any CDC-related query that the host would send resulted in an assert and a watchdog. Now, a suitable return code indicating that the request is unsupported is returned in this scenario. --- flight/PiOS/STM32F10x/pios_usb_cdc.c | 15 ++++++++++++--- flight/PiOS/STM32F10x/pios_usbhook.c | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/flight/PiOS/STM32F10x/pios_usb_cdc.c b/flight/PiOS/STM32F10x/pios_usb_cdc.c index 7a9bc0b23..db142670f 100644 --- a/flight/PiOS/STM32F10x/pios_usb_cdc.c +++ b/flight/PiOS/STM32F10x/pios_usb_cdc.c @@ -321,7 +321,10 @@ RESULT PIOS_USB_CDC_SetControlLineState(void) struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)pios_usb_cdc_id; bool valid = PIOS_USB_CDC_validate(usb_cdc_dev); - PIOS_Assert(valid); + if (!valid) { + /* No CDC interface is configured */ + return USB_UNSUPPORT; + } uint8_t wValue0 = pInformation->USBwValue0; uint8_t wValue1 = pInformation->USBwValue1; @@ -343,7 +346,10 @@ RESULT PIOS_USB_CDC_SetLineCoding(void) struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)pios_usb_cdc_id; bool valid = PIOS_USB_CDC_validate(usb_cdc_dev); - PIOS_Assert(valid); + if (!valid) { + /* No CDC interface is configured */ + return NULL; + } return USB_SUCCESS; } @@ -353,7 +359,10 @@ const uint8_t *PIOS_USB_CDC_GetLineCoding(uint16_t Length) struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)pios_usb_cdc_id; bool valid = PIOS_USB_CDC_validate(usb_cdc_dev); - PIOS_Assert(valid); + if (!valid) { + /* No CDC interface is configured */ + return NULL; + } if (Length == 0) { pInformation->Ctrl_Info.Usb_wLength = sizeof(line_coding); diff --git a/flight/PiOS/STM32F10x/pios_usbhook.c b/flight/PiOS/STM32F10x/pios_usbhook.c index cb3220227..65af85849 100644 --- a/flight/PiOS/STM32F10x/pios_usbhook.c +++ b/flight/PiOS/STM32F10x/pios_usbhook.c @@ -341,7 +341,7 @@ static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo) case 0: /* CDC Call Control Interface */ switch (RequestNo) { case USB_CDC_REQ_GET_LINE_CODING: - //CopyRoutine = PIOS_USB_CDC_GetLineCoding; + CopyInRoutine = PIOS_USB_CDC_GetLineCoding; break; } From 5e374488145b2b949f993563c6381286a6aacc5a Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 24 Sep 2012 00:53:52 -0400 Subject: [PATCH 09/18] usb: correct enum for CDC SET_CONTROL_LINE_STATE request --- flight/PiOS/inc/pios_usb_defs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flight/PiOS/inc/pios_usb_defs.h b/flight/PiOS/inc/pios_usb_defs.h index ea54306a7..ebe7f1f31 100644 --- a/flight/PiOS/inc/pios_usb_defs.h +++ b/flight/PiOS/inc/pios_usb_defs.h @@ -267,7 +267,7 @@ enum usb_cdc_requests { USB_CDC_REQ_SET_LINE_CODING = 0x20, USB_CDC_REQ_GET_LINE_CODING = 0x21, - USB_CDC_REQ_SET_CONTROL_LINE_STATE = 0x23, + USB_CDC_REQ_SET_CONTROL_LINE_STATE = 0x22, }; struct usb_cdc_header_func_desc { From 215ff56fe8feb36b4e4e70c8a2395b8a7047933f Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 24 Sep 2012 00:56:25 -0400 Subject: [PATCH 10/18] usbcdc: fix handling of CDC SET_LINE_CODING request The SET_LINE_CODING request contains data and must be handled as such. Previously, the only requests that had data were IN requests. SET_LINE_CODING is an OUT request so it required additional changes to support a new type of data request. --- flight/PiOS/STM32F10x/pios_usb_cdc.c | 12 ++++++-- flight/PiOS/STM32F10x/pios_usbhook.c | 42 +++++++++++++++++++--------- 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/flight/PiOS/STM32F10x/pios_usb_cdc.c b/flight/PiOS/STM32F10x/pios_usb_cdc.c index db142670f..22d422077 100644 --- a/flight/PiOS/STM32F10x/pios_usb_cdc.c +++ b/flight/PiOS/STM32F10x/pios_usb_cdc.c @@ -341,7 +341,7 @@ static struct usb_cdc_line_coding line_coding = { .bDataBits = 8, }; -RESULT PIOS_USB_CDC_SetLineCoding(void) +uint8_t *PIOS_USB_CDC_SetLineCoding(uint16_t Length) { struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)pios_usb_cdc_id; @@ -351,7 +351,15 @@ RESULT PIOS_USB_CDC_SetLineCoding(void) return NULL; } - return USB_SUCCESS; + if (Length == 0) { + /* Report the number of bytes we're prepared to consume */ + pInformation->Ctrl_Info.Usb_wLength = sizeof(line_coding); + pInformation->Ctrl_Info.Usb_rLength = sizeof(line_coding); + return NULL; + } else { + /* Give out a pointer to the data struct */ + return ((uint8_t *) &line_coding); + } } const uint8_t *PIOS_USB_CDC_GetLineCoding(uint16_t Length) diff --git a/flight/PiOS/STM32F10x/pios_usbhook.c b/flight/PiOS/STM32F10x/pios_usbhook.c index 65af85849..a691d8447 100644 --- a/flight/PiOS/STM32F10x/pios_usbhook.c +++ b/flight/PiOS/STM32F10x/pios_usbhook.c @@ -293,13 +293,16 @@ static void PIOS_USBHOOK_Status_Out(void) * Output : None. * Return : USB_UNSUPPORT or USB_SUCCESS. *******************************************************************************/ +extern uint8_t *PIOS_USB_CDC_SetLineCoding(uint16_t Length); extern const uint8_t *PIOS_USB_CDC_GetLineCoding(uint16_t Length); static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo) { - const uint8_t *(*CopyRoutine) (uint16_t); + uint8_t *(*CopyOutRoutine) (uint16_t); + const uint8_t *(*CopyInRoutine) (uint16_t); - CopyRoutine = NULL; + CopyInRoutine = NULL; + CopyOutRoutine = NULL; switch (Type_Recipient) { case (STANDARD_REQUEST | INTERFACE_RECIPIENT): @@ -313,10 +316,10 @@ static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo) case GET_DESCRIPTOR: switch (pInformation->USBwValue1) { case USB_DESC_TYPE_REPORT: - CopyRoutine = PIOS_USBHOOK_GetReportDescriptor; + CopyInRoutine = PIOS_USBHOOK_GetReportDescriptor; break; case USB_DESC_TYPE_HID: - CopyRoutine = PIOS_USBHOOK_GetHIDDescriptor; + CopyInRoutine = PIOS_USBHOOK_GetHIDDescriptor; break; } } @@ -332,7 +335,7 @@ static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo) #endif switch (RequestNo) { case USB_HID_REQ_GET_PROTOCOL: - CopyRoutine = PIOS_USBHOOK_GetProtocolValue; + CopyInRoutine = PIOS_USBHOOK_GetProtocolValue; break; } @@ -340,6 +343,9 @@ static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo) #if defined(PIOS_INCLUDE_USB_CDC) case 0: /* CDC Call Control Interface */ switch (RequestNo) { + case USB_CDC_REQ_SET_LINE_CODING: + CopyOutRoutine = PIOS_USB_CDC_SetLineCoding; + break; case USB_CDC_REQ_GET_LINE_CODING: CopyInRoutine = PIOS_USB_CDC_GetLineCoding; break; @@ -359,13 +365,27 @@ static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo) break; } - if (CopyRoutine == NULL) { + /* No registered copy routine */ + if ((CopyInRoutine == NULL) && (CopyOutRoutine == NULL)) { return USB_UNSUPPORT; } - pInformation->Ctrl_Info.CopyDataIn = CopyRoutine; - pInformation->Ctrl_Info.Usb_wOffset = 0; - (*CopyRoutine) (0); + /* Registered copy in AND copy out routine */ + if ((CopyInRoutine != NULL) && (CopyOutRoutine != NULL)) { + /* This should never happen */ + return USB_UNSUPPORT; + } + + if (CopyInRoutine != NULL) { + pInformation->Ctrl_Info.CopyDataIn = CopyInRoutine; + pInformation->Ctrl_Info.Usb_wOffset = 0; + (*CopyInRoutine) (0); + } else if (CopyOutRoutine != NULL) { + pInformation->Ctrl_Info.CopyDataOut = CopyOutRoutine; + pInformation->Ctrl_Info.Usb_rOffset = 0; + (*CopyOutRoutine) (0); + } + return USB_SUCCESS; } @@ -377,7 +397,6 @@ static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo) * Return : USB_UNSUPPORT or USB_SUCCESS. *******************************************************************************/ extern RESULT PIOS_USB_CDC_SetControlLineState(void); -extern RESULT PIOS_USB_CDC_SetLineCoding(void); static RESULT PIOS_USBHOOK_NoData_Setup(uint8_t RequestNo) { @@ -400,9 +419,6 @@ static RESULT PIOS_USBHOOK_NoData_Setup(uint8_t RequestNo) #if defined(PIOS_INCLUDE_USB_CDC) case 0: /* CDC Call Control Interface */ switch (RequestNo) { - case USB_CDC_REQ_SET_LINE_CODING: - return PIOS_USB_CDC_SetLineCoding(); - break; case USB_CDC_REQ_SET_CONTROL_LINE_STATE: return PIOS_USB_CDC_SetControlLineState(); break; From 4e08fa548fdfd8398590ee517d353e6458119557 Mon Sep 17 00:00:00 2001 From: PT_Dreamer Date: Mon, 24 Sep 2012 11:50:15 +0100 Subject: [PATCH 11/18] GCS/Uploader- Added leading zeros to git hash --- .../src/plugins/uavobjectutil/uavobjectutilmanager.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp index a5b60e384..d68a87d59 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp @@ -644,7 +644,6 @@ bool UAVObjectUtilManager::descriptionToStructure(QByteArray desc, deviceDescrip * 4 bytes: Unix timestamp of last git commit * 2 bytes: target platform. Should follow same rule as BOARD_TYPE and BOARD_REVISION in board define files. * 26 bytes: commit tag if it is there, otherwise "Unreleased". Zero-padded - * ---- 40 bytes limit --- * 20 bytes: SHA1 sum of the firmware. * 20 bytes: SHA1 sum of the UAVO definition files. * 20 bytes: free for now. @@ -656,7 +655,7 @@ bool UAVObjectUtilManager::descriptionToStructure(QByteArray desc, deviceDescrip gitCommitHash = gitCommitHash << 8; gitCommitHash += desc.at(7-i) & 0xFF; } - struc.gitHash = QString::number(gitCommitHash, 16); + struc.gitHash = QString("%1").arg(gitCommitHash, 8, 16, QChar('0')); quint32 gitDate = desc.at(11) & 0xFF; for (int i = 1; i < 4; i++) { From c8de27cbaf05a93d69c5bf4a9dd1b52769062208 Mon Sep 17 00:00:00 2001 From: PT_Dreamer Date: Mon, 24 Sep 2012 12:17:32 +0100 Subject: [PATCH 12/18] GCS/Uploader Changes acording to review Changed template comments. Added UAVO hash to the GCS help dialog --- .../src/plugins/coreplugin/versiondialog.cpp | 24 ++++++++++++++++++- .../plugins/uploader/uploadergadgetwidget.cpp | 2 +- make/templates/firmwareinfotemplate.c | 3 --- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/coreplugin/versiondialog.cpp b/ground/openpilotgcs/src/plugins/coreplugin/versiondialog.cpp index 1fbb3b1b9..70a125d3b 100644 --- a/ground/openpilotgcs/src/plugins/coreplugin/versiondialog.cpp +++ b/ground/openpilotgcs/src/plugins/coreplugin/versiondialog.cpp @@ -67,6 +67,26 @@ VersionDialog::VersionDialog(QWidget *parent) //: This gets conditionally inserted as argument %8 into the description string. ideRev = tr("From revision %1
").arg(QString::fromLatin1(GCS_REVISION_STR).left(60)); #endif + QString uavoHashStr; + #ifdef UAVO_HASH + //: This gets conditionally inserted as argument %11 into the description string. + QByteArray uavoHashArray; + QString uavoHash = QString::fromLatin1(Core::Constants::UAVOSHA1_STR); + uavoHash.chop(2); + uavoHash.remove(0,2); + uavoHash=uavoHash.trimmed(); + bool ok; + foreach(QString str,uavoHash.split(",")) + { + uavoHashArray.append(str.toInt(&ok,16)); + } + QString gcsUavoHashStr; + foreach(char i, uavoHashArray) + { + gcsUavoHashStr.append(QString::number(i,16).right(2)); + } + uavoHashStr = tr("UAVO hash %1
").arg(gcsUavoHashStr); + #endif const QString description = tr( "

OpenPilot GCS %1 %9 (%10)

" @@ -76,6 +96,8 @@ VersionDialog::VersionDialog(QWidget *parent) "
" "%8" "
" + "%11" + "
" "Copyright 2010-%6 %7. All rights reserved.
" "
" "This program is free software; you can redistribute it and/or modify
" @@ -87,7 +109,7 @@ VersionDialog::VersionDialog(QWidget *parent) "PARTICULAR PURPOSE.

") .arg(version, QLatin1String(QT_VERSION_STR), QString::number(QSysInfo::WordSize), QLatin1String(__DATE__), QLatin1String(__TIME__), QLatin1String(GCS_YEAR), - (QLatin1String(GCS_AUTHOR)), ideRev).arg(QLatin1String(GCS_VERSION_TYPE), QLatin1String(GCS_VERSION_CODENAME)); + (QLatin1String(GCS_AUTHOR)), ideRev).arg(QLatin1String(GCS_VERSION_TYPE), QLatin1String(GCS_VERSION_CODENAME), uavoHashStr); QLabel *copyRightLabel = new QLabel(description); copyRightLabel->setWordWrap(true); diff --git a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp index 5085d1afd..314914667 100755 --- a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp @@ -684,7 +684,7 @@ void UploaderGadgetWidget::versionMatchCheck() QString warning = QString(tr( "GCS and firmware versions of the UAV objects set do not match which can cause configuration problems. " - "GCS version: %1. Firmware version: %2.")).arg(gcsVersion).arg(fwVersion); + "GCS version: %1 Firmware version: %2.")).arg(gcsVersion).arg(fwVersion); msg->showMessage(warning); } } diff --git a/make/templates/firmwareinfotemplate.c b/make/templates/firmwareinfotemplate.c index 0f0e22978..6e4fbf8b3 100644 --- a/make/templates/firmwareinfotemplate.c +++ b/make/templates/firmwareinfotemplate.c @@ -30,8 +30,6 @@ /** * We have 100 bytes for the whole description. * - * Only the first 40 are visible on the FirmwareIAP uavobject, the remaining - * 60 are ok to use for packaging and will be saved in the flash. * * Structure is: * 4 bytes: header: "OpFw". @@ -39,7 +37,6 @@ * 4 bytes: Unix timestamp of compile time. * 2 bytes: target platform. Should follow same rule as BOARD_TYPE and BOARD_REVISION in board define files. * 26 bytes: commit tag if it is there, otherwise branch name. '-dirty' may be added if needed. Zero-padded. - * ---- 40 bytes limit --- * 20 bytes: SHA1 sum of the firmware. * 20 bytes: SHA1 sum of the uavo definitions. * 20 bytes: free for now. From 7d8c61d33dfe1c23451f464785f4a8933c1a722e Mon Sep 17 00:00:00 2001 From: James Cotton Date: Tue, 25 Sep 2012 13:19:18 -0500 Subject: [PATCH 13/18] OSGEarth: Remove reference to caching. Uses old API. --- ground/openpilotgcs/src/plugins/pfdqml/osgearth.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/pfdqml/osgearth.cpp b/ground/openpilotgcs/src/plugins/pfdqml/osgearth.cpp index ce8880ad9..a14fca75e 100644 --- a/ground/openpilotgcs/src/plugins/pfdqml/osgearth.cpp +++ b/ground/openpilotgcs/src/plugins/pfdqml/osgearth.cpp @@ -281,15 +281,7 @@ void OsgEarthItemRenderer::initScene() //setup caching osgEarth::MapNode *mapNode = osgEarth::MapNode::findMapNode(m_model.get()); - if (mapNode) { - osgEarth::TMSCacheOptions cacheOptions; - //cacheOptions.cacheOnly() = true; - QString cacheDir = Utils::PathUtils().GetStoragePath()+QLatin1String("osgEarth_cache"); - cacheOptions.setPath(cacheDir.toStdString()); - osgEarth::Cache *cache= new osgEarth::TMSCache(cacheOptions); - - mapNode->getMap()->setCache(cache); - } else { + if (!mapNode) { qWarning() << Q_FUNC_INFO << sceneFile << " doesn't look like an osgEarth file"; } From f77df97699ea13769681d2bb271f27fb103efb05 Mon Sep 17 00:00:00 2001 From: James Cotton Date: Tue, 25 Sep 2012 13:24:08 -0500 Subject: [PATCH 14/18] OSGEarth: Remove function definition without implementation. --- ground/openpilotgcs/src/plugins/pfdqml/osgearth.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/pfdqml/osgearth.h b/ground/openpilotgcs/src/plugins/pfdqml/osgearth.h index 8d0d3f6fe..03f0543a1 100644 --- a/ground/openpilotgcs/src/plugins/pfdqml/osgearth.h +++ b/ground/openpilotgcs/src/plugins/pfdqml/osgearth.h @@ -126,9 +126,6 @@ public slots: signals: void frameReady(); -private slots: - void updateFBO(); - private: enum { FboCount = 3 }; OsgEarthItem *m_item; From f532f3cda58be755d6da2bc8cf80203929b6e61e Mon Sep 17 00:00:00 2001 From: Laura Sebesta Date: Thu, 27 Sep 2012 11:45:59 +0200 Subject: [PATCH 15/18] Rewrote uavobjectutilmanager.cpp, such that upon UAVO changes it returns com Updated homelocationutil to remove references to ECEF and RNE. --- .../src/libs/utils/homelocationutil.cpp | 52 +-- .../src/libs/utils/homelocationutil.h | 2 +- .../src/plugins/opmap/opmapgadgetwidget.cpp | 2 +- .../uavobjectutil/uavobjectutilmanager.cpp | 379 +++++++----------- .../uavobjectutil/uavobjectutilmanager.h | 22 +- 5 files changed, 187 insertions(+), 270 deletions(-) diff --git a/ground/openpilotgcs/src/libs/utils/homelocationutil.cpp b/ground/openpilotgcs/src/libs/utils/homelocationutil.cpp index 18b1fd9af..4700bdb5c 100644 --- a/ground/openpilotgcs/src/libs/utils/homelocationutil.cpp +++ b/ground/openpilotgcs/src/libs/utils/homelocationutil.cpp @@ -38,40 +38,40 @@ namespace Utils { - HomeLocationUtil::HomeLocationUtil() +HomeLocationUtil::HomeLocationUtil() +{ + // Initialize(); +} + +/* + /*Get world magnetic model + * input params: LLA + * output params: Be + */ + int HomeLocationUtil::getDetails(double LLA[3], double Be[3]) { -// Initialize(); - } + // ************* + // check input parms - // input params: LLA - // - // output params: ECEF, RNE and Be - int HomeLocationUtil::getDetails(double LLA[3], double ECEF[3], double RNE[9], double Be[3]) - { - // ************* - // check input parms + double latitude = LLA[0]; + double longitude = LLA[1]; + double altitude = LLA[2]; - double latitude = LLA[0]; - double longitude = LLA[1]; - double altitude = LLA[2]; + if (latitude != latitude) return -1; // prevent nan error + if (longitude != longitude) return -2; // prevent nan error + if (altitude != altitude) return -3; // prevent nan error - if (latitude != latitude) return -1; // prevent nan error - if (longitude != longitude) return -2; // prevent nan error - if (altitude != altitude) return -3; // prevent nan error + if (latitude < -90 || latitude > 90) return -4; // range checking + if (longitude < -180 || longitude > 180) return -5; // range checking - if (latitude < -90 || latitude > 90) return -4; // range checking - if (longitude < -180 || longitude > 180) return -5; // range checking + // ************* - // ************* + QDateTime dt = QDateTime::currentDateTime().toUTC(); - QDateTime dt = QDateTime::currentDateTime().toUTC(); + //Fetch world magnetic model + Q_ASSERT(WorldMagModel().GetMagVector(LLA, dt.date().month(), dt.date().day(), dt.date().year(), Be) >= 0); - CoordinateConversions().LLA2ECEF(LLA, ECEF); - CoordinateConversions().RneFromLLA(LLA, (double (*)[3])RNE); - if (WorldMagModel().GetMagVector(LLA, dt.date().month(), dt.date().day(), dt.date().year(), Be) < 0) - return -6; - - return 0; // OK + return 0; // OK } } diff --git a/ground/openpilotgcs/src/libs/utils/homelocationutil.h b/ground/openpilotgcs/src/libs/utils/homelocationutil.h index 6448c3e52..acfc43888 100644 --- a/ground/openpilotgcs/src/libs/utils/homelocationutil.h +++ b/ground/openpilotgcs/src/libs/utils/homelocationutil.h @@ -40,7 +40,7 @@ namespace Utils { public: HomeLocationUtil(); - int getDetails(double LLA[3], double ECEF[3], double RNE[9], double Be[3]); + int getDetails(double LLA[3], double Be[3]); private: diff --git a/ground/openpilotgcs/src/plugins/opmap/opmapgadgetwidget.cpp b/ground/openpilotgcs/src/plugins/opmap/opmapgadgetwidget.cpp index 2d8e01506..9cb7a7cc6 100644 --- a/ground/openpilotgcs/src/plugins/opmap/opmapgadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/opmap/opmapgadgetwidget.cpp @@ -46,7 +46,6 @@ #include "uavtalk/telemetrymanager.h" #include "uavobject.h" -#include "uavobjectmanager.h" #include "positionactual.h" #include "homelocation.h" @@ -590,6 +589,7 @@ void OPMapGadgetWidget::updatePosition() VelocityActual *velocityActualObj = VelocityActual::GetInstance(obm); Gyros *gyrosObj = Gyros::GetInstance(obm); + Q_ASSERT(attitudeActualObj); Q_ASSERT(positionActualObj); Q_ASSERT(velocityActualObj); Q_ASSERT(gyrosObj); diff --git a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp index d68a87d59..70e766823 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp @@ -35,7 +35,10 @@ #include #include #include -#include + +#include "firmwareiapobj.h" +#include "homelocation.h" +#include "gpsposition.h" // ****************************** // constructor/destructor @@ -48,6 +51,18 @@ UAVObjectUtilManager::UAVObjectUtilManager() failureTimer.setSingleShot(true); failureTimer.setInterval(1000); connect(&failureTimer, SIGNAL(timeout()),this,SLOT(objectPersistenceOperationFailed())); + + pm = NULL; + obm = NULL; + obum = NULL; + + pm = ExtensionSystem::PluginManager::instance(); + if (pm) + { + obm = pm->getObject(); + obum = pm->getObject(); + } + } UAVObjectUtilManager::~UAVObjectUtilManager() @@ -67,10 +82,8 @@ UAVObjectUtilManager::~UAVObjectUtilManager() UAVObjectManager* UAVObjectUtilManager::getObjectManager() { - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager * objMngr = pm->getObject(); - Q_ASSERT(objMngr); - return objMngr; + Q_ASSERT(obm); + return obm; } @@ -233,16 +246,7 @@ FirmwareIAPObj::DataFields UAVObjectUtilManager::getFirmwareIap() { FirmwareIAPObj::DataFields dummy; - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - Q_ASSERT(pm); - if (!pm) - return dummy; - UAVObjectManager *om = pm->getObject(); - Q_ASSERT(om); - if (!om) - return dummy; - - FirmwareIAPObj *firmwareIap = FirmwareIAPObj::GetInstance(om); + FirmwareIAPObj *firmwareIap = FirmwareIAPObj::GetInstance(obm); Q_ASSERT(firmwareIap); if (!firmwareIap) return dummy; @@ -306,121 +310,48 @@ QByteArray UAVObjectUtilManager::getBoardDescription() int UAVObjectUtilManager::setHomeLocation(double LLA[3], bool save_to_sdcard) { - double ECEF[3]; - double RNE[9]; - double Be[3]; - UAVObjectField *field; + double Be[3]; - QMutexLocker locker(mutex); + Q_ASSERT (Utils::HomeLocationUtil().getDetails(LLA, Be) >= 0); - if (Utils::HomeLocationUtil().getDetails(LLA, ECEF, RNE, Be) < 0) - return -1; // error + // ****************** + // save the new settings - // ****************** - // save the new settings + HomeLocation *homeLocation = HomeLocation::GetInstance(obm); + Q_ASSERT(homeLocation != NULL); - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - if (!pm) return -2; + HomeLocation::DataFields homeLocationData = homeLocation->getData(); + homeLocationData.Latitude = LLA[0] * 1e7; + homeLocationData.Longitude = LLA[1] * 1e7; + homeLocationData.Altitude = LLA[2] * 1e7; - UAVObjectManager *om = pm->getObject(); - if (!om) return -3; + homeLocationData.Be[0] = Be[0]; + homeLocationData.Be[1] = Be[1]; + homeLocationData.Be[2] = Be[2]; - UAVDataObject *obj = dynamic_cast(om->getObject(QString("HomeLocation"))); - if (!obj) return -4; + homeLocationData.Set = HomeLocation::SET_TRUE; - UAVObjectField *ECEF_field = obj->getField(QString("ECEF")); - if (!ECEF_field) return -5; + homeLocation->setData(homeLocationData); + homeLocation->updated(); - UAVObjectField *RNE_field = obj->getField(QString("RNE")); - if (!RNE_field) return -6; + if (save_to_sdcard) + saveObjectToSD(homeLocation); - UAVObjectField *Be_field = obj->getField(QString("Be")); - if (!Be_field) return -7; - - field = obj->getField("Latitude"); - if (!field) return -8; - field->setDouble(LLA[0] * 10e6); - - field = obj->getField("Longitude"); - if (!field) return -9; - field->setDouble(LLA[1] * 10e6); - - field = obj->getField("Altitude"); - if (!field) return -10; - field->setDouble(LLA[2]); - - for (int i = 0; i < 3; i++) - ECEF_field->setDouble(ECEF[i] * 100, i); - - for (int i = 0; i < 9; i++) - RNE_field->setDouble(RNE[i], i); - - for (int i = 0; i < 3; i++) - Be_field->setDouble(Be[i], i); - - field = obj->getField("Set"); - if (!field) return -11; - field->setValue("TRUE"); - - obj->updated(); - - // ****************** - // save the new setting to SD card - - if (save_to_sdcard) - saveObjectToSD(obj); - - // ****************** - // debug -/* - qDebug() << "setting HomeLocation UAV Object .. " << endl; - QString s; - s = " LAT:" + QString::number(LLA[0], 'f', 7) + " LON:" + QString::number(LLA[1], 'f', 7) + " ALT:" + QString::number(LLA[2], 'f', 1); - qDebug() << s << endl; - s = " ECEF "; for (int i = 0; i < 3; i++) s += " " + QString::number((int)(ECEF[i] * 100)); - qDebug() << s << endl; - s = " RNE "; for (int i = 0; i < 9; i++) s += " " + QString::number(RNE[i], 'f', 7); - qDebug() << s << endl; - s = " Be "; for (int i = 0; i < 3; i++) s += " " + QString::number(Be[i], 'f', 2); - qDebug() << s << endl; -*/ - // ****************** - - return 0; // OK + return 0; } int UAVObjectUtilManager::getHomeLocation(bool &set, double LLA[3]) { - UAVObjectField *field; + HomeLocation *homeLocation = HomeLocation::GetInstance(obm); + Q_ASSERT(homeLocation != NULL); - QMutexLocker locker(mutex); + HomeLocation::DataFields homeLocationData = homeLocation->getData(); - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - if (!pm) return -1; + set = homeLocationData.Set; - UAVObjectManager *om = pm->getObject(); - if (!om) return -2; - - UAVDataObject *obj = dynamic_cast(om->getObject(QString("HomeLocation"))); - if (!obj) return -3; - -// obj->requestUpdate(); - - field = obj->getField("Set"); - if (!field) return -4; - set = field->getValue().toBool(); - - field = obj->getField("Latitude"); - if (!field) return -5; - LLA[0] = field->getDouble() * 1e-7; - - field = obj->getField("Longitude"); - if (!field) return -6; - LLA[1] = field->getDouble() * 1e-7; - - field = obj->getField("Altitude"); - if (!field) return -7; - LLA[2] = field->getDouble(); + LLA[0] = homeLocationData.Latitude; + LLA[1] = homeLocationData.Longitude; + LLA[2] = homeLocationData.Altitude; if (LLA[0] != LLA[0]) LLA[0] = 0; // nan detection else @@ -439,88 +370,70 @@ int UAVObjectUtilManager::getHomeLocation(bool &set, double LLA[3]) return 0; // OK } -int UAVObjectUtilManager::getHomeLocation(bool &set, double LLA[3], double ECEF[3], double RNE[9], double Be[3]) -{ - UAVObjectField *field; +//int UAVObjectUtilManager::getHomeLocation(bool &set, double LLA[3], double ECEF[3], double RNE[9], double Be[3]) +//{ +// UAVObjectField *field; - QMutexLocker locker(mutex); +// QMutexLocker locker(mutex); - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - if (!pm) return -1; +//// ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); +//// if (!pm) return -1; - UAVObjectManager *om = pm->getObject(); - if (!om) return -2; +// UAVObjectManager *om = pm->getObject(); +// if (!om) return -2; - UAVDataObject *obj = dynamic_cast(om->getObject(QString("HomeLocation"))); - if (!obj) return -3; +// UAVDataObject *obj = dynamic_cast(om->getObject(QString("HomeLocation"))); +// if (!obj) return -3; -// obj->requestUpdate(); +//// obj->requestUpdate(); - field = obj->getField("Set"); - if (!field) return -4; - set = field->getValue().toBool(); +// field = obj->getField("Set"); +// if (!field) return -4; +// set = field->getValue().toBool(); - field = obj->getField("Latitude"); - if (!field) return -5; - LLA[0] = field->getDouble() * 1e-7; +// field = obj->getField("Latitude"); +// if (!field) return -5; +// LLA[0] = field->getDouble() * 1e-7; - field = obj->getField("Longitude"); - if (!field) return -6; - LLA[1] = field->getDouble() * 1e-7; +// field = obj->getField("Longitude"); +// if (!field) return -6; +// LLA[1] = field->getDouble() * 1e-7; - field = obj->getField("Altitude"); - if (!field) return -7; - LLA[2] = field->getDouble(); +// field = obj->getField("Altitude"); +// if (!field) return -7; +// LLA[2] = field->getDouble(); - field = obj->getField(QString("ECEF")); - if (!field) return -8; - for (int i = 0; i < 3; i++) - ECEF[i] = field->getDouble(i); +// field = obj->getField(QString("ECEF")); +// if (!field) return -8; +// for (int i = 0; i < 3; i++) +// ECEF[i] = field->getDouble(i); - field = obj->getField(QString("RNE")); - if (!field) return -9; - for (int i = 0; i < 9; i++) - RNE[i] = field->getDouble(i); +// field = obj->getField(QString("RNE")); +// if (!field) return -9; +// for (int i = 0; i < 9; i++) +// RNE[i] = field->getDouble(i); - field = obj->getField(QString("Be")); - if (!field) return -10; - for (int i = 0; i < 3; i++) - Be[i] = field->getDouble(i); +// field = obj->getField(QString("Be")); +// if (!field) return -10; +// for (int i = 0; i < 3; i++) +// Be[i] = field->getDouble(i); - return 0; // OK -} +// return 0; // OK +//} // ****************************** // GPS int UAVObjectUtilManager::getGPSPosition(double LLA[3]) { - UAVObjectField *field; + GPSPosition *gpsPosition = GPSPosition::GetInstance(obm); + Q_ASSERT(gpsPosition != NULL); - QMutexLocker locker(mutex); + GPSPosition::DataFields gpsPositionData = gpsPosition->getData(); - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - if (!pm) return -1; - - UAVObjectManager *om = pm->getObject(); - if (!om) return -2; - - UAVDataObject *obj = dynamic_cast(om->getObject(QString("GPSPosition"))); - if (!obj) return -3; - -// obj->requestUpdate(); - - field = obj->getField(QString("Latitude")); - if (!field) return -4; - LLA[0] = field->getDouble() * 1e-7; - - field = obj->getField(QString("Longitude")); - if (!field) return -5; - LLA[1] = field->getDouble() * 1e-7; - - field = obj->getField(QString("Altitude")); - if (!field) return -6; - LLA[2] = field->getDouble(); + LLA[0] = gpsPositionData.Latitude; + LLA[1] = gpsPositionData.Longitude; + LLA[2] = gpsPositionData.Altitude; if (LLA[0] != LLA[0]) LLA[0] = 0; // nan detection else @@ -539,93 +452,93 @@ int UAVObjectUtilManager::getGPSPosition(double LLA[3]) return 0; // OK } -// ****************************** -// telemetry port +//// ****************************** +//// telemetry port -int UAVObjectUtilManager::setTelemetrySerialPortSpeed(QString speed, bool save_to_sdcard) -{ - UAVObjectField *field; +//int UAVObjectUtilManager::setTelemetrySerialPortSpeed(QString speed, bool save_to_sdcard) +//{ +// UAVObjectField *field; - QMutexLocker locker(mutex); +// QMutexLocker locker(mutex); - // ****************** - // save the new settings +// // ****************** +// // save the new settings - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - if (!pm) return -1; +//// ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); +//// if (!pm) return -1; - UAVObjectManager *om = pm->getObject(); - if (!om) return -2; +// UAVObjectManager *om = pm->getObject(); +// if (!om) return -2; - UAVDataObject *obj = dynamic_cast(om->getObject(QString("/*TelemetrySettings*/"))); - if (!obj) return -3; +// UAVDataObject *obj = dynamic_cast(om->getObject(QString("/*TelemetrySettings*/"))); +// if (!obj) return -3; - field = obj->getField(QString("Speed")); - if (!field) return -4; - field->setValue(speed); +// field = obj->getField(QString("Speed")); +// if (!field) return -4; +// field->setValue(speed); - obj->updated(); +// obj->updated(); - // ****************** - // save the new setting to SD card +// // ****************** +// // save the new setting to SD card - if (save_to_sdcard) - saveObjectToSD(obj); +// if (save_to_sdcard) +// saveObjectToSD(obj); - // ****************** +// // ****************** - return 0; // OK -} +// return 0; // OK +//} -int UAVObjectUtilManager::getTelemetrySerialPortSpeed(QString &speed) -{ - UAVObjectField *field; +//int UAVObjectUtilManager::getTelemetrySerialPortSpeed(QString &speed) +//{ +// UAVObjectField *field; - QMutexLocker locker(mutex); +// QMutexLocker locker(mutex); - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - if (!pm) return -1; +//// ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); +//// if (!pm) return -1; - UAVObjectManager *om = pm->getObject(); - if (!om) return -2; +// UAVObjectManager *om = pm->getObject(); +// if (!om) return -2; - UAVDataObject *obj = dynamic_cast(om->getObject(QString("TelemetrySettings"))); - if (!obj) return -3; +// UAVDataObject *obj = dynamic_cast(om->getObject(QString("TelemetrySettings"))); +// if (!obj) return -3; -// obj->requestUpdate(); +//// obj->requestUpdate(); - field = obj->getField(QString("Speed")); - if (!field) return -4; - speed = field->getValue().toString(); +// field = obj->getField(QString("Speed")); +// if (!field) return -4; +// speed = field->getValue().toString(); - return 0; // OK -} +// return 0; // OK +//} -int UAVObjectUtilManager::getTelemetrySerialPortSpeeds(QComboBox *comboBox) -{ - UAVObjectField *field; +//int UAVObjectUtilManager::getTelemetrySerialPortSpeeds(QComboBox *comboBox) +//{ +// UAVObjectField *field; - QMutexLocker locker(mutex); +// QMutexLocker locker(mutex); - if (!comboBox) return -1; +// if (!comboBox) return -1; - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - if (!pm) return -2; +//// ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); +//// if (!pm) return -2; - UAVObjectManager *om = pm->getObject(); - if (!om) return -3; +// UAVObjectManager *om = pm->getObject(); +// if (!om) return -3; - UAVDataObject *obj = dynamic_cast(om->getObject(QString("TelemetrySettings"))); - if (!obj) return -4; +// UAVDataObject *obj = dynamic_cast(om->getObject(QString("TelemetrySettings"))); +// if (!obj) return -4; -// obj->requestUpdate(); +//// obj->requestUpdate(); - field = obj->getField(QString("Speed")); - if (!field) return -5; - comboBox->addItems(field->getOptions()); +// field = obj->getField(QString("Speed")); +// if (!field) return -5; +// comboBox->addItems(field->getOptions()); - return 0; // OK -} +// return 0; // OK +//} deviceDescriptorStruct UAVObjectUtilManager::getBoardDescriptionStruct() { diff --git a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.h b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.h index 11f5f0979..1a4147f94 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.h +++ b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.h @@ -55,13 +55,13 @@ public: int setHomeLocation(double LLA[3], bool save_to_sdcard); int getHomeLocation(bool &set, double LLA[3]); - int getHomeLocation(bool &set, double LLA[3], double ECEF[3], double RNE[9], double Be[3]); +// int getHomeLocation(bool &set, double LLA[3], double ECEF[3], double RNE[9], double Be[3]); int getGPSPosition(double LLA[3]); - int setTelemetrySerialPortSpeed(QString speed, bool save_to_sdcard); - int getTelemetrySerialPortSpeed(QString &speed); - int getTelemetrySerialPortSpeeds(QComboBox *comboBox); +// int setTelemetrySerialPortSpeed(QString speed, bool save_to_sdcard); +// int getTelemetrySerialPortSpeed(QString &speed); +// int getTelemetrySerialPortSpeeds(QComboBox *comboBox); int getBoardModel(); QByteArray getBoardCPUSerial(); @@ -78,11 +78,15 @@ signals: void saveCompleted(int objectID, bool status); private: - QMutex *mutex; - QQueue queue; - enum {IDLE, AWAITING_ACK, AWAITING_COMPLETED} saveState; - void saveNextObject(); - QTimer failureTimer; + QMutex *mutex; + QQueue queue; + enum {IDLE, AWAITING_ACK, AWAITING_COMPLETED} saveState; + void saveNextObject(); + QTimer failureTimer; + + ExtensionSystem::PluginManager *pm; + UAVObjectManager *obm; + UAVObjectUtilManager *obum; private slots: //void transactionCompleted(UAVObject *obj, bool success); From 9ec05d89284f0ab3b11a1cae0cf31b6742e1ea59 Mon Sep 17 00:00:00 2001 From: Laura Sebesta Date: Thu, 27 Sep 2012 14:42:57 +0200 Subject: [PATCH 16/18] Added dialog to request altitude when settings HomeLocation via the map. Fixed bug in setHomeLocation, by which altitude was scaled inappropriately. --- .../src/libs/utils/homelocationutil.cpp | 2 +- .../src/plugins/opmap/opmapgadgetwidget.cpp | 18 +++++++++++++----- .../uavobjectutil/uavobjectutilmanager.cpp | 2 +- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/ground/openpilotgcs/src/libs/utils/homelocationutil.cpp b/ground/openpilotgcs/src/libs/utils/homelocationutil.cpp index 4700bdb5c..0b2f4954d 100644 --- a/ground/openpilotgcs/src/libs/utils/homelocationutil.cpp +++ b/ground/openpilotgcs/src/libs/utils/homelocationutil.cpp @@ -44,7 +44,7 @@ HomeLocationUtil::HomeLocationUtil() } /* - /*Get world magnetic model + /*Get local magnetic field * input params: LLA * output params: Be */ diff --git a/ground/openpilotgcs/src/plugins/opmap/opmapgadgetwidget.cpp b/ground/openpilotgcs/src/plugins/opmap/opmapgadgetwidget.cpp index 9cb7a7cc6..19a2a0426 100644 --- a/ground/openpilotgcs/src/plugins/opmap/opmapgadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/opmap/opmapgadgetwidget.cpp @@ -919,7 +919,7 @@ void OPMapGadgetWidget::setHome(QPointF pos) /** Sets the home position on the map widget */ -void OPMapGadgetWidget::setHome(internals::PointLatLng pos_lat_lon,double altitude) +void OPMapGadgetWidget::setHome(internals::PointLatLng pos_lat_lon, double altitude) { if (!m_widget || !m_map) return; @@ -941,13 +941,13 @@ void OPMapGadgetWidget::setHome(internals::PointLatLng pos_lat_lon,double altitu if (longitude > 180) longitude = 180; else if (longitude < -180) longitude = -180; - else if(altitude != altitude) altitude=0; // ********* - m_home_position.coord = internals::PointLatLng(latitude, longitude); + m_home_position.coord = internals::PointLatLng(latitude, longitude); + m_home_position.altitude = altitude; - m_map->Home->SetCoord(m_home_position.coord); + m_map->Home->SetCoord(m_home_position.coord); m_map->Home->SetAltitude(altitude); m_map->Home->RefreshPos(); @@ -1659,7 +1659,15 @@ void OPMapGadgetWidget::onSetHomeAct_triggered() if (!m_widget || !m_map) return; - setHome(m_context_menu_lat_lon,0); + float altitude=0; + bool ok; + + //Get desired HomeLocation altitude from dialog box. + //TODO: Populate box with altitude already in HomeLocation UAVO + altitude = QInputDialog::getDouble(this, tr("Set home altitude"), + tr("In [m], referenced to WGS84:"), altitude, -100, 100000, 2, &ok); + + setHome(m_context_menu_lat_lon, altitude); setHomeLocationObject(); // update the HomeLocation UAVObject } diff --git a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp index 70e766823..63bf6e8d4 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp @@ -323,7 +323,7 @@ int UAVObjectUtilManager::setHomeLocation(double LLA[3], bool save_to_sdcard) HomeLocation::DataFields homeLocationData = homeLocation->getData(); homeLocationData.Latitude = LLA[0] * 1e7; homeLocationData.Longitude = LLA[1] * 1e7; - homeLocationData.Altitude = LLA[2] * 1e7; + homeLocationData.Altitude = LLA[2]; homeLocationData.Be[0] = Be[0]; homeLocationData.Be[1] = Be[1]; From 09b898088141ba74a51d73ff7bf7fc99c97a9e51 Mon Sep 17 00:00:00 2001 From: Laura Sebesta Date: Thu, 27 Sep 2012 18:06:48 +0200 Subject: [PATCH 17/18] Fixed copy-pasta error. --- .../src/plugins/uavobjectutil/uavobjectutilmanager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp index 63bf6e8d4..5914c9207 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp @@ -349,8 +349,8 @@ int UAVObjectUtilManager::getHomeLocation(bool &set, double LLA[3]) set = homeLocationData.Set; - LLA[0] = homeLocationData.Latitude; - LLA[1] = homeLocationData.Longitude; + LLA[0] = homeLocationData.Latitude*1e-7; + LLA[1] = homeLocationData.Longitude*1e-7; LLA[2] = homeLocationData.Altitude; if (LLA[0] != LLA[0]) LLA[0] = 0; // nan detection From a899c87c56b3a18034d5be1295fbb93e80d0c185 Mon Sep 17 00:00:00 2001 From: Laura Sebesta Date: Thu, 27 Sep 2012 19:21:00 +0200 Subject: [PATCH 18/18] Remove superflous UAVO update call. Add documentation. Remove commented code. --- .../src/libs/utils/homelocationutil.cpp | 9 +- .../uavobjectutil/uavobjectutilmanager.cpp | 141 +----------------- .../uavobjectutil/uavobjectutilmanager.h | 5 - 3 files changed, 6 insertions(+), 149 deletions(-) diff --git a/ground/openpilotgcs/src/libs/utils/homelocationutil.cpp b/ground/openpilotgcs/src/libs/utils/homelocationutil.cpp index 0b2f4954d..448830573 100644 --- a/ground/openpilotgcs/src/libs/utils/homelocationutil.cpp +++ b/ground/openpilotgcs/src/libs/utils/homelocationutil.cpp @@ -40,13 +40,14 @@ namespace Utils { HomeLocationUtil::HomeLocationUtil() { - // Initialize(); } /* - /*Get local magnetic field - * input params: LLA - * output params: Be + /** + * @brief Get local magnetic field + * @param[in] LLA The longitude-latitude-altitude coordinate to compute the magnetic field at + * @param[out] Be The resulting magnetic field at that location and time in [mGau](?) + * @returns 0 if successful, -1 otherwise. */ int HomeLocationUtil::getDetails(double LLA[3], double Be[3]) { diff --git a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp index 5914c9207..bacadeb73 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.cpp @@ -120,7 +120,7 @@ void UAVObjectUtilManager::saveNextObject() // Get next object from the queue UAVObject* obj = queue.head(); - qDebug() << "Request board to save object " << obj->getName(); + qDebug() << "Send save object request to board " << obj->getName(); ObjectPersistence* objper = dynamic_cast( getObjectManager()->getObject(ObjectPersistence::NAME) ); connect(objper, SIGNAL(transactionCompleted(UAVObject*,bool)), this, SLOT(objectPersistenceTransactionCompleted(UAVObject*,bool))); @@ -332,7 +332,6 @@ int UAVObjectUtilManager::setHomeLocation(double LLA[3], bool save_to_sdcard) homeLocationData.Set = HomeLocation::SET_TRUE; homeLocation->setData(homeLocationData); - homeLocation->updated(); if (save_to_sdcard) saveObjectToSD(homeLocation); @@ -370,56 +369,6 @@ int UAVObjectUtilManager::getHomeLocation(bool &set, double LLA[3]) return 0; // OK } -//int UAVObjectUtilManager::getHomeLocation(bool &set, double LLA[3], double ECEF[3], double RNE[9], double Be[3]) -//{ -// UAVObjectField *field; - -// QMutexLocker locker(mutex); - -//// ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); -//// if (!pm) return -1; - -// UAVObjectManager *om = pm->getObject(); -// if (!om) return -2; - -// UAVDataObject *obj = dynamic_cast(om->getObject(QString("HomeLocation"))); -// if (!obj) return -3; - -//// obj->requestUpdate(); - -// field = obj->getField("Set"); -// if (!field) return -4; -// set = field->getValue().toBool(); - -// field = obj->getField("Latitude"); -// if (!field) return -5; -// LLA[0] = field->getDouble() * 1e-7; - -// field = obj->getField("Longitude"); -// if (!field) return -6; -// LLA[1] = field->getDouble() * 1e-7; - -// field = obj->getField("Altitude"); -// if (!field) return -7; -// LLA[2] = field->getDouble(); - -// field = obj->getField(QString("ECEF")); -// if (!field) return -8; -// for (int i = 0; i < 3; i++) -// ECEF[i] = field->getDouble(i); - -// field = obj->getField(QString("RNE")); -// if (!field) return -9; -// for (int i = 0; i < 9; i++) -// RNE[i] = field->getDouble(i); - -// field = obj->getField(QString("Be")); -// if (!field) return -10; -// for (int i = 0; i < 3; i++) -// Be[i] = field->getDouble(i); - -// return 0; // OK -//} // ****************************** // GPS @@ -452,94 +401,6 @@ int UAVObjectUtilManager::getGPSPosition(double LLA[3]) return 0; // OK } -//// ****************************** -//// telemetry port - -//int UAVObjectUtilManager::setTelemetrySerialPortSpeed(QString speed, bool save_to_sdcard) -//{ -// UAVObjectField *field; - -// QMutexLocker locker(mutex); - -// // ****************** -// // save the new settings - -//// ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); -//// if (!pm) return -1; - -// UAVObjectManager *om = pm->getObject(); -// if (!om) return -2; - -// UAVDataObject *obj = dynamic_cast(om->getObject(QString("/*TelemetrySettings*/"))); -// if (!obj) return -3; - -// field = obj->getField(QString("Speed")); -// if (!field) return -4; -// field->setValue(speed); - -// obj->updated(); - -// // ****************** -// // save the new setting to SD card - -// if (save_to_sdcard) -// saveObjectToSD(obj); - -// // ****************** - -// return 0; // OK -//} - -//int UAVObjectUtilManager::getTelemetrySerialPortSpeed(QString &speed) -//{ -// UAVObjectField *field; - -// QMutexLocker locker(mutex); - -//// ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); -//// if (!pm) return -1; - -// UAVObjectManager *om = pm->getObject(); -// if (!om) return -2; - -// UAVDataObject *obj = dynamic_cast(om->getObject(QString("TelemetrySettings"))); -// if (!obj) return -3; - -//// obj->requestUpdate(); - -// field = obj->getField(QString("Speed")); -// if (!field) return -4; -// speed = field->getValue().toString(); - -// return 0; // OK -//} - -//int UAVObjectUtilManager::getTelemetrySerialPortSpeeds(QComboBox *comboBox) -//{ -// UAVObjectField *field; - -// QMutexLocker locker(mutex); - -// if (!comboBox) return -1; - -//// ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); -//// if (!pm) return -2; - -// UAVObjectManager *om = pm->getObject(); -// if (!om) return -3; - -// UAVDataObject *obj = dynamic_cast(om->getObject(QString("TelemetrySettings"))); -// if (!obj) return -4; - -//// obj->requestUpdate(); - -// field = obj->getField(QString("Speed")); -// if (!field) return -5; -// comboBox->addItems(field->getOptions()); - -// return 0; // OK -//} - deviceDescriptorStruct UAVObjectUtilManager::getBoardDescriptionStruct() { deviceDescriptorStruct ret; diff --git a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.h b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.h index 1a4147f94..8ea9dc8f2 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.h +++ b/ground/openpilotgcs/src/plugins/uavobjectutil/uavobjectutilmanager.h @@ -55,14 +55,9 @@ public: int setHomeLocation(double LLA[3], bool save_to_sdcard); int getHomeLocation(bool &set, double LLA[3]); -// int getHomeLocation(bool &set, double LLA[3], double ECEF[3], double RNE[9], double Be[3]); int getGPSPosition(double LLA[3]); -// int setTelemetrySerialPortSpeed(QString speed, bool save_to_sdcard); -// int getTelemetrySerialPortSpeed(QString &speed); -// int getTelemetrySerialPortSpeeds(QComboBox *comboBox); - int getBoardModel(); QByteArray getBoardCPUSerial(); quint32 getFirmwareCRC();