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:
parent
bc9bbebfdf
commit
81443570ab
@ -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();
|
||||||
}
|
}
|
@ -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
|
@ -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
|
||||||
|
@ -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
|
|
||||||
|
@ -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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user