diff --git a/.appveyor.yml b/.appveyor.yml index 57050f41ceb2a3b58c59bd36502e178673aab38d..8440d7a5a3d3cc0b4be873c9056a49030620bab7 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -50,23 +50,11 @@ build_script: test_script: - if "%CONFIG%" EQU "debug" ( %SHADOW_BUILD_DIR%\debug\qgroundcontrol --unittest ) -for: -- - branches: - only: - - master - artifacts: +artifacts: - path: QGroundControl-installer.exe name: qgcinstaller -- - branches: - only: - - Stable_V3.5 - artifacts: - - path: QGroundControl-installer.exe - name: qgcinstaller - - path: symbols\**\*.*_ - name: symbols + - path: build_windows_install\release\qgroundcontrol.pdb + name: pdb deploy: # deploy continuous builds to s3 @@ -101,19 +89,19 @@ deploy: # appveyor_repo_tag: false # deploy release symbols to s3 - - provider: S3 - access_key_id: - secure: IGAojLMqokL+76DbdulmWDA3MTsxEBBi3ReVVSqTy9c= - secret_access_key: - secure: RiYqaR+3T2PMNz2j5ur8LCA6H/Zfd4jTX33CZE5iBxm+zaz4QLs25p0B7prpaoNN - bucket: qgroundcontrol - region: us-west-2 - set_public: true - folder: releasesyms - artifact: symbols - on: - CONFIG: installer - appveyor_repo_tag: true +# - provider: S3 +# access_key_id: +# secure: IGAojLMqokL+76DbdulmWDA3MTsxEBBi3ReVVSqTy9c= +# secret_access_key: +# secure: RiYqaR+3T2PMNz2j5ur8LCA6H/Zfd4jTX33CZE5iBxm+zaz4QLs25p0B7prpaoNN +# bucket: qgroundcontrol +# region: us-west-2 +# set_public: true +# folder: releasesyms +# artifact: symbols +# on: +# CONFIG: installer +# appveyor_repo_tag: true # deploy tagged releases to Github releases - provider: GitHub @@ -155,3 +143,18 @@ deploy: on: CONFIG: installer appveyor_repo_tag: true + +# deploy pdb for tagged releases to s3 latest folder + - provider: S3 + access_key_id: + secure: IGAojLMqokL+76DbdulmWDA3MTsxEBBi3ReVVSqTy9c= + secret_access_key: + secure: RiYqaR+3T2PMNz2j5ur8LCA6H/Zfd4jTX33CZE5iBxm+zaz4QLs25p0B7prpaoNN + bucket: qgroundcontrol + region: us-west-2 + set_public: true + folder: latest + artifact: pdb + on: + CONFIG: installer + appveyor_repo_tag: true diff --git a/ChangeLog.md b/ChangeLog.md index b384966f4ff129cad7c7b2c1842d83747b48fb07..f49e96a7f9b065d4f248d841f50e94ff4c8f77e6 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -8,10 +8,15 @@ Note: This file only contains high level features or important fixes. * Major rewrite and bug fix pass through Structure Scan. Previous version had such bad problems that it can no longer be supported. Plans with Structure Scan will need to be recreated. New QGC will not load old Structure Scan plans. -### 3.5.2 - Not yet released +### 3.5.3 - Not yet released * ArduPilot: Fix parameter file save generating bad characters from git hash +### 3.5.2 - Stable +* Fix Ubuntu AppImage startup failure + ### 3.5.1 +* Update Windows usb drivers +* Add ArduPilot CubeBlack Service Bulletin check * Fix visibility of PX4/ArduPilot logo in toolbar * Fix tile set count but in OfflineMaps which would cause image and elevation tile set to have incorrect counts and be incorrectly marked as download incomplete. diff --git a/QGCSetup.pri b/QGCSetup.pri index 642ccce51609b9b960e7258907624b4e017f9473..508ff1f68314c465952172b3fcc32deb5bbc4b5f 100644 --- a/QGCSetup.pri +++ b/QGCSetup.pri @@ -136,9 +136,9 @@ LinuxBuild { !contains(DEFINES, __rasp_pi2__) { QT_LIB_LIST += \ - libicudata.so \ - libicui18n.so \ - libicuuc.so + libicudata.so.56 \ + libicui18n.so.56 \ + libicuuc.so.56 } for(QT_LIB, QT_LIB_LIST) { diff --git a/deploy/px4driver.msi b/deploy/px4driver.msi index 4e2b0866d45b6735affffce5955a2b5775c22589..8bd3e5034b8219e7ab06137ab18319e425ce5477 100644 Binary files a/deploy/px4driver.msi and b/deploy/px4driver.msi differ diff --git a/localization/qgc_de-DE.qm b/localization/qgc_de-DE.qm index e16631a37b418ac864f9e9d38a8ea2e093ae88bf..7637298bb906e01246ceb5fd9e1d2ebec25233db 100644 Binary files a/localization/qgc_de-DE.qm and b/localization/qgc_de-DE.qm differ diff --git a/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.cc b/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.cc index 22543319485a3391bfc5b5361c7b4a3df55181fb..abc156e12726412c5ccdcdf9ad2c8cb1a187b4d7 100644 --- a/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.cc +++ b/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.cc @@ -29,6 +29,11 @@ #include "APMSubFrameComponent.h" #include "ESP8266Component.h" #include "APMHeliComponent.h" +#include "QGCApplication.h" + +#if !defined(NO_SERIAL_LINK) && !defined(__android__) +#include +#endif /// This is the AutoPilotPlugin implementatin for the MAV_AUTOPILOT_ARDUPILOT type. APMAutoPilotPlugin::APMAutoPilotPlugin(Vehicle* vehicle, QObject* parent) @@ -50,6 +55,10 @@ APMAutoPilotPlugin::APMAutoPilotPlugin(Vehicle* vehicle, QObject* parent) , _heliComponent (NULL) { APMAirframeLoader::loadAirframeFactMetaData(); + +#if !defined(NO_SERIAL_LINK) && !defined(__android__) + connect(vehicle->parameterManager(), &ParameterManager::parametersReadyChanged, this, &APMAutoPilotPlugin::_checkForBadCubeBlack); +#endif } APMAutoPilotPlugin::~APMAutoPilotPlugin() @@ -170,3 +179,34 @@ QString APMAutoPilotPlugin::prerequisiteSetup(VehicleComponent* component) const return QString(); } + +#if !defined(NO_SERIAL_LINK) && !defined(__android__) +/// The following code is executed when the Vehicle is parameter ready. It checks for the service bulletin against Cube Blacks. +void APMAutoPilotPlugin::_checkForBadCubeBlack(void) +{ + bool cubeBlackFound = false; + for (const QVariant& varLink: _vehicle->links()) { + SerialLink* serialLink = varLink.value(); + if (serialLink && QSerialPortInfo(*serialLink->_hackAccessToPort()).description().contains(QStringLiteral("CubeBlack"))) { + cubeBlackFound = true; + } + + } + if (!cubeBlackFound) { + return; + } + + ParameterManager* paramMgr = _vehicle->parameterManager(); + + QString paramAcc3("INS_ACC3_ID"); + QString paramGyr3("INS_GYR3_ID"); + QString paramEnableMask("INS_ENABLE_MASK"); + + if (paramMgr->parameterExists(-1, paramAcc3) && paramMgr->getParameter(-1, paramAcc3)->rawValue().toInt() == 0 && + paramMgr->parameterExists(-1, paramGyr3) && paramMgr->getParameter(-1, paramGyr3)->rawValue().toInt() == 0 && + paramMgr->parameterExists(-1, paramEnableMask) && paramMgr->getParameter(-1, paramEnableMask)->rawValue().toInt() >= 7) { + qgcApp()->showMessage(tr("WARNING: The flight board you are using has a critical service bulletin against ti which advise against flying. https://discuss.cubepilot.org/t/sb-0000002-critical-service-bulletin-for-cubes-purchased-between-january-2019-to-present-do-not-fly/406")); + + } +} +#endif diff --git a/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.h b/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.h index 09bb7c24f2480eafadae16c93fc134ef3a6b007a..5c6a5acc4cbaecfd23c19025dc6eb60d545d55d3 100644 --- a/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.h +++ b/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.h @@ -59,6 +59,11 @@ protected: ESP8266Component* _esp8266Component; APMHeliComponent* _heliComponent; +#if !defined(NO_SERIAL_LINK) && !defined(__android__) +private slots: + void _checkForBadCubeBlack(void); +#endif + private: QVariantList _components; }; diff --git a/src/MissionManager/MavCmdInfoCommon.json b/src/MissionManager/MavCmdInfoCommon.json index a6ce14e3bf3f9e8bbace885fbd622f0ebf15e0ef..f2d70650c4433130903f1bd44da914b7582a65aa 100644 --- a/src/MissionManager/MavCmdInfoCommon.json +++ b/src/MissionManager/MavCmdInfoCommon.json @@ -52,7 +52,7 @@ }, "param4": { "label": "Heading", - "units": "radians", + "units": "deg", "nanUnchanged": true, "default": null, "decimalPlaces": 2 @@ -74,7 +74,7 @@ }, "param4": { "label": "Heading", - "units": "radians", + "units": "deg", "nanUnchanged": true, "default": null, "decimalPlaces": 2 @@ -101,7 +101,7 @@ }, "param4": { "label": "Heading", - "units": "radians", + "units": "deg", "nanUnchanged": true, "default": null, "decimalPlaces": 2 @@ -129,7 +129,7 @@ }, "param4": { "label": "Heading", - "units": "radians", + "units": "deg", "nanUnchanged": true, "decimalPlaces": 2 } @@ -158,7 +158,7 @@ }, "param4": { "label": "Heading", - "units": "radians", + "units": "deg", "nanUnchanged": true, "default": null, "decimalPlaces": 2 @@ -180,7 +180,7 @@ }, "param4": { "label": "Heading", - "units": "radians", + "units": "deg", "nanUnchanged": true, "default": null, "decimalPlaces": 2 diff --git a/src/MissionManager/StructureScanComplexItem.cc b/src/MissionManager/StructureScanComplexItem.cc index 4544f2b7364e88655b174a8ae25b2fed71a99f81..8eae2d8ff6b988b0a9e198c0188f24b99a43049f 100644 --- a/src/MissionManager/StructureScanComplexItem.cc +++ b/src/MissionManager/StructureScanComplexItem.cc @@ -293,7 +293,7 @@ void StructureScanComplexItem::appendMissionItems(QList& items, QO { int seqNum = _sequenceNumber; bool startFromTop = _startFromTopFact.rawValue().toBool(); - double startAltitude = _scanBottomAltFact.rawValue().toDouble() + (startFromTop ? _structureHeightFact.rawValue().toDouble() : 0); + double startAltitude = (startFromTop ? _structureHeightFact.rawValue().toDouble() : _scanBottomAltFact.rawValue().toDouble()); MissionItem* item = nullptr; diff --git a/src/QmlControls/QGroundControlQmlGlobal.cc b/src/QmlControls/QGroundControlQmlGlobal.cc index 2f892c185d8e2be0fdfb5256c6c6f62a88c0f2f4..6aa715eca91af0880ece9128b87bfa51d5ca47e0 100644 --- a/src/QmlControls/QGroundControlQmlGlobal.cc +++ b/src/QmlControls/QGroundControlQmlGlobal.cc @@ -144,6 +144,15 @@ void QGroundControlQmlGlobal::startAPMArduSubMockLink(bool sendStatusText) #endif } +void QGroundControlQmlGlobal::startAPMArduRoverMockLink(bool sendStatusText) +{ +#ifdef QT_DEBUG + MockLink::startAPMArduRoverMockLink(sendStatusText); +#else + Q_UNUSED(sendStatusText); +#endif +} + void QGroundControlQmlGlobal::stopOneMockLink(void) { #ifdef QT_DEBUG diff --git a/src/QmlControls/QGroundControlQmlGlobal.h b/src/QmlControls/QGroundControlQmlGlobal.h index e49ace26cf725b6131f8fabe2def0869a9a3e803..366128dc7c1097541b00f42d4b60478f35f0e428 100644 --- a/src/QmlControls/QGroundControlQmlGlobal.h +++ b/src/QmlControls/QGroundControlQmlGlobal.h @@ -112,6 +112,7 @@ public: Q_INVOKABLE void startAPMArduCopterMockLink (bool sendStatusText); Q_INVOKABLE void startAPMArduPlaneMockLink (bool sendStatusText); Q_INVOKABLE void startAPMArduSubMockLink (bool sendStatusText); + Q_INVOKABLE void startAPMArduRoverMockLink (bool sendStatusText); Q_INVOKABLE void stopOneMockLink (void); /// Converts from meters to the user specified distance unit diff --git a/src/comm/MockLink.cc b/src/comm/MockLink.cc index 9edc2f30c3ed36b27b2783023e1283dc29053343..d24da50c8545eaba8fa5fdc12f73c55c037beda4 100644 --- a/src/comm/MockLink.cc +++ b/src/comm/MockLink.cc @@ -1159,64 +1159,46 @@ MockLink* MockLink::_startMockLink(MockConfiguration* mockConfig) return qobject_cast(linkMgr->createConnectedLink(config)); } -MockLink* MockLink::startPX4MockLink(bool sendStatusText, MockConfiguration::FailureMode_t failureMode) +MockLink* MockLink::_startMockLinkWorker(QString configName, MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType, bool sendStatusText, MockConfiguration::FailureMode_t failureMode) { - MockConfiguration* mockConfig = new MockConfiguration("PX4 MockLink"); + MockConfiguration* mockConfig = new MockConfiguration(configName); - mockConfig->setFirmwareType(MAV_AUTOPILOT_PX4); - mockConfig->setVehicleType(MAV_TYPE_QUADROTOR); + mockConfig->setFirmwareType(firmwareType); + mockConfig->setVehicleType(vehicleType); mockConfig->setSendStatusText(sendStatusText); mockConfig->setFailureMode(failureMode); return _startMockLink(mockConfig); } -MockLink* MockLink::startGenericMockLink(bool sendStatusText, MockConfiguration::FailureMode_t failureMode) +MockLink* MockLink::startPX4MockLink(bool sendStatusText, MockConfiguration::FailureMode_t failureMode) { - MockConfiguration* mockConfig = new MockConfiguration("Generic MockLink"); - - mockConfig->setFirmwareType(MAV_AUTOPILOT_GENERIC); - mockConfig->setVehicleType(MAV_TYPE_QUADROTOR); - mockConfig->setSendStatusText(sendStatusText); - mockConfig->setFailureMode(failureMode); + return _startMockLinkWorker("PX4 MultiRotor MockLink", MAV_AUTOPILOT_PX4, MAV_TYPE_QUADROTOR, sendStatusText, failureMode); +} - return _startMockLink(mockConfig); +MockLink* MockLink::startGenericMockLink(bool sendStatusText, MockConfiguration::FailureMode_t failureMode) +{ + return _startMockLinkWorker("Generic MockLink", MAV_AUTOPILOT_GENERIC, MAV_TYPE_QUADROTOR, sendStatusText, failureMode); } MockLink* MockLink::startAPMArduCopterMockLink(bool sendStatusText, MockConfiguration::FailureMode_t failureMode) { - MockConfiguration* mockConfig = new MockConfiguration("APM ArduCopter MockLink"); - - mockConfig->setFirmwareType(MAV_AUTOPILOT_ARDUPILOTMEGA); - mockConfig->setVehicleType(MAV_TYPE_QUADROTOR); - mockConfig->setSendStatusText(sendStatusText); - mockConfig->setFailureMode(failureMode); - - return _startMockLink(mockConfig); + return _startMockLinkWorker("ArduCopter MockLink",MAV_AUTOPILOT_ARDUPILOTMEGA, MAV_TYPE_QUADROTOR, sendStatusText, failureMode); } MockLink* MockLink::startAPMArduPlaneMockLink(bool sendStatusText, MockConfiguration::FailureMode_t failureMode) { - MockConfiguration* mockConfig = new MockConfiguration("APM ArduPlane MockLink"); - - mockConfig->setFirmwareType(MAV_AUTOPILOT_ARDUPILOTMEGA); - mockConfig->setVehicleType(MAV_TYPE_FIXED_WING); - mockConfig->setSendStatusText(sendStatusText); - mockConfig->setFailureMode(failureMode); - - return _startMockLink(mockConfig); + return _startMockLinkWorker("ArduPlane MockLink", MAV_AUTOPILOT_ARDUPILOTMEGA, MAV_TYPE_FIXED_WING, sendStatusText, failureMode); } MockLink* MockLink::startAPMArduSubMockLink(bool sendStatusText, MockConfiguration::FailureMode_t failureMode) { - MockConfiguration* mockConfig = new MockConfiguration("APM ArduSub MockLink"); - - mockConfig->setFirmwareType(MAV_AUTOPILOT_ARDUPILOTMEGA); - mockConfig->setVehicleType(MAV_TYPE_SUBMARINE); - mockConfig->setSendStatusText(sendStatusText); - mockConfig->setFailureMode(failureMode); + return _startMockLinkWorker("ArduSub MockLink", MAV_AUTOPILOT_ARDUPILOTMEGA, MAV_TYPE_SUBMARINE, sendStatusText, failureMode); +} - return _startMockLink(mockConfig); +MockLink* MockLink::startAPMArduRoverMockLink(bool sendStatusText, MockConfiguration::FailureMode_t failureMode) +{ + return _startMockLinkWorker("ArduRover MockLink", MAV_AUTOPILOT_ARDUPILOTMEGA, MAV_TYPE_GROUND_ROVER, sendStatusText, failureMode); } void MockLink::_sendRCChannels(void) diff --git a/src/comm/MockLink.h b/src/comm/MockLink.h index e771cd6a2888aa0878eb4018a917a5d4168140a7..0d3bee32345a7c84e21645e57777604cf4d8dd3d 100644 --- a/src/comm/MockLink.h +++ b/src/comm/MockLink.h @@ -156,6 +156,7 @@ public: static MockLink* startAPMArduCopterMockLink (bool sendStatusText, MockConfiguration::FailureMode_t failureMode = MockConfiguration::FailNone); static MockLink* startAPMArduPlaneMockLink (bool sendStatusText, MockConfiguration::FailureMode_t failureMode = MockConfiguration::FailNone); static MockLink* startAPMArduSubMockLink (bool sendStatusText, MockConfiguration::FailureMode_t failureMode = MockConfiguration::FailNone); + static MockLink* startAPMArduRoverMockLink (bool sendStatusText, MockConfiguration::FailureMode_t failureMode = MockConfiguration::FailNone); private slots: virtual void _writeBytes(const QByteArray bytes); @@ -203,6 +204,7 @@ private: void _sendADSBVehicles(void); void _moveADSBVehicle(void); + static MockLink* _startMockLinkWorker(QString configName, MAV_AUTOPILOT firmwareType, MAV_TYPE vehicleType, bool sendStatusText, MockConfiguration::FailureMode_t failureMode); static MockLink* _startMockLink(MockConfiguration* mockConfig); MockLinkMissionItemHandler _missionItemHandler; diff --git a/src/comm/SerialLink.h b/src/comm/SerialLink.h index 3d02197c93c3776322c69932561a59043c0fa78d..5dd0074a1d6472a86bf50a41f7c0761d8f58f04d 100644 --- a/src/comm/SerialLink.h +++ b/src/comm/SerialLink.h @@ -145,6 +145,9 @@ public: bool connect(void); bool disconnect(void); + /// Don't even think of calling this method! + QSerialPort* _hackAccessToPort(void) { return _port; } + private slots: /** * @brief Write a number of bytes to the interface. diff --git a/src/ui/preferences/MockLink.qml b/src/ui/preferences/MockLink.qml index ed1073d0b48011d0a8c0eff213ff49cda8f4f6a6..753336e038bcb7f21cb120ef099f8df55331c88f 100644 --- a/src/ui/preferences/MockLink.qml +++ b/src/ui/preferences/MockLink.qml @@ -52,6 +52,10 @@ Rectangle { text: qsTr("APM ArduSub Vehicle") onClicked: QGroundControl.startAPMArduSubMockLink(sendStatusText.checked) } + QGCButton { + text: qsTr("APM ArduRover Vehicle") + onClicked: QGroundControl.startAPMArduRoverMockLink(sendStatusText.checked) + } QGCButton { text: qsTr("Generic Vehicle") onClicked: QGroundControl.startGenericMockLink(sendStatusText.checked)