diff --git a/src/Airmap/AirMapFlightPlanManager.cc b/src/Airmap/AirMapFlightPlanManager.cc index 60696bca1725f80d749e9b49c6aaa255be869643..bbc00373d9d06b57c2b1afc27b1d9a7bc34c0b88 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 ee5ca4a6a11af948ef9a1c73a1a9f7c2e3eb1901..96ef1aeb3b0b823c8a0f65ff887449a9c940e033 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 d1858517d471d11387f5f980d7296e55d94bd888..aecacf34206d161c013b0040dc74603da97f8799 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 7ae16c3bc669e000dcb8ea69d2edc887a3e91979..bd741648eac86389757066d696b0ba9214b25ae4 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 ();