From 3c4117811c7d1758cc1c738a00ffad954d7aaaf7 Mon Sep 17 00:00:00 2001 From: Gus Grubba Date: Fri, 10 Aug 2018 14:44:16 -0400 Subject: [PATCH] Maintain flight start time and duration instead of flight start/end time. The "Now" button now sets a "now" flag instead of adjusting the start time. Once the flight is created, the actual "now" time is set for flight start time. The button is also exclusive. Once set, the start time slider is hidden as it becomes irrelevant. --- src/Airmap/AirMapFlightPlanManager.cc | 74 +++++++++---------- src/Airmap/AirMapFlightPlanManager.h | 9 ++- src/Airmap/FlightDetails.qml | 36 ++++----- .../AirspaceFlightPlanProvider.h | 12 ++- 4 files changed, 66 insertions(+), 65 deletions(-) diff --git a/src/Airmap/AirMapFlightPlanManager.cc b/src/Airmap/AirMapFlightPlanManager.cc index 60696bca1..bbc00373d 100644 --- a/src/Airmap/AirMapFlightPlanManager.cc +++ b/src/Airmap/AirMapFlightPlanManager.cc @@ -124,7 +124,6 @@ AirMapFlightPlanManager::AirMapFlightPlanManager(AirMapSharedState& shared, QObj { connect(&_pollTimer, &QTimer::timeout, this, &AirMapFlightPlanManager::_pollBriefing); _flightStartTime = QDateTime::currentDateTime().addSecs(60); - _flightEndTime = _flightStartTime.addSecs(30 * 60); } //----------------------------------------------------------------------------- @@ -145,27 +144,27 @@ AirMapFlightPlanManager::setFlightStartTime(QDateTime start) _flightStartTime = start; emit flightStartTimeChanged(); } - //-- End has to be after start - if(_flightEndTime < _flightStartTime) { - _flightEndTime = _flightStartTime.addSecs(30 * 60); - emit flightEndTimeChanged(); - } - qCDebug(AirMapManagerLog) << "Set time start time" << _flightStartTime << _flightEndTime; + qCDebug(AirMapManagerLog) << "Set time start time" << _flightStartTime; } //----------------------------------------------------------------------------- void -AirMapFlightPlanManager::setFlightEndTime(QDateTime end) +AirMapFlightPlanManager::setFlightStartsNow(bool now) { - //-- End has to be after start - if(end < _flightStartTime) { - end = _flightStartTime.addSecs(30 * 60); - } - if(_flightEndTime != end) { - _flightEndTime = end; - emit flightEndTimeChanged(); + _flightStartsNow = now; + emit flightStartsNowChanged(); +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::setFlightDuration(int seconds) +{ + _flightDuration = seconds; + if(_flightDuration < 30) { + _flightDuration = 30; } - qCDebug(AirMapManagerLog) << "Set time end time" << _flightStartTime << _flightEndTime; + emit flightDurationChanged(); + qCDebug(AirMapManagerLog) << "Set time duration" << _flightDuration; } //----------------------------------------------------------------------------- @@ -176,10 +175,10 @@ AirMapFlightPlanManager::flightStartTime() const } //----------------------------------------------------------------------------- -QDateTime -AirMapFlightPlanManager::flightEndTime() const +int +AirMapFlightPlanManager::flightDuration() const { - return _flightEndTime; + return _flightDuration; } //----------------------------------------------------------------------------- @@ -379,7 +378,7 @@ AirMapFlightPlanManager::_createFlightPlan() qCDebug(AirMapManagerLog) << "Takeoff: " << _flight.takeoffCoord; qCDebug(AirMapManagerLog) << "Bounding box:" << _flight.bc.pointNW << _flight.bc.pointSE; qCDebug(AirMapManagerLog) << "Flight Start:" << flightStartTime().toString(); - qCDebug(AirMapManagerLog) << "Flight End: " << flightEndTime().toString(); + qCDebug(AirMapManagerLog) << "Flight Duration: " << flightDuration(); if (_pilotID == "" && !_shared.settings().userName.isEmpty() && !_shared.settings().password.isEmpty()) { //-- Need to get the pilot id before uploading the flight plan @@ -477,19 +476,18 @@ AirMapFlightPlanManager::_updateRulesAndFeatures(std::vector& rules void AirMapFlightPlanManager::_updateFlightStartEndTime(DateTime& start_time, DateTime& end_time) { - if(_flightStartTime < QDateTime::currentDateTime()) { - //-- Can't start in the past - _flightStartTime = QDateTime::currentDateTime(); - emit flightStartTimeChanged(); + if(_flightStartsNow) { + setFlightStartTime(QDateTime::currentDateTime().addSecs(60)); + } else { + if(_flightStartTime < QDateTime::currentDateTime()) { + //-- Can't start in the past + _flightStartTime = QDateTime::currentDateTime(); + emit flightStartTimeChanged(); + } } quint64 startt = static_cast(_flightStartTime.toUTC().toMSecsSinceEpoch()); start_time = airmap::from_milliseconds_since_epoch(airmap::milliseconds(static_cast(startt))); - //-- End has to be after start - if(_flightEndTime < _flightStartTime) { - _flightEndTime = _flightStartTime.addSecs(30 * 60); - emit flightEndTimeChanged(); - } - quint64 endt = static_cast(_flightEndTime.toUTC().toMSecsSinceEpoch()); + quint64 endt = startt + (static_cast(_flightDuration) * 1000); end_time = airmap::from_milliseconds_since_epoch(airmap::milliseconds(static_cast(endt))); } @@ -561,7 +559,7 @@ AirMapFlightPlanManager::_updateFlightPlan(bool interactive) qCDebug(AirMapManagerLog) << "Updating flight plan. State:" << static_cast(_state); if(_state != State::Idle) { - QTimer::singleShot(100, this, &AirMapFlightPlanManager::_updateFlightPlanOnTimer); + QTimer::singleShot(250, this, &AirMapFlightPlanManager::_updateFlightPlanOnTimer); return; } //-- Get flight data @@ -592,10 +590,10 @@ AirMapFlightPlanManager::_updateFlightPlan(bool interactive) } _flightPlan.geometry = Geometry(polygon); - qCDebug(AirMapManagerLog) << "Takeoff: " << _flight.takeoffCoord; - qCDebug(AirMapManagerLog) << "Bounding box:" << _flight.bc.pointNW << _flight.bc.pointSE; - qCDebug(AirMapManagerLog) << "Flight Start:" << flightStartTime().toString(); - qCDebug(AirMapManagerLog) << "Flight End: " << flightEndTime().toString(); + qCDebug(AirMapManagerLog) << "Takeoff: " << _flight.takeoffCoord; + qCDebug(AirMapManagerLog) << "Bounding box: " << _flight.bc.pointNW << _flight.bc.pointSE; + qCDebug(AirMapManagerLog) << "Flight Start: " << flightStartTime().toString(); + qCDebug(AirMapManagerLog) << "Flight Duration:" << flightDuration(); _state = State::FlightUpdate; std::weak_ptr isAlive(_instance); @@ -779,10 +777,7 @@ AirMapFlightPlanManager::_pollBriefing() break; } } - emit advisoryChanged(); - emit rulesChanged(); qCDebug(AirMapManagerLog) << "Flight approval: accepted=" << accepted << "rejected" << rejected << "pending" << pending; - _state = State::Idle; if ((rejected || accepted) && !pending) { if (rejected) { // rejected has priority _flightPermitStatus = AirspaceFlightPlanProvider::PermitRejected; @@ -796,6 +791,9 @@ AirMapFlightPlanManager::_pollBriefing() _pollTimer.start(1000); } } + emit advisoryChanged(); + emit rulesChanged(); + _state = State::Idle; } else { _state = State::Idle; QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); diff --git a/src/Airmap/AirMapFlightPlanManager.h b/src/Airmap/AirMapFlightPlanManager.h index ee5ca4a6a..96ef1aeb3 100644 --- a/src/Airmap/AirMapFlightPlanManager.h +++ b/src/Airmap/AirMapFlightPlanManager.h @@ -73,7 +73,8 @@ public: PermitStatus flightPermitStatus () const override { return _flightPermitStatus; } QDateTime flightStartTime () const override; - QDateTime flightEndTime () const override; + int flightDuration () const override; + bool flightStartsNow () const override { return _flightStartsNow; } bool valid () override { return _valid; } QmlObjectListModel* advisories () override { return &_advisories; } QmlObjectListModel* ruleSets () override { return &_rulesets; } @@ -97,8 +98,9 @@ public: void submitFlightPlan () override; void startFlightPlanning (PlanMasterController* planController) override; void setFlightStartTime (QDateTime start) override; - void setFlightEndTime (QDateTime end) override; + void setFlightDuration (int seconds) override; void loadFlightList (QDateTime startTime, QDateTime endTime) override; + void setFlightStartsNow (bool now) override; void endFlight (QString flightID) override; signals: @@ -155,6 +157,7 @@ private: PlanMasterController* _planController = nullptr; bool _valid = false; bool _loadingFlightList = false; + bool _flightStartsNow = false; QmlObjectListModel _advisories; QmlObjectListModel _rulesets; QmlObjectListModel _rulesViolation; @@ -168,7 +171,7 @@ private: QDateTime _rangeEnd; airmap::FlightPlan _flightPlan; QDateTime _flightStartTime; - QDateTime _flightEndTime; + int _flightDuration = 15 * 60; QList _importantFeatures; diff --git a/src/Airmap/FlightDetails.qml b/src/Airmap/FlightDetails.qml index d1858517d..aecacf342 100644 --- a/src/Airmap/FlightDetails.qml +++ b/src/Airmap/FlightDetails.qml @@ -19,13 +19,6 @@ Item { implicitWidth: detailCol.width property real baseHeight: ScreenTools.defaultFontPixelHeight * 22 property real baseWidth: ScreenTools.defaultFontPixelWidth * 40 - function setEndTime() { - _dirty = true - var endTime = QGroundControl.airspaceManager.flightPlan.flightStartTime - endTime.setTime(endTime.getTime() + (Math.floor(durationSlider.value * 0.25) * 60 * 60 * 1000)) - endTime.setTime(endTime.getTime() + ((durationSlider.value * 15) % 60) * 60 * 1000) - QGroundControl.airspaceManager.flightPlan.flightEndTime = endTime - } Column { id: detailCol spacing: ScreenTools.defaultFontPixelHeight * 0.25 @@ -76,11 +69,10 @@ Item { anchors.left: parent.left QGCButton { text: qsTr("Now") + checked: QGroundControl.airspaceManager.flightPlan.flightStartsNow onClicked: { _dirty = true - var today = new Date() - QGroundControl.airspaceManager.flightPlan.flightStartTime = today - timeSlider.updateTime() + QGroundControl.airspaceManager.flightPlan.flightStartsNow = !QGroundControl.airspaceManager.flightPlan.flightStartsNow } } QGCButton { @@ -94,6 +86,7 @@ Item { } } Layout.fillWidth: true + enabled: !QGroundControl.airspaceManager.flightPlan.flightStartsNow iconSource: "qrc:/airmap/expand.svg" onClicked: { _dirty = true @@ -108,10 +101,12 @@ Item { anchors.right: parent.right anchors.left: parent.left height: timeSlider.height + visible: !QGroundControl.airspaceManager.flightPlan.flightStartsNow QGCSlider { id: timeSlider width: parent.width - timeLabel.width - ScreenTools.defaultFontPixelWidth stepSize: 1 + enabled: !QGroundControl.airspaceManager.flightPlan.flightStartsNow minimumValue: 0 maximumValue: 95 // 96 blocks of 15 minutes in 24 hours anchors.left: parent.left @@ -124,7 +119,6 @@ Item { today.setSeconds(0) today.setMilliseconds(0) QGroundControl.airspaceManager.flightPlan.flightStartTime = today - setEndTime() } Component.onCompleted: { updateTime() @@ -147,7 +141,12 @@ Item { } } QGCLabel { - text: qsTr("Duration") + text: qsTr("Now") + visible: QGroundControl.airspaceManager.flightPlan.flightStartsNow + anchors.horizontalCenter: parent.horizontalCenter + } + QGCLabel { + text: qsTr("Duration") } Item { anchors.right: parent.right @@ -162,16 +161,13 @@ Item { anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter onValueChanged: { - setEndTime() + var hour = Math.floor(durationSlider.value * 0.25) + var minute = (durationSlider.value * 15) % 60 + var seconds = (hour * 60 * 60) + (minute * 60) + QGroundControl.airspaceManager.flightPlan.flightDuration = seconds } Component.onCompleted: { - updateTime() - } - function updateTime() { - var startTime = QGroundControl.airspaceManager.flightPlan.flightStartTime - var endTime = QGroundControl.airspaceManager.flightPlan.flightEndTime - var val = (endTime.getTime() - startTime.getTime()) / 1000 / 60 - val = (val * (96/360)) + 1 + var val = ((QGroundControl.airspaceManager.flightPlan.flightDuration / 60) * (96/1440)) + 1 if(val > 24) val = 24 durationSlider.value = Math.ceil(val) } diff --git a/src/AirspaceManagement/AirspaceFlightPlanProvider.h b/src/AirspaceManagement/AirspaceFlightPlanProvider.h index 7ae16c3bc..bd741648e 100644 --- a/src/AirspaceManagement/AirspaceFlightPlanProvider.h +++ b/src/AirspaceManagement/AirspaceFlightPlanProvider.h @@ -144,7 +144,8 @@ public: ///< Flight Planning and Filing Q_PROPERTY(QDateTime flightStartTime READ flightStartTime WRITE setFlightStartTime NOTIFY flightStartTimeChanged) ///< Start of flight - Q_PROPERTY(QDateTime flightEndTime READ flightEndTime WRITE setFlightEndTime NOTIFY flightEndTimeChanged) ///< End of flight + Q_PROPERTY(int flightDuration READ flightDuration WRITE setFlightDuration NOTIFY flightDurationChanged) ///< Flight Duration + Q_PROPERTY(bool flightStartsNow READ flightStartsNow WRITE setFlightStartsNow NOTIFY flightStartsNowChanged) ///< Flight Briefing Q_PROPERTY(PermitStatus flightPermitStatus READ flightPermitStatus NOTIFY flightPermitStatusChanged) ///< State of flight permission @@ -172,7 +173,8 @@ public: virtual PermitStatus flightPermitStatus () const { return PermitNone; } virtual QDateTime flightStartTime () const = 0; - virtual QDateTime flightEndTime () const = 0; + virtual int flightDuration () const = 0; + virtual bool flightStartsNow () const = 0; virtual QGCGeoBoundingCube* missionArea () = 0; virtual bool valid () = 0; ///< Current advisory list is valid virtual QmlObjectListModel* advisories () = 0; ///< List of AirspaceAdvisory @@ -189,13 +191,15 @@ public: virtual bool loadingFlightList () = 0; virtual void setFlightStartTime (QDateTime start) = 0; - virtual void setFlightEndTime (QDateTime end) = 0; + virtual void setFlightDuration (int seconds) = 0; + virtual void setFlightStartsNow (bool now) = 0; virtual void startFlightPlanning (PlanMasterController* planController) = 0; signals: void flightPermitStatusChanged (); void flightStartTimeChanged (); - void flightEndTimeChanged (); + void flightStartsNowChanged (); + void flightDurationChanged (); void advisoryChanged (); void missionAreaChanged (); void rulesChanged (); -- 2.22.0