Browse Source

Switch to hash table for gaps and reposition the file when starting to fill a new segment

QGC4.4
Nate Weibley 9 years ago committed by Nate Weibley
parent
commit
3565bfe34d
  1. 27
      src/ViewWidgets/LogDownloadController.cc
  2. 14
      src/ViewWidgets/LogDownloadController.h

27
src/ViewWidgets/LogDownloadController.cc

@ -282,16 +282,7 @@ LogDownloadController::_logData(UASInterface* uas, uint32_t ofs, uint16_t id, ui @@ -282,16 +282,7 @@ LogDownloadController::_logData(UASInterface* uas, uint32_t ofs, uint16_t id, ui
// Check for a gap
qint64 pos = _downloadData->file.pos();
if (pos != ofs) {
// Check for a gap collision
if (_downloadData->gaps.contains(ofs)) {
// The gap is being filled. Shrink it
const int32_t gap = _downloadData->gaps.take(ofs) - count;
if (gap > 0) {
_downloadData->gaps[ofs+count] = qMax(static_cast<uint32_t>(gap), _downloadData->gaps.value(ofs+count, 0));
} else {
timeout_time = 20;
}
} else if (pos < ofs) {
if (pos < ofs) {
// Mind the gap
uint32_t gap = ofs - pos;
_downloadData->gaps[pos] = gap;
@ -304,6 +295,17 @@ LogDownloadController::_logData(UASInterface* uas, uint32_t ofs, uint16_t id, ui @@ -304,6 +295,17 @@ LogDownloadController::_logData(UASInterface* uas, uint32_t ofs, uint16_t id, ui
}
}
// Check for a gap collision
if (_downloadData->gaps.contains(ofs)) {
// The gap is being filled. Shrink it
const int32_t gap = _downloadData->gaps.take(ofs) - count;
if (gap > 0) {
_downloadData->gaps[ofs+count] = qMax(static_cast<uint32_t>(gap), _downloadData->gaps.value(ofs+count, 0));
} else {
timeout_time = 20;
}
}
//-- Write chunk to file
if(_downloadData->file.write((const char*)data, count)) {
_downloadData->written += count;
@ -378,9 +380,12 @@ LogDownloadController::_findMissingData() @@ -378,9 +380,12 @@ LogDownloadController::_findMissingData()
const qint64 pos = _downloadData->file.pos(),
size = _downloadData->entry->size();
if (!_downloadData->gaps.isEmpty()) {
const uint32_t start = _downloadData->gaps.firstKey();
auto keys = _downloadData->gaps.keys();
qSort(keys);
const uint32_t start = keys.first();
const uint32_t count = _downloadData->gaps.value(start);
_downloadData->file.seek(start);
//-- Request these log chunks again
_requestLogData(_downloadData->ID, start, count);
} else if (pos != size) {

14
src/ViewWidgets/LogDownloadController.h

@ -125,13 +125,13 @@ private: @@ -125,13 +125,13 @@ private:
//-----------------------------------------------------------------------------
struct LogDownloadData {
LogDownloadData(QGCLogEntry* entry);
QMap<uint32_t, uint32_t> gaps;
QFile file;
QString filename;
uint ID;
QGCLogEntry* entry;
uint written;
QElapsedTimer elapsed;
QHash<uint32_t, uint32_t> gaps;
QFile file;
QString filename;
uint ID;
QGCLogEntry* entry;
uint written;
QElapsedTimer elapsed;
};
//-----------------------------------------------------------------------------

Loading…
Cancel
Save