Commit 3c411781 authored by Gus Grubba's avatar Gus Grubba

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.
parent e25f7af6
......@@ -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<RuleSet::Id>& 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<quint64>(_flightStartTime.toUTC().toMSecsSinceEpoch());
start_time = airmap::from_milliseconds_since_epoch(airmap::milliseconds(static_cast<qint64>(startt)));
//-- End has to be after start
if(_flightEndTime < _flightStartTime) {
_flightEndTime = _flightStartTime.addSecs(30 * 60);
emit flightEndTimeChanged();
}
quint64 endt = static_cast<quint64>(_flightEndTime.toUTC().toMSecsSinceEpoch());
quint64 endt = startt + (static_cast<uint64_t>(_flightDuration) * 1000);
end_time = airmap::from_milliseconds_since_epoch(airmap::milliseconds(static_cast<qint64>(endt)));
}
......@@ -561,7 +559,7 @@ AirMapFlightPlanManager::_updateFlightPlan(bool interactive)
qCDebug(AirMapManagerLog) << "Updating flight plan. State:" << static_cast<int>(_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<LifetimeChecker> 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() : "");
......
......@@ -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<AirMapRuleFeature*> _importantFeatures;
......
......@@ -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)
}
......
......@@ -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 ();
......
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