Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Framework for data filtering via plugin #117

Open
wants to merge 17 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 16 additions & 10 deletions lumberjack.pro
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ SOURCES += \
src/main.cpp \
src/mainwindow.cpp \
src/plugins/plugin_exporter.cpp \
src/plugins/plugin_filter.cpp \
src/plugins/plugin_importer.cpp \
src/plugins/plugin_registry.cpp \
src/widgets/about_dialog.cpp \
Expand All @@ -55,6 +56,7 @@ SOURCES += \
src/widgets/dataview_tree.cpp \
src/widgets/dataview_widget.cpp \
src/widgets/debug_widget.cpp \
src/widgets/filters_widget.cpp \
src/widgets/plot_sampler.cpp \
src/widgets/plugins_dialog.cpp \
src/widgets/series_editor_dialog.cpp \
Expand Down Expand Up @@ -87,11 +89,12 @@ HEADERS += \
src/widgets/dataview_tree.hpp \
src/widgets/dataview_widget.hpp \
src/widgets/debug_widget.hpp \
src/widgets/filters_widget.hpp \
src/widgets/plot_sampler.hpp \
src/widgets/plugins_dialog.hpp \
src/widgets/series_editor_dialog.hpp \
src/widgets/stats_widget.hpp \
src/widgets/timeline_widget.hpp \
src/widgets/timeline_widget.hpp

# simple-fft includes
HEADERS += \
Expand All @@ -109,6 +112,7 @@ FORMS += \
ui/curve_editor_dialog.ui \
ui/dataview_widget.ui \
ui/debug_widget.ui \
ui/filters_widget.ui \
ui/mainwindow.ui \
ui/plugins_dialog.ui \
ui/stats_view.ui
Expand Down Expand Up @@ -167,17 +171,19 @@ CONFIG(debug, debug|release) {

COPIES += dllFiles

CONFIG(debug, debug | release) {
win32 {
# Copy required .DLL files
QMAKE_POST_LINK += $$[QT_INSTALL_BINS]\windeployqt --debug --opengl --openglwidgets --widgets --compiler-runtime $$shell_path($$quote($$DESTDIR))\lumberjack.exe $$escape_expand(\n\t)
}
} else {
win32 {
# Copy required .DLL files
QMAKE_POST_LINK += $$[QT_INSTALL_BINS]\windeployqt --release --opengl --openglwidgets --widgets --compiler-runtime $$shell_path($$quote($$DESTDIR))\lumberjack.exe $$escape_expand(\n\t)
win32 {
# Qt libraries required by windeployqt
QT_LIB = "--core --opengl --openglwidgets --qml --quick --quickwidgets --widgets --compiler-runtime"

CONFIG(release, debug|release) {
# Release mode - run windeployqt
QMAKE_POST_LINK += $$[QT_INSTALL_BINS]\windeployqt --force $$quote($$QT_LIB) $$shell_path($$quote($$DESTDIR))\lumberjack.exe $$escape_expand(\n\t)
} else {
# Debug mode - do not run windeployqt
# Expectation is that the code is run from within QtCreator
}
}


RESOURCES += \
resources.qrc
100 changes: 100 additions & 0 deletions plugins/bitmask_filter/bitmask_filter.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
#include <qrandom.h>


#include "bitmask_filter.hpp"


bool BitmaskFilter::beforeProcessStep()
{
// TODO - set filter options manually
auto gen = QRandomGenerator::securelySeeded();

// Generate a random mask
m_mask = gen.bounded(0xFFFFFFFF);

return true;
}


void BitmaskFilter::afterProcessStep()
{
// TODO
}


void BitmaskFilter::cancelProcessing()
{
// TODO
m_processing = false;
}


uint8_t BitmaskFilter::getProgress() const
{
if (m_input.isNull() || m_output.isNull()) return 0;
if (m_input->size() == 0) return 0;

float progress = (float) m_output->size() / (float) m_input->size();

return (uint8_t) (progress * 100);
}


bool BitmaskFilter::setFilterInputs(QList<DataSeriesPointer> inputs, QStringList &errors)
{
if (!FilterPlugin::setFilterInputs(inputs, errors))
{
return false;
}

m_input = inputs.first();

if (m_input.isNull())
{
errors.append(tr("Null data series provided"));
return false;
}

return true;
}


bool BitmaskFilter::processData()
{
QString label = m_input->getLabel() + " - Bitmask";
m_output = DataSeriesPointer(new DataSeries(label));

uint64_t idx = 0;

m_processing = true;

while (m_processing && idx < m_input->size())
{
DataPoint point = m_input->getDataPoint(idx);

// TODO: Support negative values?
uint32_t value = point.value > 0 ? (uint32_t) point.value : 0;

// Hack for now, apply a "random" AND mask
value &= m_mask;

point.value = (double) value;

m_output->addData(point);

idx++;
}

m_processing = false;
return true;

}


QList<DataSeriesPointer> BitmaskFilter::getFilterOutputs(void)
{
QList<DataSeriesPointer> outputs;

outputs.append(m_output);
return outputs;
}
57 changes: 57 additions & 0 deletions plugins/bitmask_filter/bitmask_filter.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#ifndef LUMBERJACK_CSV_IMPORTER_HPP
#define LUMBERJACK_CSV_IMPORTER_HPP

#include "bitmask_filter_global.h"
#include "plugin_filter.hpp"


/**
* TODO:
* - Apply different bitmask operations (XOR / AND / OR)
* - Specify bitmask
*/


/**
* @brief The ScaleOffsetFilter class provides simple scaling and offset functionality
*/
class CUSTOM_FILTER_EXPORT BitmaskFilter : public FilterPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID FilterInterface_iid)
Q_INTERFACES(FilterPlugin)
public:
virtual ~BitmaskFilter() = default;

// PluginBase functionality
virtual QString pluginName(void) const override { return m_name; }
virtual QString pluginDescription(void) const override { return m_description; }
virtual QString pluginVersion(void) const override { return m_version; }

// DataProcessingPlugin functionality
virtual bool beforeProcessStep(void) override;
virtual void afterProcessStep(void) override;
virtual void cancelProcessing(void) override;
virtual uint8_t getProgress(void) const override;

// FilterPlugin functionality
virtual unsigned int getMinInputCount(void) const override { return 1; }
virtual unsigned int getMaxInputCount(void) const override { return 1; }
virtual bool setFilterInputs(QList<DataSeriesPointer> inputs, QStringList &errors) override;
virtual bool processData(void) override;
virtual QList<DataSeriesPointer> getFilterOutputs(void) override;

protected:
const QString m_name = "Bitmask Filter";
const QString m_description = "Apply custom bitmasking patterns";
const QString m_version = "0.1.0";

uint32_t m_mask = 0x01234567;

bool m_processing = false;

DataSeriesPointer m_input;
DataSeriesPointer m_output;
};

#endif // LUMBERJACK_CSV_IMPORTER_HPP
1 change: 1 addition & 0 deletions plugins/bitmask_filter/bitmask_filter.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ "Keys": [ "bitmask_filter" ] }
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,16 @@ INCLUDEPATH += \
../../src/plugins

HEADERS += \
scaler_filter_global.h \
scaler_filter.hpp \
../../src/data_series.hpp \
../../src/plugins/plugin_base.hpp \
../../src/plugins/plugin_filter.hpp \
bitmask_filter_global.h \
bitmask_filter.hpp \

SOURCES += \
scaler_filter.cpp
../../src/data_series.cpp \
../../src/plugins/plugin_filter.cpp \
bitmask_filter.cpp

# Default rules for deployment.
unix {
Expand All @@ -30,7 +33,6 @@ unix {
CONFIG(debug, debug|release) {
CONFIG += debug
DESTDIR = build/debug

} else {
CONFIG += release
DESTDIR = ../build/release
Expand All @@ -46,4 +48,4 @@ UI_DIR = build/ui
!isEmpty(target.path): INSTALLS += target

DISTFILES += \
scaler_filter.json
bitmask_filter.json
21 changes: 8 additions & 13 deletions plugins/csv_exporter/lumberjack_csv_exporter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,9 @@ QStringList LumberjackCSVExporter::supportedFileTypes() const
}


bool LumberjackCSVExporter::beforeExport(void)
bool LumberjackCSVExporter::beforeProcessStep(void)
{

// TODO: Set export options
return true;
}
Expand All @@ -30,27 +31,21 @@ bool LumberjackCSVExporter::beforeExport(void)
/*
* Export the provided series to a CSV file
*/
bool LumberjackCSVExporter::exportData(QList<DataSeriesPointer> &series, QStringList &errors)
bool LumberjackCSVExporter::processData()
{
if (m_filename.isEmpty())
{
errors.append(tr("Filename is empty"));
return false;
}

QFile outputFile(m_filename);

if (!outputFile.open(QIODevice::WriteOnly) || !outputFile.isOpen() || !outputFile.isWritable())
{
errors.append(tr("Could not open file for writing"));
qCritical() << tr("Could not open file for writing");
return false;
}

// Copy across data series
m_data.clear();
m_indices.clear();

for (auto s : series)
for (auto s : m_series)
{
if (!s.isNull())
{
Expand All @@ -75,7 +70,7 @@ bool LumberjackCSVExporter::exportData(QList<DataSeriesPointer> &series, QString
double tMin = LONG_MAX;
double tMax = -LONG_MAX;

for (auto s : series)
for (auto s : m_series)
{
if (s.isNull()) continue;
if (s->size() == 0) continue;
Expand Down Expand Up @@ -238,13 +233,13 @@ QStringList LumberjackCSVExporter::nextDataRow(bool &valid)
}


void LumberjackCSVExporter::cancelExport()
void LumberjackCSVExporter::cancelProcessing()
{
m_isExporting = false;
}


uint8_t LumberjackCSVExporter::getExportProgress(void) const
uint8_t LumberjackCSVExporter::getProgress(void) const
{
double dt = m_maxTimestamp - m_minTimestamp;

Expand Down
9 changes: 5 additions & 4 deletions plugins/csv_exporter/lumberjack_csv_exporter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,11 @@ class CSV_EXPORTER_EXPORT LumberjackCSVExporter : public ExportPlugin
// Exporter plugin functionality
virtual QStringList supportedFileTypes(void) const override;

virtual bool beforeExport(void) override;
virtual bool exportData(QList<DataSeriesPointer> &series, QStringList &errors) override;
virtual void cancelExport(void) override;
virtual uint8_t getExportProgress(void) const override;
virtual bool processData(void) override;

virtual bool beforeProcessStep(void) override;
virtual void cancelProcessing(void) override;
virtual uint8_t getProgress(void) const override;

protected:
const QString m_name = "CSV Exporter";
Expand Down
Loading