Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Valentin Platzgummer
qgroundcontrol
Commits
45d8d890
Unverified
Commit
45d8d890
authored
Feb 04, 2018
by
Don Gagne
Committed by
GitHub
Feb 04, 2018
Browse files
Merge pull request #6104 from DonLakeFlyer/TerrainCrash
Terrain crash
parents
03465774
ce4a0e67
Changes
3
Hide whitespace changes
Inline
Side-by-side
src/MissionManager/MissionController.cc
View file @
45d8d890
...
...
@@ -479,6 +479,7 @@ void MissionController::removeAll(void)
{
if
(
_visualItems
)
{
_deinitAllVisualItems
();
_visualItems
->
clearAndDeleteContents
();
_visualItems
->
deleteLater
();
_settingsItem
=
NULL
;
_visualItems
=
new
QmlObjectListModel
(
this
);
...
...
src/Terrain.cc
View file @
45d8d890
...
...
@@ -33,6 +33,8 @@ TerrainBatchManager::TerrainBatchManager(void)
void
TerrainBatchManager
::
addQuery
(
ElevationProvider
*
elevationProvider
,
const
QList
<
QGeoCoordinate
>&
coordinates
)
{
if
(
coordinates
.
length
()
>
0
)
{
qCDebug
(
ElevationProviderLog
)
<<
"addQuery: elevationProvider:coordinates.count"
<<
elevationProvider
<<
coordinates
.
count
();
connect
(
elevationProvider
,
&
ElevationProvider
::
destroyed
,
this
,
&
TerrainBatchManager
::
_elevationProviderDestroyed
);
QueuedRequestInfo_t
queuedRequestInfo
=
{
elevationProvider
,
coordinates
};
_requestQueue
.
append
(
queuedRequestInfo
);
if
(
!
_batchTimer
.
isActive
())
{
...
...
@@ -43,7 +45,7 @@ void TerrainBatchManager::addQuery(ElevationProvider* elevationProvider, const Q
void
TerrainBatchManager
::
_sendNextBatch
(
void
)
{
qCDebug
(
ElevationProviderLog
)
<<
"_sendNextBatch _state:_requestQueue.count
"
<<
(
int
)
_state
<<
_requestQueue
.
count
();
qCDebug
(
ElevationProviderLog
)
<<
"_sendNextBatch _state:_requestQueue.count
:_sentRequests.count"
<<
_stateToString
(
_state
)
<<
_requestQueue
.
count
()
<<
_sentRequests
.
count
()
;
if
(
_state
!=
State
::
Idle
)
{
// Waiting for last download the complete, wait some more
...
...
@@ -60,7 +62,7 @@ void TerrainBatchManager::_sendNextBatch(void)
// Convert coordinates to point strings for json query
QString
points
;
foreach
(
const
QueuedRequestInfo_t
&
requestInfo
,
_requestQueue
)
{
SentRequestInfo_t
sentRequestInfo
=
{
requestInfo
.
elevationProvider
,
requestInfo
.
coordinates
.
count
()
};
SentRequestInfo_t
sentRequestInfo
=
{
requestInfo
.
elevationProvider
,
false
,
requestInfo
.
coordinates
.
count
()
};
qCDebug
(
ElevationProviderLog
)
<<
"Building request: coordinate count"
<<
requestInfo
.
coordinates
.
count
();
_sentRequests
.
append
(
sentRequestInfo
);
...
...
@@ -100,7 +102,10 @@ void TerrainBatchManager::_batchFailed(void)
QList
<
float
>
noAltitudes
;
foreach
(
const
SentRequestInfo_t
&
sentRequestInfo
,
_sentRequests
)
{
sentRequestInfo
.
elevationProvider
->
_signalTerrainData
(
false
,
noAltitudes
);
if
(
!
sentRequestInfo
.
providerDestroyed
)
{
disconnect
(
sentRequestInfo
.
elevationProvider
,
&
ElevationProvider
::
destroyed
,
this
,
&
TerrainBatchManager
::
_elevationProviderDestroyed
);
sentRequestInfo
.
elevationProvider
->
_signalTerrainData
(
false
,
noAltitudes
);
}
}
_sentRequests
.
clear
();
}
...
...
@@ -145,15 +150,56 @@ void TerrainBatchManager::_requestFinished()
int
currentIndex
=
0
;
foreach
(
const
SentRequestInfo_t
&
sentRequestInfo
,
_sentRequests
)
{
QList
<
float
>
requestAltitudes
=
altitudes
.
mid
(
currentIndex
,
sentRequestInfo
.
cCoord
);
sentRequestInfo
.
elevationProvider
->
_signalTerrainData
(
true
,
requestAltitudes
);
currentIndex
+=
sentRequestInfo
.
cCoord
;
if
(
!
sentRequestInfo
.
providerDestroyed
)
{
disconnect
(
sentRequestInfo
.
elevationProvider
,
&
ElevationProvider
::
destroyed
,
this
,
&
TerrainBatchManager
::
_elevationProviderDestroyed
);
QList
<
float
>
requestAltitudes
=
altitudes
.
mid
(
currentIndex
,
sentRequestInfo
.
cCoord
);
sentRequestInfo
.
elevationProvider
->
_signalTerrainData
(
true
,
requestAltitudes
);
currentIndex
+=
sentRequestInfo
.
cCoord
;
}
}
_sentRequests
.
clear
();
reply
->
deleteLater
();
}
void
TerrainBatchManager
::
_elevationProviderDestroyed
(
QObject
*
elevationProvider
)
{
// Remove/Mark deleted objects queries from queues
qCDebug
(
ElevationProviderLog
)
<<
"_elevationProviderDestroyed elevationProvider"
<<
elevationProvider
;
int
i
=
0
;
while
(
i
<
_requestQueue
.
count
())
{
const
QueuedRequestInfo_t
&
requestInfo
=
_requestQueue
[
i
];
if
(
requestInfo
.
elevationProvider
==
elevationProvider
)
{
qCDebug
(
ElevationProviderLog
)
<<
"Removing deleted provider from _requestQueue index:elevationProvider"
<<
i
<<
requestInfo
.
elevationProvider
;
_requestQueue
.
removeAt
(
i
);
}
else
{
i
++
;
}
}
for
(
int
i
=
0
;
i
<
_sentRequests
.
count
();
i
++
)
{
SentRequestInfo_t
&
sentRequestInfo
=
_sentRequests
[
i
];
if
(
sentRequestInfo
.
elevationProvider
==
elevationProvider
)
{
qCDebug
(
ElevationProviderLog
)
<<
"Zombieing deleted provider from _sentRequests index:elevatationProvider"
<<
sentRequestInfo
.
elevationProvider
;
sentRequestInfo
.
providerDestroyed
=
true
;
}
}
}
QString
TerrainBatchManager
::
_stateToString
(
State
state
)
{
switch
(
state
)
{
case
State
::
Idle
:
return
QStringLiteral
(
"Idle"
);
case
State
::
Downloading
:
return
QStringLiteral
(
"Downloading"
);
}
return
QStringLiteral
(
"State unknown"
);
}
ElevationProvider
::
ElevationProvider
(
QObject
*
parent
)
:
QObject
(
parent
)
{
...
...
@@ -161,7 +207,6 @@ ElevationProvider::ElevationProvider(QObject* parent)
}
void
ElevationProvider
::
queryTerrainData
(
const
QList
<
QGeoCoordinate
>&
coordinates
)
{
qCDebug
(
ElevationProviderLog
)
<<
"queryTerrainData: coordinate count"
<<
coordinates
.
count
();
if
(
coordinates
.
length
()
==
0
)
{
return
;
}
...
...
src/Terrain.h
View file @
45d8d890
...
...
@@ -30,8 +30,9 @@ public:
void
addQuery
(
ElevationProvider
*
elevationProvider
,
const
QList
<
QGeoCoordinate
>&
coordinates
);
private
slots
:
void
_sendNextBatch
(
void
);
void
_requestFinished
(
void
);
void
_sendNextBatch
(
void
);
void
_requestFinished
(
void
);
void
_elevationProviderDestroyed
(
QObject
*
elevationProvider
);
private:
typedef
struct
{
...
...
@@ -41,6 +42,7 @@ private:
typedef
struct
{
ElevationProvider
*
elevationProvider
;
bool
providerDestroyed
;
int
cCoord
;
}
SentRequestInfo_t
;
...
...
@@ -51,6 +53,7 @@ private:
};
void
_batchFailed
(
void
);
QString
_stateToString
(
State
state
);
QList
<
QueuedRequestInfo_t
>
_requestQueue
;
QList
<
SentRequestInfo_t
>
_sentRequests
;
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment