Commit 0b750e07 authored by Gus Grubba's avatar Gus Grubba

Merge pull request #2547 from dogmaphobic/apmLogFix

APM Log Download "Fix"
parents ca2d5812 762aa965
...@@ -94,7 +94,7 @@ QGCView { ...@@ -94,7 +94,7 @@ QGCView {
//-- Have we received this entry already? //-- Have we received this entry already?
if(controller.model.get(styleData.row).received) { if(controller.model.get(styleData.row).received) {
var d = controller.model.get(styleData.row).time var d = controller.model.get(styleData.row).time
if(d.getUTCFullYear() < 1980) if(d.getUTCFullYear() < 2010)
return "Date Unknown" return "Date Unknown"
else else
return d.toLocaleString() return d.toLocaleString()
......
...@@ -67,6 +67,7 @@ LogDownloadController::LogDownloadController(void) ...@@ -67,6 +67,7 @@ LogDownloadController::LogDownloadController(void)
, _requestingLogEntries(false) , _requestingLogEntries(false)
, _downloadingLogs(false) , _downloadingLogs(false)
, _retries(0) , _retries(0)
, _apmOneBased(0)
{ {
MultiVehicleManager *manager = qgcApp()->toolbox()->multiVehicleManager(); MultiVehicleManager *manager = qgcApp()->toolbox()->multiVehicleManager();
connect(manager, &MultiVehicleManager::activeVehicleChanged, this, &LogDownloadController::_setActiveVehicle); connect(manager, &MultiVehicleManager::activeVehicleChanged, this, &LogDownloadController::_setActiveVehicle);
...@@ -114,6 +115,11 @@ LogDownloadController::_logEntry(UASInterface* uas, uint32_t time_utc, uint32_t ...@@ -114,6 +115,11 @@ LogDownloadController::_logEntry(UASInterface* uas, uint32_t time_utc, uint32_t
} }
//-- If this is the first, pre-fill it //-- If this is the first, pre-fill it
if(!_logEntriesModel.count() && num_logs > 0) { if(!_logEntriesModel.count() && num_logs > 0) {
//-- Is this APM? They send a first entry with bogus ID and only the
// count is valid. From now on, all entries are 1-based.
if(_vehicle->firmwareType() == MAV_AUTOPILOT_ARDUPILOTMEGA) {
_apmOneBased = 1;
}
for(int i = 0; i < num_logs; i++) { for(int i = 0; i < num_logs; i++) {
QGCLogEntry *entry = new QGCLogEntry(i); QGCLogEntry *entry = new QGCLogEntry(i);
_logEntriesModel.append(entry); _logEntriesModel.append(entry);
...@@ -121,14 +127,18 @@ LogDownloadController::_logEntry(UASInterface* uas, uint32_t time_utc, uint32_t ...@@ -121,14 +127,18 @@ LogDownloadController::_logEntry(UASInterface* uas, uint32_t time_utc, uint32_t
} }
//-- Update this log record //-- Update this log record
if(num_logs > 0) { if(num_logs > 0) {
if(id < _logEntriesModel.count()) { //-- Skip if empty (APM first packet)
QGCLogEntry* entry = _logEntriesModel[id]; if(size) {
entry->setSize(size); id -= _apmOneBased;
entry->setTime(QDateTime::fromTime_t(time_utc)); if(id < _logEntriesModel.count()) {
entry->setReceived(true); QGCLogEntry* entry = _logEntriesModel[id];
entry->setStatus(QString("Available")); entry->setSize(size);
} else { entry->setTime(QDateTime::fromTime_t(time_utc));
qWarning() << "Received log entry for out-of-bound index:" << id; entry->setReceived(true);
entry->setStatus(QString("Available"));
} else {
qWarning() << "Received log entry for out-of-bound index:" << id;
}
} }
} else { } else {
//-- No logs to list //-- No logs to list
...@@ -164,13 +174,18 @@ LogDownloadController::_entriesComplete() ...@@ -164,13 +174,18 @@ LogDownloadController::_entriesComplete()
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
void void
LogDownloadController::_resetSelection() LogDownloadController::_resetSelection(bool canceled)
{ {
int num_logs = _logEntriesModel.count(); int num_logs = _logEntriesModel.count();
for(int i = 0; i < num_logs; i++) { for(int i = 0; i < num_logs; i++) {
QGCLogEntry* entry = _logEntriesModel[i]; QGCLogEntry* entry = _logEntriesModel[i];
if(entry) { if(entry) {
entry->setSelected(false); if(entry->selected()) {
if(canceled) {
entry->setStatus(QString("Canceled"));
}
entry->setSelected(false);
}
} }
} }
emit selectionChanged(); emit selectionChanged();
...@@ -227,6 +242,9 @@ LogDownloadController::_findMissingEntries() ...@@ -227,6 +242,9 @@ LogDownloadController::_findMissingEntries()
if(end < 0) { if(end < 0) {
end = start; end = start;
} }
//-- APM "Fix"
start += _apmOneBased;
end += _apmOneBased;
//-- Request these entries again //-- Request these entries again
_requestLogList((uint32_t)start, (uint32_t) end); _requestLogList((uint32_t)start, (uint32_t) end);
} else { } else {
...@@ -241,6 +259,8 @@ LogDownloadController::_logData(UASInterface* uas, uint32_t ofs, uint16_t id, ui ...@@ -241,6 +259,8 @@ LogDownloadController::_logData(UASInterface* uas, uint32_t ofs, uint16_t id, ui
if(!_uas || uas != _uas || !_downloadData) { if(!_uas || uas != _uas || !_downloadData) {
return; return;
} }
//-- APM "Fix"
id -= _apmOneBased;
if(_downloadData->ID != id) { if(_downloadData->ID != id) {
qWarning() << "Received log data for wrong log"; qWarning() << "Received log data for wrong log";
return; return;
...@@ -360,6 +380,8 @@ void ...@@ -360,6 +380,8 @@ void
LogDownloadController::_requestLogData(uint8_t id, uint32_t offset, uint32_t count) LogDownloadController::_requestLogData(uint8_t id, uint32_t offset, uint32_t count)
{ {
if(_vehicle) { if(_vehicle) {
//-- APM "Fix"
id += _apmOneBased;
qCDebug(LogDownloadLog) << "Request log data (id:" << id << "offset:" << offset << "size:" << count << ")"; qCDebug(LogDownloadLog) << "Request log data (id:" << id << "offset:" << offset << "size:" << count << ")";
mavlink_message_t msg; mavlink_message_t msg;
mavlink_msg_log_request_data_pack( mavlink_msg_log_request_data_pack(
...@@ -423,6 +445,16 @@ LogDownloadController::download(void) ...@@ -423,6 +445,16 @@ LogDownloadController::download(void)
if(!_downloadPath.isEmpty()) { if(!_downloadPath.isEmpty()) {
if(!_downloadPath.endsWith(QDir::separator())) if(!_downloadPath.endsWith(QDir::separator()))
_downloadPath += QDir::separator(); _downloadPath += QDir::separator();
//-- Iterate selected entries and shown them as waiting
int num_logs = _logEntriesModel.count();
for(int i = 0; i < num_logs; i++) {
QGCLogEntry* entry = _logEntriesModel[i];
if(entry) {
if(entry->selected()) {
entry->setStatus(QString("Waiting"));
}
}
}
//-- Start download process //-- Start download process
_downloadingLogs = true; _downloadingLogs = true;
emit downloadingLogsChanged(); emit downloadingLogsChanged();
...@@ -464,13 +496,18 @@ LogDownloadController::_prepareLogDownload() ...@@ -464,13 +496,18 @@ LogDownloadController::_prepareLogDownload()
emit selectionChanged(); emit selectionChanged();
bool result = false; bool result = false;
QString ftime; QString ftime;
if(entry->time().date().year() < 1980) { if(entry->time().date().year() < 2010) {
ftime = "UnknownDate"; ftime = "UnknownDate";
} else { } else {
ftime = entry->time().toString("yyyy-M-d-hh-mm-ss"); ftime = entry->time().toString("yyyy-M-d-hh-mm-ss");
} }
_downloadData = new LogDownloadData(entry); _downloadData = new LogDownloadData(entry);
_downloadData->filename = QString("log_") + QString::number(entry->id()) + "_" + ftime + ".txt"; _downloadData->filename = QString("log_") + QString::number(entry->id()) + "_" + ftime;
if(_vehicle->firmwareType() == MAV_AUTOPILOT_PX4) {
_downloadData->filename += ".px4log";
} else {
_downloadData->filename += ".bin";
}
_downloadData->file.setFileName(_downloadPath + _downloadData->filename); _downloadData->file.setFileName(_downloadPath + _downloadData->filename);
//-- Append a number to the end if the filename already exists //-- Append a number to the end if the filename already exists
if (_downloadData->file.exists()){ if (_downloadData->file.exists()){
...@@ -539,7 +576,7 @@ LogDownloadController::cancel(void) ...@@ -539,7 +576,7 @@ LogDownloadController::cancel(void)
delete _downloadData; delete _downloadData;
_downloadData = 0; _downloadData = 0;
} }
_resetSelection(); _resetSelection(true);
_downloadingLogs = false; _downloadingLogs = false;
emit downloadingLogsChanged(); emit downloadingLogsChanged();
} }
......
...@@ -171,7 +171,7 @@ private: ...@@ -171,7 +171,7 @@ private:
void _findMissingEntries(); void _findMissingEntries();
void _receivedAllEntries(); void _receivedAllEntries();
void _receivedAllData (); void _receivedAllData ();
void _resetSelection (); void _resetSelection (bool canceled = false);
void _findMissingData (); void _findMissingData ();
void _requestLogList (uint32_t start = 0, uint32_t end = 0xFFFF); void _requestLogList (uint32_t start = 0, uint32_t end = 0xFFFF);
void _requestLogData (uint8_t id, uint32_t offset = 0, uint32_t count = 0xFFFFFFFF); void _requestLogData (uint8_t id, uint32_t offset = 0, uint32_t count = 0xFFFFFFFF);
...@@ -187,6 +187,7 @@ private: ...@@ -187,6 +187,7 @@ private:
bool _requestingLogEntries; bool _requestingLogEntries;
bool _downloadingLogs; bool _downloadingLogs;
int _retries; int _retries;
int _apmOneBased;
QString _downloadPath; QString _downloadPath;
}; };
......
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