Commit 62d7bd4c authored by DonLakeFlyer's avatar DonLakeFlyer

Show gimbal yaw on map

parent fbc34cc5
...@@ -29,10 +29,13 @@ MapQuickItem { ...@@ -29,10 +29,13 @@ MapQuickItem {
sourceItem: sourceItem:
MissionItemIndexLabel { MissionItemIndexLabel {
id: _label id: _label
checked: _isCurrentItem checked: _isCurrentItem
label: missionItem ? missionItem.abbreviation : "" label: missionItem ? missionItem.abbreviation : ""
onClicked: _item.clicked() gimbalYaw: missionItem.missionGimbalYaw
vehicleYaw: missionItem.missionVehicleYaw
showGimbalYaw: missionItem.showMissionGimbalYaw
onClicked: _item.clicked()
property bool _isCurrentItem: missionItem ? missionItem.isCurrentItem : false property bool _isCurrentItem: missionItem ? missionItem.isCurrentItem : false
} }
......
...@@ -115,9 +115,9 @@ Item { ...@@ -115,9 +115,9 @@ Item {
model: _missionItem.childItems model: _missionItem.childItems
delegate: MissionItemIndexLabel { delegate: MissionItemIndexLabel {
z: 2
label: object.abbreviation label: object.abbreviation
checked: object.isCurrentItem checked: object.isCurrentItem
z: 2
specifiesCoordinate: false specifiesCoordinate: false
onClicked: setCurrentItem(object.sequenceNumber) onClicked: setCurrentItem(object.sequenceNumber)
......
...@@ -55,6 +55,8 @@ CameraSection::CameraSection(QObject* parent) ...@@ -55,6 +55,8 @@ CameraSection::CameraSection(QObject* parent)
connect(&_gimbalYawFact, &Fact::valueChanged, this, &CameraSection::_setDirty); connect(&_gimbalYawFact, &Fact::valueChanged, this, &CameraSection::_setDirty);
connect(&_cameraPhotoIntervalDistanceFact, &Fact::valueChanged, this, &CameraSection::_setDirty); connect(&_cameraPhotoIntervalDistanceFact, &Fact::valueChanged, this, &CameraSection::_setDirty);
connect(&_cameraPhotoIntervalTimeFact, &Fact::valueChanged, this, &CameraSection::_setDirty); connect(&_cameraPhotoIntervalTimeFact, &Fact::valueChanged, this, &CameraSection::_setDirty);
connect(&_gimbalYawFact, &Fact::valueChanged, this, &CameraSection::_updateSpecifiedGimbalYaw);
} }
void CameraSection::setSpecifyGimbal(bool specifyGimbal) void CameraSection::setSpecifyGimbal(bool specifyGimbal)
...@@ -254,3 +256,13 @@ void CameraSection::setAvailable(bool available) ...@@ -254,3 +256,13 @@ void CameraSection::setAvailable(bool available)
emit availableChanged(available); emit availableChanged(available);
} }
} }
double CameraSection::specifiedGimbalYaw(void) const
{
return _specifyGimbal ? _gimbalYawFact.rawValue().toDouble() : std::numeric_limits<double>::quiet_NaN();
}
void CameraSection::_updateSpecifiedGimbalYaw(void)
{
emit specifiedGimbalYawChanged(specifiedGimbalYaw());
}
...@@ -49,6 +49,9 @@ public: ...@@ -49,6 +49,9 @@ public:
Fact* cameraPhotoIntervalTime (void) { return &_cameraPhotoIntervalTimeFact; } Fact* cameraPhotoIntervalTime (void) { return &_cameraPhotoIntervalTimeFact; }
Fact* cameraPhotoIntervalDistance (void) { return &_cameraPhotoIntervalDistanceFact; } Fact* cameraPhotoIntervalDistance (void) { return &_cameraPhotoIntervalDistanceFact; }
///< @return The gimbal yaw specified by this item, NaN if not specified
double specifiedGimbalYaw(void) const;
/// Scans the loaded items for the section items /// Scans the loaded items for the section items
/// @param visualItems Item list /// @param visualItems Item list
/// @param scanIndex Index to start scanning from /// @param scanIndex Index to start scanning from
...@@ -75,10 +78,12 @@ signals: ...@@ -75,10 +78,12 @@ signals:
void dirtyChanged (bool dirty); void dirtyChanged (bool dirty);
bool specifyGimbalChanged (bool specifyGimbal); bool specifyGimbalChanged (bool specifyGimbal);
void missionItemCountChanged (int missionItemCount); void missionItemCountChanged (int missionItemCount);
void specifiedGimbalYawChanged (double gimbalYaw);
private slots: private slots:
void _setDirty(void); void _setDirty(void);
void _setDirtyAndUpdateMissionItemCount(void); void _setDirtyAndUpdateMissionItemCount(void);
void _updateSpecifiedGimbalYaw(void);
private: private:
bool _available; bool _available;
......
...@@ -38,9 +38,6 @@ public: ...@@ -38,9 +38,6 @@ public:
/// @return the greatest distance from any point of the complex item to some coordinate /// @return the greatest distance from any point of the complex item to some coordinate
virtual double greatestDistanceTo(const QGeoCoordinate &other) const = 0; virtual double greatestDistanceTo(const QGeoCoordinate &other) const = 0;
/// Informs the complex item of the cruise speed it will fly at
virtual void setCruiseSpeed(double cruiseSpeed) = 0;
/// This mission item attribute specifies the type of the complex item. /// This mission item attribute specifies the type of the complex item.
static const char* jsonComplexItemTypeKey; static const char* jsonComplexItemTypeKey;
......
...@@ -250,12 +250,6 @@ double FixedWingLandingComplexItem::complexDistance(void) const ...@@ -250,12 +250,6 @@ double FixedWingLandingComplexItem::complexDistance(void) const
return _loiterCoordinate.distanceTo(_landingCoordinate); return _loiterCoordinate.distanceTo(_landingCoordinate);
} }
void FixedWingLandingComplexItem::setCruiseSpeed(double cruiseSpeed)
{
// We don't care about cruise speed
Q_UNUSED(cruiseSpeed);
}
void FixedWingLandingComplexItem::setLandingCoordinate(const QGeoCoordinate& coordinate) void FixedWingLandingComplexItem::setLandingCoordinate(const QGeoCoordinate& coordinate)
{ {
if (coordinate != _landingCoordinate) { if (coordinate != _landingCoordinate) {
......
...@@ -55,7 +55,6 @@ public: ...@@ -55,7 +55,6 @@ public:
int lastSequenceNumber (void) const final; int lastSequenceNumber (void) const final;
bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final; bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final;
double greatestDistanceTo (const QGeoCoordinate &other) const final; double greatestDistanceTo (const QGeoCoordinate &other) const final;
void setCruiseSpeed (double cruiseSpeed) final;
QString mapVisualQML (void) const final { return QStringLiteral("FWLandingPatternMapVisual.qml"); } QString mapVisualQML (void) const final { return QStringLiteral("FWLandingPatternMapVisual.qml"); }
// Overrides from VisualMissionItem // Overrides from VisualMissionItem
...@@ -71,7 +70,8 @@ public: ...@@ -71,7 +70,8 @@ public:
QGeoCoordinate coordinate (void) const final { return _loiterCoordinate; } QGeoCoordinate coordinate (void) const final { return _loiterCoordinate; }
QGeoCoordinate exitCoordinate (void) const final { return _landingCoordinate; } QGeoCoordinate exitCoordinate (void) const final { return _landingCoordinate; }
int sequenceNumber (void) const final { return _sequenceNumber; } int sequenceNumber (void) const final { return _sequenceNumber; }
double flightSpeed (void) final { return std::numeric_limits<double>::quiet_NaN(); } double specifiedFlightSpeed (void) final { return std::numeric_limits<double>::quiet_NaN(); }
double specifiedGimbalYaw (void) final { return std::numeric_limits<double>::quiet_NaN(); }
void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final; void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final;
bool coordinateHasRelativeAltitude (void) const final { return true; } bool coordinateHasRelativeAltitude (void) const final { return true; }
......
This diff is collapsed.
...@@ -16,11 +16,11 @@ ...@@ -16,11 +16,11 @@
#include "Vehicle.h" #include "Vehicle.h"
#include "QGCLoggingCategory.h" #include "QGCLoggingCategory.h"
#include "MavlinkQmlSingleton.h" #include "MavlinkQmlSingleton.h"
#include "VisualMissionItem.h"
#include <QHash> #include <QHash>
class CoordinateVector; class CoordinateVector;
class VisualMissionItem;
Q_DECLARE_LOGGING_CATEGORY(MissionControllerLog) Q_DECLARE_LOGGING_CATEGORY(MissionControllerLog)
...@@ -34,6 +34,20 @@ public: ...@@ -34,6 +34,20 @@ public:
MissionController(QObject* parent = NULL); MissionController(QObject* parent = NULL);
~MissionController(); ~MissionController();
typedef struct {
double maxTelemetryDistance;
double totalDistance;
double totalTime;
double hoverDistance;
double hoverTime;
double cruiseDistance;
double cruiseTime;
double cruiseSpeed;
double hoverSpeed;
double vehicleSpeed; //</ Either cruise or hover speed based on vehicle type and vtol state
double gimbalYaw; ///< NaN signals yaw was never changed
} MissionFlightStatus_t;
// Mission settings // Mission settings
Q_PROPERTY(QGeoCoordinate plannedHomePosition READ plannedHomePosition NOTIFY plannedHomePositionChanged) Q_PROPERTY(QGeoCoordinate plannedHomePosition READ plannedHomePosition NOTIFY plannedHomePositionChanged)
Q_PROPERTY(QmlObjectListModel* visualItems READ visualItems NOTIFY visualItemsChanged) Q_PROPERTY(QmlObjectListModel* visualItems READ visualItems NOTIFY visualItemsChanged)
...@@ -94,15 +108,13 @@ public: ...@@ -94,15 +108,13 @@ public:
QmlObjectListModel* visualItems (void) { return _visualItems; } QmlObjectListModel* visualItems (void) { return _visualItems; }
QmlObjectListModel* waypointLines (void) { return &_waypointLines; } QmlObjectListModel* waypointLines (void) { return &_waypointLines; }
double missionDistance (void) const { return _missionDistance; } double missionDistance (void) const { return _missionFlightStatus.totalDistance; }
double missionTime (void) const { return _missionTime; } double missionTime (void) const { return _missionFlightStatus.totalTime; }
double missionHoverDistance (void) const { return _missionHoverDistance; } double missionHoverDistance (void) const { return _missionFlightStatus.hoverDistance; }
double missionHoverTime (void) const { return _missionHoverTime; } double missionHoverTime (void) const { return _missionFlightStatus.hoverTime; }
double missionCruiseDistance (void) const { return _missionCruiseDistance; } double missionCruiseDistance (void) const { return _missionFlightStatus.cruiseDistance; }
double missionCruiseTime (void) const { return _missionCruiseTime; } double missionCruiseTime (void) const { return _missionFlightStatus.cruiseTime; }
double missionMaxTelemetry (void) const { return _missionMaxTelemetry; } double missionMaxTelemetry (void) const { return _missionFlightStatus.maxTelemetryDistance; }
double cruiseSpeed (void) const;
double hoverSpeed (void) const;
signals: signals:
void plannedHomePositionChanged(QGeoCoordinate plannedHomePosition); void plannedHomePositionChanged(QGeoCoordinate plannedHomePosition);
...@@ -116,10 +128,6 @@ signals: ...@@ -116,10 +128,6 @@ signals:
void missionCruiseDistanceChanged(double missionCruiseDistance); void missionCruiseDistanceChanged(double missionCruiseDistance);
void missionCruiseTimeChanged(void); void missionCruiseTimeChanged(void);
void missionMaxTelemetryChanged(double missionMaxTelemetry); void missionMaxTelemetryChanged(double missionMaxTelemetry);
void cruiseDistanceChanged(double cruiseDistance);
void hoverDistanceChanged(double hoverDistance);
void cruiseSpeedChanged(double cruiseSpeed);
void hoverSpeedChanged(double hoverSpeed);
private slots: private slots:
void _newMissionItemsAvailableFromVehicle(); void _newMissionItemsAvailableFromVehicle();
...@@ -129,7 +137,7 @@ private slots: ...@@ -129,7 +137,7 @@ private slots:
void _inProgressChanged(bool inProgress); void _inProgressChanged(bool inProgress);
void _currentMissionItemChanged(int sequenceNumber); void _currentMissionItemChanged(int sequenceNumber);
void _recalcWaypointLines(void); void _recalcWaypointLines(void);
void _recalcAltitudeRangeBearing(void); void _recalcMissionFlightStatus(void);
void _homeCoordinateChanged(void); void _homeCoordinateChanged(void);
private: private:
...@@ -167,22 +175,16 @@ private: ...@@ -167,22 +175,16 @@ private:
void _activeVehicleSet(void) final; void _activeVehicleSet(void) final;
private: private:
QmlObjectListModel* _visualItems; QmlObjectListModel* _visualItems;
QmlObjectListModel _waypointLines; QmlObjectListModel _waypointLines;
CoordVectHashTable _linesTable; CoordVectHashTable _linesTable;
bool _firstItemsFromVehicle; bool _firstItemsFromVehicle;
bool _missionItemsRequested; bool _missionItemsRequested;
bool _queuedSend; bool _queuedSend;
double _missionDistance; MissionFlightStatus_t _missionFlightStatus;
double _missionTime; QString _surveyMissionItemName;
double _missionHoverDistance; QString _fwLandingMissionItemName;
double _missionHoverTime; QStringList _complexMissionItemNames;
double _missionCruiseDistance;
double _missionCruiseTime;
double _missionMaxTelemetry;
QString _surveyMissionItemName;
QString _fwLandingMissionItemName;
QStringList _complexMissionItemNames;
static const char* _settingsGroup; static const char* _settingsGroup;
......
...@@ -53,6 +53,7 @@ MissionItem::MissionItem(QObject* parent) ...@@ -53,6 +53,7 @@ MissionItem::MissionItem(QObject* parent)
setAutoContinue(true); setAutoContinue(true);
connect(&_param2Fact, &Fact::rawValueChanged, this, &MissionItem::_param2Changed); connect(&_param2Fact, &Fact::rawValueChanged, this, &MissionItem::_param2Changed);
connect(&_param3Fact, &Fact::rawValueChanged, this, &MissionItem::_param3Changed);
} }
MissionItem::MissionItem(int sequenceNumber, MissionItem::MissionItem(int sequenceNumber,
...@@ -99,6 +100,7 @@ MissionItem::MissionItem(int sequenceNumber, ...@@ -99,6 +100,7 @@ MissionItem::MissionItem(int sequenceNumber,
_param7Fact.setRawValue(param7); _param7Fact.setRawValue(param7);
connect(&_param2Fact, &Fact::rawValueChanged, this, &MissionItem::_param2Changed); connect(&_param2Fact, &Fact::rawValueChanged, this, &MissionItem::_param2Changed);
connect(&_param3Fact, &Fact::rawValueChanged, this, &MissionItem::_param3Changed);
} }
MissionItem::MissionItem(const MissionItem& other, QObject* parent) MissionItem::MissionItem(const MissionItem& other, QObject* parent)
...@@ -123,6 +125,7 @@ MissionItem::MissionItem(const MissionItem& other, QObject* parent) ...@@ -123,6 +125,7 @@ MissionItem::MissionItem(const MissionItem& other, QObject* parent)
*this = other; *this = other;
connect(&_param2Fact, &Fact::rawValueChanged, this, &MissionItem::_param2Changed); connect(&_param2Fact, &Fact::rawValueChanged, this, &MissionItem::_param2Changed);
connect(&_param3Fact, &Fact::rawValueChanged, this, &MissionItem::_param3Changed);
} }
const MissionItem& MissionItem::operator=(const MissionItem& other) const MissionItem& MissionItem::operator=(const MissionItem& other)
...@@ -384,7 +387,7 @@ QGeoCoordinate MissionItem::coordinate(void) const ...@@ -384,7 +387,7 @@ QGeoCoordinate MissionItem::coordinate(void) const
return QGeoCoordinate(param5(), param6(), param7()); return QGeoCoordinate(param5(), param6(), param7());
} }
double MissionItem::flightSpeed(void) const double MissionItem::specifiedFlightSpeed(void) const
{ {
double flightSpeed = std::numeric_limits<double>::quiet_NaN(); double flightSpeed = std::numeric_limits<double>::quiet_NaN();
...@@ -395,9 +398,33 @@ double MissionItem::flightSpeed(void) const ...@@ -395,9 +398,33 @@ double MissionItem::flightSpeed(void) const
return flightSpeed; return flightSpeed;
} }
double MissionItem::specifiedGimbalYaw(void) const
{
double gimbalYaw = std::numeric_limits<double>::quiet_NaN();
if (_commandFact.rawValue().toInt() == MAV_CMD_DO_MOUNT_CONTROL && _param7Fact.rawValue().toInt() == MAV_MOUNT_MODE_MAVLINK_TARGETING) {
gimbalYaw = _param3Fact.rawValue().toDouble();
}
return gimbalYaw;
}
void MissionItem::_param2Changed(QVariant value) void MissionItem::_param2Changed(QVariant value)
{ {
if (_commandFact.rawValue().toInt() == MAV_CMD_DO_CHANGE_SPEED && _param2Fact.rawValue().toDouble() > 0) { Q_UNUSED(value);
emit flightSpeedChanged(value.toDouble());
double flightSpeed = specifiedFlightSpeed();
if (!qIsNaN(flightSpeed)) {
emit specifiedFlightSpeedChanged(flightSpeed);
}
}
void MissionItem::_param3Changed(QVariant value)
{
Q_UNUSED(value);
double gimbalYaw = specifiedGimbalYaw();
if (!qIsNaN(gimbalYaw)) {
emit specifiedGimbalYawChanged(gimbalYaw);
} }
} }
...@@ -77,7 +77,10 @@ public: ...@@ -77,7 +77,10 @@ public:
int doJumpId (void) const { return _doJumpId; } int doJumpId (void) const { return _doJumpId; }
/// @return Flight speed change value if this item supports it. If not it returns NaN. /// @return Flight speed change value if this item supports it. If not it returns NaN.
double flightSpeed (void) const; double specifiedFlightSpeed(void) const;
/// @return Flight gimbal yaw change value if this item supports it. If not it returns NaN.
double specifiedGimbalYaw(void) const;
void setCommand (MAV_CMD command); void setCommand (MAV_CMD command);
void setSequenceNumber (int sequenceNumber); void setSequenceNumber (int sequenceNumber);
...@@ -100,13 +103,15 @@ public: ...@@ -100,13 +103,15 @@ public:
bool relativeAltitude(void) const { return frame() == MAV_FRAME_GLOBAL_RELATIVE_ALT; } bool relativeAltitude(void) const { return frame() == MAV_FRAME_GLOBAL_RELATIVE_ALT; }
signals: signals:
void isCurrentItemChanged (bool isCurrentItem); void isCurrentItemChanged (bool isCurrentItem);
void sequenceNumberChanged (int sequenceNumber); void sequenceNumberChanged (int sequenceNumber);
void flightSpeedChanged (double flightSpeed); void specifiedFlightSpeedChanged(double flightSpeed);
void specifiedGimbalYawChanged (double gimbalYaw);
private slots: private slots:
void _param2Changed (QVariant value); void _param2Changed (QVariant value);
void _param3Changed (QVariant value);
private: private:
bool _convertJsonV1ToV2(const QJsonObject& json, QJsonObject& v2Json, QString& errorString); bool _convertJsonV1ToV2(const QJsonObject& json, QJsonObject& v2Json, QString& errorString);
......
...@@ -76,6 +76,10 @@ MissionSettingsComplexItem::MissionSettingsComplexItem(Vehicle* vehicle, QObject ...@@ -76,6 +76,10 @@ MissionSettingsComplexItem::MissionSettingsComplexItem(Vehicle* vehicle, QObject
connect(&_missionEndActionFact, &Fact::valueChanged, this, &MissionSettingsComplexItem::_setDirty); connect(&_missionEndActionFact, &Fact::valueChanged, this, &MissionSettingsComplexItem::_setDirty);
connect(&_cameraSection, &CameraSection::dirtyChanged, this, &MissionSettingsComplexItem::_cameraSectionDirtyChanged); connect(&_cameraSection, &CameraSection::dirtyChanged, this, &MissionSettingsComplexItem::_cameraSectionDirtyChanged);
connect(&_missionFlightSpeedFact, &Fact::valueChanged, this, &MissionSettingsComplexItem::specifiedFlightSpeedChanged);
connect(&_cameraSection, &CameraSection::specifyGimbalChanged, this, &MissionSettingsComplexItem::specifiedGimbalYawChanged);
connect(&_cameraSection, &CameraSection::specifiedGimbalYawChanged, this, &MissionSettingsComplexItem::specifiedGimbalYawChanged);
} }
...@@ -266,12 +270,6 @@ double MissionSettingsComplexItem::complexDistance(void) const ...@@ -266,12 +270,6 @@ double MissionSettingsComplexItem::complexDistance(void) const
return 0; return 0;
} }
void MissionSettingsComplexItem::setCruiseSpeed(double cruiseSpeed)
{
// We don't care about cruise speed
Q_UNUSED(cruiseSpeed);
}
void MissionSettingsComplexItem::_setDirty(void) void MissionSettingsComplexItem::_setDirty(void)
{ {
setDirty(true); setDirty(true);
...@@ -310,3 +308,13 @@ void MissionSettingsComplexItem::_cameraSectionDirtyChanged(bool dirty) ...@@ -310,3 +308,13 @@ void MissionSettingsComplexItem::_cameraSectionDirtyChanged(bool dirty)
setDirty(true); setDirty(true);
} }
} }
double MissionSettingsComplexItem::specifiedFlightSpeed(void)
{
return _specifyMissionFlightSpeed ? _missionFlightSpeedFact.rawValue().toDouble() : std::numeric_limits<double>::quiet_NaN();
}
double MissionSettingsComplexItem::specifiedGimbalYaw(void)
{
return _cameraSection.specifyGimbal() ? _cameraSection.gimbalYaw()->rawValue().toDouble() : std::numeric_limits<double>::quiet_NaN();
}
...@@ -60,7 +60,6 @@ public: ...@@ -60,7 +60,6 @@ public:
int lastSequenceNumber (void) const final; int lastSequenceNumber (void) const final;
bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final; bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final;
double greatestDistanceTo (const QGeoCoordinate &other) const final; double greatestDistanceTo (const QGeoCoordinate &other) const final;
void setCruiseSpeed (double cruiseSpeed) final;
QString mapVisualQML (void) const final { return QStringLiteral("MissionSettingsMapVisual.qml"); } QString mapVisualQML (void) const final { return QStringLiteral("MissionSettingsMapVisual.qml"); }
// Overrides from VisualMissionItem // Overrides from VisualMissionItem
...@@ -76,7 +75,8 @@ public: ...@@ -76,7 +75,8 @@ public:
QGeoCoordinate coordinate (void) const final; QGeoCoordinate coordinate (void) const final;
QGeoCoordinate exitCoordinate (void) const final { return coordinate(); } QGeoCoordinate exitCoordinate (void) const final { return coordinate(); }
int sequenceNumber (void) const final { return _sequenceNumber; } int sequenceNumber (void) const final { return _sequenceNumber; }
double flightSpeed (void) final { return std::numeric_limits<double>::quiet_NaN(); } double specifiedFlightSpeed (void) final;
double specifiedGimbalYaw (void) final;
void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final; void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final;
bool coordinateHasRelativeAltitude (void) const final { return true; } bool coordinateHasRelativeAltitude (void) const final { return true; }
...@@ -94,10 +94,10 @@ signals: ...@@ -94,10 +94,10 @@ signals:
bool specifyMissionFlightSpeedChanged(bool specifyMissionFlightSpeed); bool specifyMissionFlightSpeedChanged(bool specifyMissionFlightSpeed);
private slots: private slots:
void _setDirtyAndUpdateLastSequenceNumber(void); void _setDirtyAndUpdateLastSequenceNumber (void);
void _setDirtyAndUpdateCoordinate(void); void _setDirtyAndUpdateCoordinate (void);
void _setDirty(void); void _setDirty (void);
void _cameraSectionDirtyChanged(bool dirty); void _cameraSectionDirtyChanged (bool dirty);
private: private:
bool _specifyMissionFlightSpeed; bool _specifyMissionFlightSpeed;
......
...@@ -75,7 +75,7 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, QObject* parent) ...@@ -75,7 +75,7 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, QObject* parent)
setDefaultsForCommand(); setDefaultsForCommand();
connect(&_missionItem, &MissionItem::flightSpeedChanged, this, &SimpleMissionItem::flightSpeedChanged); connect(&_missionItem, &MissionItem::specifiedFlightSpeedChanged, this, &SimpleMissionItem::specifiedFlightSpeedChanged);
connect(this, &SimpleMissionItem::sequenceNumberChanged, this, &SimpleMissionItem::lastSequenceNumberChanged); connect(this, &SimpleMissionItem::sequenceNumberChanged, this, &SimpleMissionItem::lastSequenceNumberChanged);
connect(this, &SimpleMissionItem::cameraSectionChanged, this, &SimpleMissionItem::_setDirtyFromSignal); connect(this, &SimpleMissionItem::cameraSectionChanged, this, &SimpleMissionItem::_setDirtyFromSignal);
...@@ -637,9 +637,14 @@ void SimpleMissionItem::setSequenceNumber(int sequenceNumber) ...@@ -637,9 +637,14 @@ void SimpleMissionItem::setSequenceNumber(int sequenceNumber)
} }
} }
double SimpleMissionItem::flightSpeed(void) double SimpleMissionItem::specifiedFlightSpeed(void)
{ {
return missionItem().flightSpeed(); return missionItem().specifiedFlightSpeed();
}
double SimpleMissionItem::specifiedGimbalYaw(void)
{
return _cameraSection->available() ? _cameraSection->specifiedGimbalYaw() : missionItem().specifiedGimbalYaw();
} }
void SimpleMissionItem::scanForSections(QmlObjectListModel* visualItems, int scanIndex, Vehicle* vehicle) void SimpleMissionItem::scanForSections(QmlObjectListModel* visualItems, int scanIndex, Vehicle* vehicle)
...@@ -671,7 +676,10 @@ void SimpleMissionItem::_updateCameraSection(void) ...@@ -671,7 +676,10 @@ void SimpleMissionItem::_updateCameraSection(void)
connect(_cameraSection, &CameraSection::dirtyChanged, this, &SimpleMissionItem::_cameraSectionDirtyChanged); connect(_cameraSection, &CameraSection::dirtyChanged, this, &SimpleMissionItem::_cameraSectionDirtyChanged);
connect(_cameraSection, &CameraSection::availableChanged, this, &SimpleMissionItem::_updateLastSequenceNumber); connect(_cameraSection, &CameraSection::availableChanged, this, &SimpleMissionItem::_updateLastSequenceNumber);
connect(_cameraSection, &CameraSection::missionItemCountChanged, this, &SimpleMissionItem::_updateLastSequenceNumber); connect(_cameraSection, &CameraSection::missionItemCountChanged, this, &SimpleMissionItem::_updateLastSequenceNumber);
connect(_cameraSection, &CameraSection::availableChanged, this, &SimpleMissionItem::specifiedGimbalYawChanged);
connect(_cameraSection, &CameraSection::specifyGimbalChanged, this, &SimpleMissionItem::specifiedGimbalYawChanged);
connect(_cameraSection, &CameraSection::specifiedGimbalYawChanged, this, &SimpleMissionItem::specifiedGimbalYawChanged);
emit cameraSectionChanged(_cameraSection); emit cameraSectionChanged(_cameraSection);
} }
......
...@@ -94,7 +94,8 @@ public: ...@@ -94,7 +94,8 @@ public:
QGeoCoordinate coordinate (void) const final { return _missionItem.coordinate(); } QGeoCoordinate coordinate (void) const final { return _missionItem.coordinate(); }
QGeoCoordinate exitCoordinate (void) const final { return coordinate(); } QGeoCoordinate exitCoordinate (void) const final { return coordinate(); }
int sequenceNumber (void) const final { return _missionItem.sequenceNumber(); } int sequenceNumber (void) const final { return _missionItem.sequenceNumber(); }
double flightSpeed (void) final; double specifiedFlightSpeed (void) final;
double specifiedGimbalYaw (void) final;
QString mapVisualQML (void) const final { return QStringLiteral("SimpleItemMapVisual.qml"); } QString mapVisualQML (void) const final { return QStringLiteral("SimpleItemMapVisual.qml"); }
void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final; void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final;
......
...@@ -122,12 +122,6 @@ SurveyMissionItem::SurveyMissionItem(Vehicle* vehicle, QObject* parent) ...@@ -122,12 +122,6 @@ SurveyMissionItem::SurveyMissionItem(Vehicle* vehicle, QObject* parent)
connect(&_cameraTriggerFact, &Fact::valueChanged, this, &SurveyMissionItem::_cameraTriggerChanged); connect(&_cameraTriggerFact, &Fact::valueChanged, this, &SurveyMissionItem::_cameraTriggerChanged);
connect(&_cameraTriggerDistanceFact, &Fact::valueChanged, this, &SurveyMissionItem::timeBetweenShotsChanged); connect(&_cameraTriggerDistanceFact, &Fact::valueChanged, this, &SurveyMissionItem::timeBetweenShotsChanged);
// NULL check since object creation during unit testing passes NULL for vehicle
if (_vehicle) {
connect(_vehicle, &Vehicle::cruiseSpeedChanged, this, &SurveyMissionItem::timeBetweenShotsChanged);
connect(_vehicle, &Vehicle::hoverSpeedChanged, this, &SurveyMissionItem::timeBetweenShotsChanged);
}
} }
void SurveyMissionItem::_setSurveyDistance(double surveyDistance) void SurveyMissionItem::_setSurveyDistance(double surveyDistance)
...@@ -894,10 +888,11 @@ double SurveyMissionItem::timeBetweenShots(void) const ...@@ -894,10 +888,11 @@ double SurveyMissionItem::timeBetweenShots(void) const
return _cruiseSpeed == 0 ? 0 : _cameraTriggerDistanceFact.rawValue().toDouble() / _cruiseSpeed; return _cruiseSpeed == 0 ? 0 : _cameraTriggerDistanceFact.rawValue().toDouble() / _cruiseSpeed;
} }
void SurveyMissionItem::setCruiseSpeed(double cruiseSpeed) void SurveyMissionItem::setMissionFlightStatus (MissionController::MissionFlightStatus_t& missionFlightStatus)
{ {
if (!qFuzzyCompare(_cruiseSpeed, cruiseSpeed)) { ComplexMissionItem::setMissionFlightStatus(missionFlightStatus);
_cruiseSpeed = cruiseSpeed; if (!qFuzzyCompare(_cruiseSpeed, missionFlightStatus.vehicleSpeed)) {
_cruiseSpeed = missionFlightStatus.vehicleSpeed;
emit timeBetweenShotsChanged(); emit timeBetweenShotsChanged();
} }
} }
...@@ -100,7 +100,6 @@ public: ...@@ -100,7 +100,6 @@ public:
int lastSequenceNumber (void) const final; int lastSequenceNumber (void) const final;
bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final; bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final;
double greatestDistanceTo (const QGeoCoordinate &other) const final; double greatestDistanceTo (const QGeoCoordinate &other) const final;
void setCruiseSpeed (double cruiseSpeed) final;
QString mapVisualQML (void) const final { return QStringLiteral("SurveyMapVisual.qml"); } QString mapVisualQML (void) const final { return QStringLiteral("SurveyMapVisual.qml"); }
...@@ -117,8 +116,10 @@ public: ...@@ -117,8 +116,10 @@ public:
QGeoCoordinate coordinate (void) const final { return _coordinate; } QGeoCoordinate coordinate (void) const final { return _coordinate; }
QGeoCoordinate exitCoordinate (void) const final { return _exitCoordinate; } QGeoCoordinate exitCoordinate (void) const final { return _exitCoordinate; }
int sequenceNumber (void) const final { return _sequenceNumber; } int sequenceNumber (void) const final { return _sequenceNumber; }
double flightSpeed (void) final { return std::numeric_limits<double>::quiet_NaN(); } double specifiedFlightSpeed (void) final { return std::numeric_limits<double>::quiet_NaN(); }
double specifiedGimbalYaw (void) final { return std::numeric_limits<double>::quiet_NaN(); }
void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final; void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final;
void setMissionFlightStatus (MissionController::MissionFlightStatus_t& missionFlightStatus) final;
bool coordinateHasRelativeAltitude (void) const final { return _gridAltitudeRelativeFact.rawValue().toBool(); } bool coordinateHasRelativeAltitude (void) const final { return _gridAltitudeRelativeFact.rawValue().toBool(); }
bool exitCoordinateHasRelativeAltitude (void) const final { return _gridAltitudeRelativeFact.rawValue().toBool(); } bool exitCoordinateHasRelativeAltitude (void) const final { return _gridAltitudeRelativeFact.rawValue().toBool(); }
......
...@@ -31,6 +31,8 @@ VisualMissionItem::VisualMissionItem(Vehicle* vehicle, QObject* parent) ...@@ -31,6 +31,8 @@ VisualMissionItem::VisualMissionItem(Vehicle* vehicle, QObject* parent)
, _altPercent(0.0) , _altPercent(0.0)
, _azimuth(0.0) , _azimuth(0.0)
, _distance(0.0) , _distance(0.0)
, _missionGimbalYaw(std::numeric_limits<double>::quiet_NaN())
, _missionVehicleYaw(std::numeric_limits<double>::quiet_NaN())
{ {
} }
...@@ -117,3 +119,20 @@ void VisualMissionItem::setShowHomePosition(bool showHomePosition) ...@@ -117,3 +119,20 @@ void VisualMissionItem::setShowHomePosition(bool showHomePosition)
emit showHomePositionChanged(_showHomePosition); emit showHomePositionChanged(_showHomePosition);
} }
} }
void VisualMissionItem::setMissionFlightStatus(MissionController::MissionFlightStatus_t& missionFlightStatus)
{
_missionFlightStatus = missionFlightStatus;
if (_missionFlightStatus.gimbalYaw != _missionGimbalYaw) {
_missionGimbalYaw = _missionFlightStatus.gimbalYaw;
emit missionGimbalYawChanged(_missionGimbalYaw);
}
}
void VisualMissionItem::setMissionVehicleYaw(double vehicleYaw)
{
if (!qFuzzyCompare(_missionVehicleYaw, vehicleYaw)) {
_missionVehicleYaw = vehicleYaw;
emit missionVehicleYawChanged(_missionVehicleYaw);
}
}
This diff is collapsed.
...@@ -7,34 +7,71 @@ import QGroundControl.Palette 1.0 ...@@ -7,34 +7,71 @@ import QGroundControl.Palette 1.0
Canvas { Canvas {
id: root id: root
width: _width + (_singleChar ? 0 : _label.width) width: _width
height: specifiesCoordinate ? (_width * 1.5) : _width height: width
signal clicked signal clicked
property alias label: _label.text property string label
property bool checked: false property bool checked: false
property bool small: false property bool small: false
property var color: checked ? "green" : qgcPal.mapButtonHighlight property var color: checked ? "green" : qgcPal.mapButtonHighlight
property real anchorPointX: _width / 2 property real anchorPointX: _width / 2
property real anchorPointY: _width * 1.5 property real anchorPointY: _width / 2
property bool specifiesCoordinate: true property bool specifiesCoordinate: true
property real gimbalYaw
property real vehicleYaw
property bool showGimbalYaw: false
property real _width: small ? ScreenTools.defaultFontPixelHeight * ScreenTools.smallFontPointRatio * 1.25 : ScreenTools.defaultFontPixelHeight * 1.25 property real _width: showGimbalYaw ? _gimbalYawRadius * 2 : _indicatorRadius * 2
property bool _singleChar: _label.text.length <= 1 property bool _singleChar: _label.text.length <= 1
property real _gimbalYawRadius: ScreenTools.defaultFontPixelHeight
property real _indicatorRadius: small ? (ScreenTools.defaultFontPixelHeight * ScreenTools.smallFontPointRatio * 1.25 / 2) : (ScreenTools.defaultFontPixelHeight * 0.66)
property real _gimbalRadians: degreesToRadians(vehicleYaw + gimbalYaw - 90)
onColorChanged: requestPaint()
onColorChanged: requestPaint() onShowGimbalYawChanged: requestPaint()
onGimbalYawChanged: requestPaint()
onVehicleYawChanged: requestPaint()
QGCPalette { id: qgcPal } QGCPalette { id: qgcPal }
function degreesToRadians(degrees) {
return (Math.PI/180)*degrees
}
function paintGimbalYaw(context) {
if (showGimbalYaw) {
context.save()
context.globalAlpha = 0.75
context.beginPath()
context.moveTo(anchorPointX, anchorPointY)
context.arc(anchorPointX, anchorPointY, _gimbalYawRadius, _gimbalRadians + degreesToRadians(45), _gimbalRadians + degreesToRadians(-45), true /* clockwise */)
context.closePath()
context.fillStyle = "white"
context.fill()
context.restore()
}
}
function paintSingleCoordinate(context) { function paintSingleCoordinate(context) {
context.beginPath()
context.arc(_width / 2, _width / 2, _width / 2, (Math.PI / 8) * 7, Math.PI / 8); context.arc(_width / 2, _width / 2, _width / 2, (Math.PI / 8) * 7, Math.PI / 8);
context.lineTo(_width / 2, _width * 1.5) context.lineTo(_width / 2, _width * 1.5)
context.closePath()
context.fillStyle = color
context.fill()
} }
function paintSingleNoCoordinate(context) { function paintSingleNoCoordinate(context) {
context.arc(_width / 2, _width / 2, _width / 2, Math.PI * 2, 0); context.save()
context.beginPath()
context.translate(anchorPointX, anchorPointY)
context.arc(0, 0, _indicatorRadius, Math.PI * 2, 0);
context.closePath()
context.fillStyle = color
context.fill()
context.restore()
} }
function paintMultipleCoordinate(context) { function paintMultipleCoordinate(context) {
...@@ -47,8 +84,9 @@ Canvas { ...@@ -47,8 +84,9 @@ Canvas {
onPaint: { onPaint: {
var context = getContext("2d") var context = getContext("2d")
context.reset() context.clearRect(0, 0, width, height)
context.beginPath() paintGimbalYaw(context)
/*
if (_singleChar) { if (_singleChar) {
if (specifiesCoordinate) { if (specifiesCoordinate) {
paintSingleCoordinate(context) paintSingleCoordinate(context)
...@@ -58,19 +96,21 @@ Canvas { ...@@ -58,19 +96,21 @@ Canvas {
} else { } else {
paintMultipleCoordinate(context) paintMultipleCoordinate(context)
} }
context.closePath() */
context.fillStyle = color paintSingleNoCoordinate(context)
context.fill()
} }
QGCLabel { QGCLabel {
id: _label id: _label
x: Math.round((_width / 2) - (_singleChar ? (width / 2) : (ScreenTools.defaultFontPixelWidth / 2))) anchors.centerIn: parent
y: Math.round((_width / 2) - (height / 2)) width: _indicatorRadius * 2
color: "white" height: width
font.pointSize: small ? ScreenTools.smallFontPointSize : ScreenTools.defaultFontPointSize horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
onWidthChanged: requestPaint() color: "white"
font.pointSize: ScreenTools.defaultFontPointSize
fontSizeMode: Text.HorizontalFit
text: label
} }
QGCMouseArea { QGCMouseArea {
......
...@@ -102,8 +102,8 @@ Vehicle::Vehicle(LinkInterface* link, ...@@ -102,8 +102,8 @@ Vehicle::Vehicle(LinkInterface* link,
, _onboardControlSensorsUnhealthy(0) , _onboardControlSensorsUnhealthy(0)
, _gpsRawIntMessageAvailable(false) , _gpsRawIntMessageAvailable(false)
, _globalPositionIntMessageAvailable(false) , _globalPositionIntMessageAvailable(false)
, _cruiseSpeed(_settingsManager->appSettings()->offlineEditingCruiseSpeed()->rawValue().toDouble()) , _defaultCruiseSpeed(_settingsManager->appSettings()->offlineEditingCruiseSpeed()->rawValue().toDouble())
, _hoverSpeed(_settingsManager->appSettings()->offlineEditingHoverSpeed()->rawValue().toDouble()) , _defaultHoverSpeed(_settingsManager->appSettings()->offlineEditingHoverSpeed()->rawValue().toDouble())
, _telemetryRRSSI(0) , _telemetryRRSSI(0)
, _telemetryLRSSI(0) , _telemetryLRSSI(0)
, _telemetryRXErrors(0) , _telemetryRXErrors(0)
...@@ -264,8 +264,8 @@ Vehicle::Vehicle(MAV_AUTOPILOT firmwareType, ...@@ -264,8 +264,8 @@ Vehicle::Vehicle(MAV_AUTOPILOT firmwareType,
, _onboardControlSensorsUnhealthy(0) , _onboardControlSensorsUnhealthy(0)
, _gpsRawIntMessageAvailable(false) , _gpsRawIntMessageAvailable(false)
, _globalPositionIntMessageAvailable(false) , _globalPositionIntMessageAvailable(false)
, _cruiseSpeed(_settingsManager->appSettings()->offlineEditingCruiseSpeed()->rawValue().toDouble()) , _defaultCruiseSpeed(_settingsManager->appSettings()->offlineEditingCruiseSpeed()->rawValue().toDouble())
, _hoverSpeed(_settingsManager->appSettings()->offlineEditingHoverSpeed()->rawValue().toDouble()) , _defaultHoverSpeed(_settingsManager->appSettings()->offlineEditingHoverSpeed()->rawValue().toDouble())
, _vehicleCapabilitiesKnown(true) , _vehicleCapabilitiesKnown(true)
, _supportsMissionItemInt(false) , _supportsMissionItemInt(false)
, _connectionLost(false) , _connectionLost(false)
...@@ -382,14 +382,14 @@ void Vehicle::_offlineVehicleTypeSettingChanged(QVariant value) ...@@ -382,14 +382,14 @@ void Vehicle::_offlineVehicleTypeSettingChanged(QVariant value)
void Vehicle::_offlineCruiseSpeedSettingChanged(QVariant value) void Vehicle::_offlineCruiseSpeedSettingChanged(QVariant value)
{ {
_cruiseSpeed = value.toDouble(); _defaultCruiseSpeed = value.toDouble();
emit cruiseSpeedChanged(_cruiseSpeed); emit defaultCruiseSpeedChanged(_defaultCruiseSpeed);
} }
void Vehicle::_offlineHoverSpeedSettingChanged(QVariant value) void Vehicle::_offlineHoverSpeedSettingChanged(QVariant value)
{ {
_hoverSpeed = value.toDouble(); _defaultHoverSpeed = value.toDouble();
emit hoverSpeedChanged(_hoverSpeed); emit defaultHoverSpeedChanged(_defaultHoverSpeed);
} }
QString Vehicle::firmwareTypeString(void) const QString Vehicle::firmwareTypeString(void) const
......
...@@ -574,8 +574,8 @@ public: ...@@ -574,8 +574,8 @@ public:
QString missionFlightMode () const; QString missionFlightMode () const;
QString rtlFlightMode () const; QString rtlFlightMode () const;
QString takeControlFlightMode () const; QString takeControlFlightMode () const;
double cruiseSpeed () const { return _cruiseSpeed; } double defaultCruiseSpeed () const { return _defaultCruiseSpeed; }
double hoverSpeed () const { return _hoverSpeed; } double defaultHoverSpeed () const { return _defaultHoverSpeed; }
QString firmwareTypeString () const; QString firmwareTypeString () const;
QString vehicleTypeString () const; QString vehicleTypeString () const;
int telemetryRRSSI () { return _telemetryRRSSI; } int telemetryRRSSI () { return _telemetryRRSSI; }
...@@ -690,8 +690,8 @@ signals: ...@@ -690,8 +690,8 @@ signals:
void prearmErrorChanged(const QString& prearmError); void prearmErrorChanged(const QString& prearmError);
void soloFirmwareChanged(bool soloFirmware); void soloFirmwareChanged(bool soloFirmware);
void unhealthySensorsChanged(void); void unhealthySensorsChanged(void);
void cruiseSpeedChanged(double cruiseSpeed); void defaultCruiseSpeedChanged(double cruiseSpeed);
void hoverSpeedChanged(double hoverSpeed); void defaultHoverSpeedChanged(double hoverSpeed);
void firmwareTypeChanged(void); void firmwareTypeChanged(void);
void vehicleTypeChanged(void); void vehicleTypeChanged(void);
...@@ -872,8 +872,8 @@ private: ...@@ -872,8 +872,8 @@ private:
uint32_t _onboardControlSensorsUnhealthy; uint32_t _onboardControlSensorsUnhealthy;
bool _gpsRawIntMessageAvailable; bool _gpsRawIntMessageAvailable;
bool _globalPositionIntMessageAvailable; bool _globalPositionIntMessageAvailable;
double _cruiseSpeed; double _defaultCruiseSpeed;
double _hoverSpeed; double _defaultHoverSpeed;
int _telemetryRRSSI; int _telemetryRRSSI;
int _telemetryLRSSI; int _telemetryLRSSI;
uint32_t _telemetryRXErrors; uint32_t _telemetryRXErrors;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment