地面站终端 App
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
7.1 KiB

/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009 - 2014 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
This file is part of the QGROUNDCONTROL project
QGROUNDCONTROL is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
QGROUNDCONTROL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/
#ifndef LogDownloadController_H
#define LogDownloadController_H
#include <QObject>
#include <QTimer>
#include <QAbstractListModel>
#include <QLocale>
#include <QElapsedTimer>
#include <memory>
#include "UASInterface.h"
#include "AutoPilotPlugin.h"
#include "FactPanelController.h"
class MultiVehicleManager;
class UASInterface;
class Vehicle;
class QGCLogEntry;
struct LogDownloadData;
Q_DECLARE_LOGGING_CATEGORY(LogDownloadLog)
//-----------------------------------------------------------------------------
class QGCLogModel : public QAbstractListModel
{
Q_OBJECT
public:
enum QGCLogModelRoles {
ObjectRole = Qt::UserRole + 1
};
QGCLogModel(QObject *parent = 0);
Q_PROPERTY(int count READ count NOTIFY countChanged)
Q_INVOKABLE QGCLogEntry* get(int index);
int count (void) const;
void append (QGCLogEntry* entry);
void clear (void);
QGCLogEntry*operator[] (int i);
int rowCount (const QModelIndex & parent = QModelIndex()) const;
QVariant data (const QModelIndex & index, int role = Qt::DisplayRole) const;
signals:
void countChanged ();
protected:
QHash<int, QByteArray> roleNames() const;
private:
QList<QGCLogEntry*> _logEntries;
};
//-----------------------------------------------------------------------------
class QGCLogEntry : public QObject {
Q_OBJECT
Q_PROPERTY(uint id READ id CONSTANT)
Q_PROPERTY(QDateTime time READ time NOTIFY timeChanged)
Q_PROPERTY(uint size READ size NOTIFY sizeChanged)
Q_PROPERTY(QString sizeStr READ sizeStr NOTIFY sizeChanged)
Q_PROPERTY(bool received READ received NOTIFY receivedChanged)
Q_PROPERTY(bool selected READ selected WRITE setSelected NOTIFY selectedChanged)
Q_PROPERTY(QString status READ status NOTIFY statusChanged)
public:
QGCLogEntry(uint logId, const QDateTime& dateTime = QDateTime(), uint logSize = 0, bool received = false);
uint id () const { return _logID; }
uint size () const { return _logSize; }
QString sizeStr () const;
QDateTime time () const { return _logTimeUTC; }
bool received () const { return _received; }
bool selected () const { return _selected; }
QString status () const { return _status; }
void setId (uint id_) { _logID = id_; }
void setSize (uint size_) { _logSize = size_; emit sizeChanged(); }
void setTime (QDateTime date_) { _logTimeUTC = date_; emit timeChanged(); }
void setReceived (bool rec_) { _received = rec_; emit receivedChanged(); }
void setSelected (bool sel_) { _selected = sel_; emit selectedChanged(); }
void setStatus (QString stat_) { _status = stat_; emit statusChanged(); }
signals:
void idChanged ();
void timeChanged ();
void sizeChanged ();
void receivedChanged ();
void selectedChanged ();
void statusChanged ();
private:
uint _logID;
uint _logSize;
QDateTime _logTimeUTC;
bool _received;
bool _selected;
QString _status;
};
//-----------------------------------------------------------------------------
struct LogDownloadData {
LogDownloadData(QGCLogEntry* entry);
QHash<uint32_t, uint32_t> gaps;
QFile file;
QString filename;
uint ID;
QGCLogEntry* entry;
uint written;
QElapsedTimer elapsed;
};
//-----------------------------------------------------------------------------
class LogDownloadController : public FactPanelController
{
Q_OBJECT
public:
LogDownloadController();
Q_PROPERTY(QGCLogModel* model READ model NOTIFY modelChanged)
Q_PROPERTY(bool requestingList READ requestingList NOTIFY requestingListChanged)
Q_PROPERTY(bool downloadingLogs READ downloadingLogs NOTIFY downloadingLogsChanged)
QGCLogModel* model () { return &_logEntriesModel; }
bool requestingList () { return _requestingLogEntries; }
bool downloadingLogs () { return _downloadingLogs; }
Q_INVOKABLE void refresh ();
Q_INVOKABLE void download ();
Q_INVOKABLE void eraseAll ();
Q_INVOKABLE void cancel ();
signals:
void requestingListChanged ();
void downloadingLogsChanged ();
void modelChanged ();
void selectionChanged ();
private slots:
void _setActiveVehicle (Vehicle* vehicle);
void _logEntry (UASInterface *uas, uint32_t time_utc, uint32_t size, uint16_t id, uint16_t num_logs, uint16_t last_log_num);
void _logData (UASInterface *uas, uint32_t ofs, uint16_t id, uint8_t count, const uint8_t *data);
void _processDownload ();
private:
bool _entriesComplete ();
bool _logComplete ();
void _findMissingEntries();
void _receivedAllEntries();
void _receivedAllData ();
void _resetSelection (bool canceled = false);
void _findMissingData ();
void _requestLogList (uint32_t start = 0, uint32_t end = 0xFFFF);
void _requestLogData (uint8_t id, uint32_t offset = 0, uint32_t count = 0xFFFFFFFF);
bool _prepareLogDownload();
void _setDownloading (bool active);
QGCLogEntry* _getNextSelected();
UASInterface* _uas;
LogDownloadData* _downloadData;
QTimer _timer;
QGCLogModel _logEntriesModel;
Vehicle* _vehicle;
bool _requestingLogEntries;
bool _downloadingLogs;
int _retries;
int _apmOneBased;
QString _downloadPath;
};
#endif