diff --git a/QGCInstaller.pri b/QGCInstaller.pri index 9873915e882d01f3cbb6aa656aa41c795a8755c6..f3ba9bc22fc2e44bdafc4602f9448b595ce52b11 100644 --- a/QGCInstaller.pri +++ b/QGCInstaller.pri @@ -31,8 +31,9 @@ installer { # macdeploy is missing some relocations once in a while. "Fix" it: QMAKE_POST_LINK += && python $$BASEDIR/tools/osxrelocator.py $${TARGET}.app/Contents @rpath @executable_path/../Frameworks -r > /dev/null 2>&1 # Create package - QMAKE_POST_LINK += && cd $${OUT_PWD} - QMAKE_POST_LINK += && hdiutil create -verbose -stretch 4g -layout SPUD -srcfolder $${DESTDIR}/$${TARGET}.app -volname $${TARGET} $${DESTDIR}/package/$${TARGET}.dmg + QMAKE_POST_LINK += && hdiutil create /tmp/tmp.dmg -ov -volname "$${TARGET}-$${MAC_VERSION}" -fs HFS+ -srcfolder "$${DESTDIR}/" + QMAKE_POST_LINK += && hdiutil convert /tmp/tmp.dmg -format UDBZ -o $${DESTDIR}/package/$${TARGET}.dmg + QMAKE_POST_LINK += && rm /tmp/tmp.dmg } WindowsBuild { QMAKE_POST_LINK += $$escape_expand(\\n) cd $$BASEDIR_WIN && $$quote("\"C:\\Program Files \(x86\)\\NSIS\\makensis.exe\"" /DINSTALLER_ICON="\"$${QGC_INSTALLER_ICON}\"" /DHEADER_BITMAP="\"$${QGC_INSTALLER_HEADER_BITMAP}\"" /DAPPNAME="\"$${QGC_APP_NAME}\"" /DEXENAME="\"$${TARGET}\"" /DORGNAME="\"$${QGC_ORG_NAME}\"" /DDESTDIR=$${DESTDIR} /NOCD "\"/XOutFile $${DESTDIR_WIN}\\$${TARGET}-installer.exe\"" "$$BASEDIR_WIN\\deploy\\qgroundcontrol_installer.nsi") diff --git a/src/FactSystem/FactMetaData.cc b/src/FactSystem/FactMetaData.cc index 71745883d6a412be0488a6e3cd5d2163219a686b..af36a4f52719241d13eb0b887b7f2bbfebba35d2 100644 --- a/src/FactSystem/FactMetaData.cc +++ b/src/FactSystem/FactMetaData.cc @@ -46,6 +46,7 @@ const FactMetaData::AppSettingsTranslation_s FactMetaData::_rgAppSettingsTransla { "meters", "meters", false, UnitsSettings::DistanceUnitsMeters, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, { "cm/px", "cm/px", false, UnitsSettings::DistanceUnitsMeters, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, { "m/s", "m/s", true, UnitsSettings::SpeedUnitsMetersPerSecond, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, + { "C", "C", false, UnitsSettings::TemperatureUnitsCelsius, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, { "m^2", "m^2", false, UnitsSettings::AreaUnitsSquareMeters, FactMetaData::_defaultTranslator, FactMetaData::_defaultTranslator }, { "m", "ft", false, UnitsSettings::DistanceUnitsFeet, FactMetaData::_metersToFeet, FactMetaData::_feetToMeters }, { "meters", "ft", false, UnitsSettings::DistanceUnitsFeet, FactMetaData::_metersToFeet, FactMetaData::_feetToMeters }, @@ -59,6 +60,7 @@ const FactMetaData::AppSettingsTranslation_s FactMetaData::_rgAppSettingsTransla { "m/s", "mph", true, UnitsSettings::SpeedUnitsMilesPerHour, FactMetaData::_metersPerSecondToMilesPerHour, FactMetaData::_milesPerHourToMetersPerSecond }, { "m/s", "km/h", true, UnitsSettings::SpeedUnitsKilometersPerHour, FactMetaData::_metersPerSecondToKilometersPerHour, FactMetaData::_kilometersPerHourToMetersPerSecond }, { "m/s", "kn", true, UnitsSettings::SpeedUnitsKnots, FactMetaData::_metersPerSecondToKnots, FactMetaData::_knotsToMetersPerSecond }, + { "C", "F", false, UnitsSettings::TemperatureUnitsFarenheit, FactMetaData::_celsiusToFarenheit, FactMetaData::_farenheitToCelsius }, }; const char* FactMetaData::_decimalPlacesJsonKey = "decimalPlaces"; @@ -685,6 +687,16 @@ QVariant FactMetaData::_inchesToCentimeters(const QVariant& inches) return QVariant(inches.toDouble() * constants.inchesToCentimeters); } +QVariant FactMetaData::_celsiusToFarenheit(const QVariant& celsius) +{ + return QVariant(celsius.toDouble() * (9.0 / 5.0) + 32); +} + +QVariant FactMetaData::_farenheitToCelsius(const QVariant& farenheit) +{ + return QVariant((farenheit.toDouble() - 32) * (5.0 / 9.0)); +} + void FactMetaData::setRawUnits(const QString& rawUnits) { _rawUnits = rawUnits; @@ -774,9 +786,11 @@ void FactMetaData::_setAppSettingsTranslators(void) for (size_t i=0; irawUnits == _rawUnits.toLower() && + if ((pAppSettingsTranslation->rawUnits == _rawUnits && // Temperature + (!pAppSettingsTranslation->speed && pAppSettingsTranslation->speedOrDistanceUnits == qgcApp()->toolbox()->settingsManager()->unitsSettings()->temperatureUnits()->rawValue().toUInt())) || + (pAppSettingsTranslation->rawUnits == _rawUnits.toLower() && // Speed and Distance ((pAppSettingsTranslation->speed && pAppSettingsTranslation->speedOrDistanceUnits == qgcApp()->toolbox()->settingsManager()->unitsSettings()->speedUnits()->rawValue().toUInt()) || - (!pAppSettingsTranslation->speed && pAppSettingsTranslation->speedOrDistanceUnits == qgcApp()->toolbox()->settingsManager()->unitsSettings()->distanceUnits()->rawValue().toUInt()))) { + (!pAppSettingsTranslation->speed && pAppSettingsTranslation->speedOrDistanceUnits == qgcApp()->toolbox()->settingsManager()->unitsSettings()->distanceUnits()->rawValue().toUInt())))) { _cookedUnits = pAppSettingsTranslation->cookedUnits; setTranslators(pAppSettingsTranslation->rawTranslator, pAppSettingsTranslation->cookedTranslator); return; diff --git a/src/FactSystem/FactMetaData.h b/src/FactSystem/FactMetaData.h index c88ee72409e4ad7ce07678e4c040cbc1d1ae6f58..2dd480f77adc959c58cec94bb398a285686ef4eb 100644 --- a/src/FactSystem/FactMetaData.h +++ b/src/FactSystem/FactMetaData.h @@ -193,6 +193,8 @@ private: static QVariant _normToPercent(const QVariant& normalized); static QVariant _centimetersToInches(const QVariant& centimeters); static QVariant _inchesToCentimeters(const QVariant& inches); + static QVariant _celsiusToFarenheit(const QVariant& celsius); + static QVariant _farenheitToCelsius(const QVariant& farenheit); struct AppSettingsTranslation_s { const char* rawUnits; diff --git a/src/GPS/RTCM/RTCMMavlink.cc b/src/GPS/RTCM/RTCMMavlink.cc index d8f6c92df4ad2dc5d15e96edba5fac513f753151..e81dd2bff3cf98bebce3a16ccc31915a7e8b5a54 100644 --- a/src/GPS/RTCM/RTCMMavlink.cc +++ b/src/GPS/RTCM/RTCMMavlink.cc @@ -38,29 +38,26 @@ void RTCMMavlink::RTCMDataUpdate(QByteArray message) if (message.size() < maxMessageLength) { mavlinkRtcmData.len = message.size(); + mavlinkRtcmData.flags = (_sequenceId & 0x1F) << 3; memcpy(&mavlinkRtcmData.data, message.data(), message.size()); sendMessageToVehicle(mavlinkRtcmData); } else { // We need to fragment - static uint8_t sequenceId = 0; // Sequence id is used to indicate that the individual fragements belong to the same set uint8_t fragmentId = 0; // Fragment id indicates the fragment within a set - int start = 0; while (start < message.size()) { int length = std::min(message.size() - start, maxMessageLength); mavlinkRtcmData.flags = 1; // LSB set indicates message is fragmented mavlinkRtcmData.flags |= fragmentId++ << 1; // Next 2 bits are fragment id - mavlinkRtcmData.flags |= sequenceId++ << 3; // Next 5 bits are sequence id + mavlinkRtcmData.flags |= (_sequenceId & 0x1F) << 3; // Next 5 bits are sequence id mavlinkRtcmData.len = length; memcpy(&mavlinkRtcmData.data, message.data() + start, length); sendMessageToVehicle(mavlinkRtcmData); start += length; } - if (sequenceId == 0x1F) { - sequenceId = 0; - } } + ++_sequenceId; } void RTCMMavlink::sendMessageToVehicle(const mavlink_gps_rtcm_data_t& msg) diff --git a/src/GPS/RTCM/RTCMMavlink.h b/src/GPS/RTCM/RTCMMavlink.h index 6c59974e38809e2f72f0b6c9d97d9946ff01cd89..a568a2d36b82c374b99113b87482da7996ea95d7 100644 --- a/src/GPS/RTCM/RTCMMavlink.h +++ b/src/GPS/RTCM/RTCMMavlink.h @@ -36,4 +36,5 @@ private: QGCToolbox& _toolbox; QElapsedTimer _bandwidthTimer; int _bandwidthByteCounter = 0; + uint8_t _sequenceId = 0; }; diff --git a/src/Settings/UnitsSettings.cc b/src/Settings/UnitsSettings.cc index 0d5c6e0d6df29fd8ecaf43ea5839bb286874866b..cd5988891cbfadc336882b45e70f667bf769a0c9 100644 --- a/src/Settings/UnitsSettings.cc +++ b/src/Settings/UnitsSettings.cc @@ -16,12 +16,14 @@ const char* UnitsSettings::unitsSettingsGroupName = "Units"; const char* UnitsSettings::distanceUnitsSettingsName = "DistanceUnits"; const char* UnitsSettings::areaUnitsSettingsName = "AreaUnits"; const char* UnitsSettings::speedUnitsSettingsName = "SpeedUnits"; +const char* UnitsSettings::temperatureUnitsSettingsName = "TemperatureUnits"; UnitsSettings::UnitsSettings(QObject* parent) : SettingsGroup(unitsSettingsGroupName, QString() /* root settings group */, parent) , _distanceUnitsFact(NULL) , _areaUnitsFact(NULL) , _speedUnitsFact(NULL) + , _temperatureUnitsFact(NULL) { QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership); qmlRegisterUncreatableType("QGroundControl.SettingsManager", 1, 0, "UnitsSettings", "Reference only"); @@ -92,3 +94,24 @@ Fact* UnitsSettings::speedUnits(void) return _speedUnitsFact; } + +Fact* UnitsSettings::temperatureUnits(void) +{ + if (!_temperatureUnitsFact) { + // Units settings can't be loaded from json since it creates an infinite loop of meta data loading. + QStringList enumStrings; + QVariantList enumValues; + + enumStrings << "Celsius" << "Farenheit"; + enumValues << QVariant::fromValue((uint32_t)TemperatureUnitsCelsius) << QVariant::fromValue((uint32_t)TemperatureUnitsFarenheit); + + FactMetaData* metaData = new FactMetaData(FactMetaData::valueTypeUint32, this); + metaData->setName(temperatureUnitsSettingsName); + metaData->setEnumInfo(enumStrings, enumValues); + metaData->setRawDefaultValue(TemperatureUnitsCelsius); + + _temperatureUnitsFact = new SettingsFact(QString() /* no settings group */, metaData, this); + } + + return _temperatureUnitsFact; +} diff --git a/src/Settings/UnitsSettings.h b/src/Settings/UnitsSettings.h index 3ede8765a39cd7bd0bdd929ae9a7aec3d377c953..1d09201c5cc49533689ddb620e77b1c352a58300 100644 --- a/src/Settings/UnitsSettings.h +++ b/src/Settings/UnitsSettings.h @@ -41,28 +41,38 @@ public: SpeedUnitsKnots, }; + enum TemperatureUnits { + TemperatureUnitsCelsius = 0, + TemperatureUnitsFarenheit, + }; + Q_ENUMS(DistanceUnits) Q_ENUMS(AreaUnits) Q_ENUMS(SpeedUnits) + Q_ENUMS(TemperatureUnits) Q_PROPERTY(Fact* distanceUnits READ distanceUnits CONSTANT) Q_PROPERTY(Fact* areaUnits READ areaUnits CONSTANT) Q_PROPERTY(Fact* speedUnits READ speedUnits CONSTANT) + Q_PROPERTY(Fact* temperatureUnits READ temperatureUnits CONSTANT) Fact* distanceUnits (void); Fact* areaUnits (void); Fact* speedUnits (void); + Fact* temperatureUnits (void); static const char* unitsSettingsGroupName; static const char* distanceUnitsSettingsName; static const char* areaUnitsSettingsName; static const char* speedUnitsSettingsName; + static const char* temperatureUnitsSettingsName; private: SettingsFact* _distanceUnitsFact; SettingsFact* _areaUnitsFact; SettingsFact* _speedUnitsFact; + SettingsFact* _temperatureUnitsFact; }; #endif diff --git a/src/ui/preferences/GeneralSettings.qml b/src/ui/preferences/GeneralSettings.qml index cc853858727291c25c13194bfa825ca344399fcd..a4360b72fab2060b6971d52d5e22dac224c2be99 100644 --- a/src/ui/preferences/GeneralSettings.qml +++ b/src/ui/preferences/GeneralSettings.qml @@ -88,9 +88,9 @@ QGCView { Repeater { id: unitsRepeater - model: [ QGroundControl.settingsManager.unitsSettings.distanceUnits, QGroundControl.settingsManager.unitsSettings.areaUnits, QGroundControl.settingsManager.unitsSettings.speedUnits ] + model: [ QGroundControl.settingsManager.unitsSettings.distanceUnits, QGroundControl.settingsManager.unitsSettings.areaUnits, QGroundControl.settingsManager.unitsSettings.speedUnits, QGroundControl.settingsManager.unitsSettings.temperatureUnits ] - property var names: [ qsTr("Distance:"), qsTr("Area:"), qsTr("Speed:") ] + property var names: [ qsTr("Distance:"), qsTr("Area:"), qsTr("Speed:"), qsTr("Temperature:") ] Row { spacing: ScreenTools.defaultFontPixelWidth