1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-21 11:54:15 +01:00

OP-1119 Moved class LogFile from Logging plugin to libs/utils

This commit is contained in:
m_thread 2013-11-27 16:07:15 +01:00
parent bc9bbebfdf
commit 81443570ab
5 changed files with 92 additions and 75 deletions

View File

@ -4,12 +4,14 @@
LogFile::LogFile(QObject *parent) : LogFile::LogFile(QObject *parent) :
QIODevice(parent), QIODevice(parent),
lastTimeStamp(0), m_lastTimeStamp(0),
lastPlayed(0), m_lastPlayed(0),
timeOffset(0), m_timeOffset(0),
playbackSpeed(1.0) m_playbackSpeed(1.0),
m_nextTimeStamp(0),
m_useProvidedTimeStamp(false)
{ {
connect(&timer, SIGNAL(timeout()), this, SLOT(timerFired())); connect(&m_timer, SIGNAL(timeout()), this, SLOT(timerFired()));
} }
/** /**
@ -20,8 +22,8 @@ LogFile::LogFile(QObject *parent) :
bool LogFile::open(OpenMode mode) bool LogFile::open(OpenMode mode)
{ {
// start a timer for playback // start a timer for playback
myTime.restart(); m_myTime.restart();
if (file.isOpen()) { if (m_file.isOpen()) {
// We end up here when doing a replay, because the connection // We end up here when doing a replay, because the connection
// manager will also try to open the QIODevice, even though we just // manager will also try to open the QIODevice, even though we just
// opened it after selecting the file, which happens before the // opened it after selecting the file, which happens before the
@ -29,8 +31,8 @@ bool LogFile::open(OpenMode mode)
return true; return true;
} }
if (file.open(mode) == false) { if (m_file.open(mode) == false) {
qDebug() << "Unable to open " << file.fileName() << " for logging"; qDebug() << "Unable to open " << m_file.fileName() << " for logging";
return false; return false;
} }
@ -49,25 +51,27 @@ void LogFile::close()
{ {
emit aboutToClose(); emit aboutToClose();
if (timer.isActive()) { if (m_timer.isActive()) {
timer.stop(); m_timer.stop();
} }
file.close(); m_file.close();
QIODevice::close(); QIODevice::close();
} }
qint64 LogFile::writeData(const char *data, qint64 dataSize) qint64 LogFile::writeData(const char *data, qint64 dataSize)
{ {
if (!file.isWritable()) { if (!m_file.isWritable()) {
return dataSize; return dataSize;
} }
quint32 timeStamp = myTime.elapsed(); // If m_nextTimeStamp != -1 then use this timestamp instead of the timer
// This is used when saving logs from on-board logging
quint32 timeStamp = m_useProvidedTimeStamp ? m_nextTimeStamp : m_myTime.elapsed();
file.write((char *)&timeStamp, sizeof(timeStamp)); m_file.write((char *)&timeStamp, sizeof(timeStamp));
file.write((char *)&dataSize, sizeof(dataSize)); m_file.write((char *)&dataSize, sizeof(dataSize));
qint64 written = file.write(data, dataSize); qint64 written = m_file.write(data, dataSize);
if (written != -1) { if (written != -1) {
emit bytesWritten(written); emit bytesWritten(written);
} }
@ -77,36 +81,36 @@ qint64 LogFile::writeData(const char *data, qint64 dataSize)
qint64 LogFile::readData(char *data, qint64 maxSize) qint64 LogFile::readData(char *data, qint64 maxSize)
{ {
QMutexLocker locker(&mutex); QMutexLocker locker(&m_mutex);
qint64 toRead = qMin(maxSize, (qint64)dataBuffer.size()); qint64 toRead = qMin(maxSize, (qint64)m_dataBuffer.size());
memcpy(data, dataBuffer.data(), toRead); memcpy(data, m_dataBuffer.data(), toRead);
dataBuffer.remove(0, toRead); m_dataBuffer.remove(0, toRead);
return toRead; return toRead;
} }
qint64 LogFile::bytesAvailable() const qint64 LogFile::bytesAvailable() const
{ {
return dataBuffer.size(); return m_dataBuffer.size();
} }
void LogFile::timerFired() void LogFile::timerFired()
{ {
qint64 dataSize; qint64 dataSize;
if (file.bytesAvailable() > 4) { if (m_file.bytesAvailable() > 4) {
int time; int time;
time = myTime.elapsed(); time = m_myTime.elapsed();
// TODO: going back in time will be a problem // TODO: going back in time will be a problem
while ((lastPlayed + ((time - timeOffset) * playbackSpeed) > lastTimeStamp)) { while ((m_lastPlayed + ((time - m_timeOffset) * m_playbackSpeed) > m_lastTimeStamp)) {
lastPlayed += ((time - timeOffset) * playbackSpeed); m_lastPlayed += ((time - m_timeOffset) * m_playbackSpeed);
if (file.bytesAvailable() < sizeof(dataSize)) { if (m_file.bytesAvailable() < sizeof(dataSize)) {
stopReplay(); stopReplay();
return; return;
} }
file.read((char *)&dataSize, sizeof(dataSize)); m_file.read((char *)&dataSize, sizeof(dataSize));
if (dataSize < 1 || dataSize > (1024 * 1024)) { if (dataSize < 1 || dataSize > (1024 * 1024)) {
qDebug() << "Error: Logfile corrupted! Unlikely packet size: " << dataSize << "\n"; qDebug() << "Error: Logfile corrupted! Unlikely packet size: " << dataSize << "\n";
@ -114,34 +118,34 @@ void LogFile::timerFired()
return; return;
} }
if (file.bytesAvailable() < dataSize) { if (m_file.bytesAvailable() < dataSize) {
stopReplay(); stopReplay();
return; return;
} }
mutex.lock(); m_mutex.lock();
dataBuffer.append(file.read(dataSize)); m_dataBuffer.append(m_file.read(dataSize));
mutex.unlock(); m_mutex.unlock();
emit readyRead(); emit readyRead();
if (file.bytesAvailable() < sizeof(lastTimeStamp)) { if (m_file.bytesAvailable() < sizeof(m_lastTimeStamp)) {
stopReplay(); stopReplay();
return; return;
} }
int save = lastTimeStamp; int save = m_lastTimeStamp;
file.read((char *)&lastTimeStamp, sizeof(lastTimeStamp)); m_file.read((char *)&m_lastTimeStamp, sizeof(m_lastTimeStamp));
// some validity checks // some validity checks
if (lastTimeStamp < save // logfile goes back in time if (m_lastTimeStamp < save // logfile goes back in time
|| (lastTimeStamp - save) > (60 * 60 * 1000)) { // gap of more than 60 minutes) || (m_lastTimeStamp - save) > (60 * 60 * 1000)) { // gap of more than 60 minutes)
qDebug() << "Error: Logfile corrupted! Unlikely timestamp " << lastTimeStamp << " after " << save << "\n"; qDebug() << "Error: Logfile corrupted! Unlikely timestamp " << m_lastTimeStamp << " after " << save << "\n";
stopReplay(); stopReplay();
return; return;
} }
timeOffset = time; m_timeOffset = time;
time = myTime.elapsed(); time = m_myTime.elapsed();
} }
} else { } else {
stopReplay(); stopReplay();
@ -150,13 +154,13 @@ void LogFile::timerFired()
bool LogFile::startReplay() bool LogFile::startReplay()
{ {
dataBuffer.clear(); m_dataBuffer.clear();
myTime.restart(); m_myTime.restart();
timeOffset = 0; m_timeOffset = 0;
lastPlayed = 0; m_lastPlayed = 0;
file.read((char *)&lastTimeStamp, sizeof(lastTimeStamp)); m_file.read((char *)&m_lastTimeStamp, sizeof(m_lastTimeStamp));
timer.setInterval(10); m_timer.setInterval(10);
timer.start(); m_timer.start();
emit replayStarted(); emit replayStarted();
return true; return true;
} }
@ -170,11 +174,11 @@ bool LogFile::stopReplay()
void LogFile::pauseReplay() void LogFile::pauseReplay()
{ {
timer.stop(); m_timer.stop();
} }
void LogFile::resumeReplay() void LogFile::resumeReplay()
{ {
timeOffset = myTime.elapsed(); m_timeOffset = m_myTime.elapsed();
timer.start(); m_timer.start();
} }

View File

@ -8,20 +8,21 @@
#include <QDebug> #include <QDebug>
#include <QBuffer> #include <QBuffer>
#include <QFile> #include <QFile>
#include "utils_global.h"
class LogFile : public QIODevice { class QTCREATOR_UTILS_EXPORT LogFile : public QIODevice {
Q_OBJECT Q_OBJECT
public: public:
explicit LogFile(QObject *parent = 0); explicit LogFile(QObject *parent = 0);
qint64 bytesAvailable() const; qint64 bytesAvailable() const;
qint64 bytesToWrite() qint64 bytesToWrite()
{ {
return file.bytesToWrite(); return m_file.bytesToWrite();
}; };
bool open(OpenMode mode); bool open(OpenMode mode);
void setFileName(QString name) void setFileName(QString name)
{ {
file.setFileName(name); m_file.setFileName(name);
}; };
void close(); void close();
qint64 writeData(const char *data, qint64 dataSize); qint64 writeData(const char *data, qint64 dataSize);
@ -29,12 +30,21 @@ public:
bool startReplay(); bool startReplay();
bool stopReplay(); bool stopReplay();
void useProvidedTimeStamp(bool useProvidedTimeStamp)
{
m_useProvidedTimeStamp = useProvidedTimeStamp;
}
void setNextTimeStamp(quint32 nextTimestamp)
{
m_nextTimeStamp = nextTimestamp;
}
public slots: public slots:
void setReplaySpeed(double val) void setReplaySpeed(double val)
{ {
playbackSpeed = val; m_playbackSpeed = val;
qDebug() << "Playback speed is now" << playbackSpeed; qDebug() << "Playback speed is now" << m_playbackSpeed;
}; };
void pauseReplay(); void pauseReplay();
void resumeReplay(); void resumeReplay();
@ -48,17 +58,21 @@ signals:
void replayFinished(); void replayFinished();
protected: protected:
QByteArray dataBuffer; QByteArray m_dataBuffer;
QTimer timer; QTimer m_timer;
QTime myTime; QTime m_myTime;
QFile file; QFile m_file;
qint32 lastTimeStamp; qint32 m_lastTimeStamp;
qint32 lastPlayed; qint32 m_lastPlayed;
QMutex mutex; QMutex m_mutex;
int timeOffset; int m_timeOffset;
double playbackSpeed; double m_playbackSpeed;
private:
quint32 m_nextTimeStamp;
bool m_useProvidedTimeStamp;
}; };
#endif // LOGFILE_H #endif // LOGFILE_H

View File

@ -54,7 +54,8 @@ SOURCES += reloadpromptutils.cpp \
mytabwidget.cpp \ mytabwidget.cpp \
cachedsvgitem.cpp \ cachedsvgitem.cpp \
svgimageprovider.cpp \ svgimageprovider.cpp \
hostosinfo.cpp hostosinfo.cpp \
logfile.cpp
SOURCES += xmlconfig.cpp SOURCES += xmlconfig.cpp
@ -111,7 +112,8 @@ HEADERS += utils_global.h \
mytabwidget.h \ mytabwidget.h \
cachedsvgitem.h \ cachedsvgitem.h \
svgimageprovider.h \ svgimageprovider.h \
hostosinfo.h hostosinfo.h \
logfile.h
HEADERS += xmlconfig.h HEADERS += xmlconfig.h

View File

@ -1,25 +1,22 @@
TEMPLATE = lib TEMPLATE = lib
TARGET = LoggingGadget TARGET = LoggingGadget
DEFINES += LOGGING_LIBRARY DEFINES += LOGGING_LIBRARY
QT += svg QT += svg
include(../../openpilotgcsplugin.pri) include(../../openpilotgcsplugin.pri)
include(logging_dependencies.pri) include(logging_dependencies.pri)
HEADERS += loggingplugin.h \ HEADERS += loggingplugin.h \
logfile.h \
logginggadgetwidget.h \ logginggadgetwidget.h \
logginggadget.h \ logginggadget.h \
logginggadgetfactory.h logginggadgetfactory.h
# logginggadgetconfiguration.h
# logginggadgetoptionspage.h
SOURCES += loggingplugin.cpp \ SOURCES += loggingplugin.cpp \
logfile.cpp \
logginggadgetwidget.cpp \ logginggadgetwidget.cpp \
logginggadget.cpp \ logginggadget.cpp \
logginggadgetfactory.cpp logginggadgetfactory.cpp
# logginggadgetconfiguration.cpp \
# logginggadgetoptionspage.cpp
OTHER_FILES += LoggingGadget.pluginspec OTHER_FILES += LoggingGadget.pluginspec
FORMS += logging.ui FORMS += logging.ui
# logginggadgetwidget.ui \
# loggingdialog.ui

View File

@ -35,7 +35,7 @@
#include "uavobjectmanager.h" #include "uavobjectmanager.h"
#include "gcstelemetrystats.h" #include "gcstelemetrystats.h"
#include <uavtalk/uavtalk.h> #include <uavtalk/uavtalk.h>
#include <logfile.h> #include <utils/logfile.h>
#include <QThread> #include <QThread>
#include <QQueue> #include <QQueue>