# HG changeset patch # User Hasan Yavuz ÖZDERYA # Date 2018-05-15 22:18:39 # Node ID 68f79a7c6762f30544f7ac344734cc0fafeae662 # Parent 14367aaacba1f8c0900987fe16466cd752cc71be integrated almost all code to to use new Stream class, plotting doesn't work yet building works, needs major cleanup diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ # -# Copyright © 2017 Hasan Yavuz Özderya +# Copyright © 2018 Hasan Yavuz Özderya # # This file is part of serialplot. # @@ -103,7 +103,6 @@ add_executable(${PROGRAM_NAME} WIN32 src/scrollzoomer.cpp src/scrollbar.cpp src/hidabletabwidget.cpp - src/framebuffer.cpp src/scalepicker.cpp src/scalezoomer.cpp src/portlist.cpp @@ -120,8 +119,12 @@ add_executable(${PROGRAM_NAME} WIN32 src/datarecorder.cpp src/tooltipfilter.cpp src/sneakylineedit.cpp - src/channelmanager.cpp + src/stream.cpp + src/streamchannel.cpp src/channelinfomodel.cpp + src/ringbuffer.cpp + src/ringbuffer.cpp + src/indexbuffer.cpp src/framebufferseries.cpp src/numberformatbox.cpp src/endiannessbox.cpp diff --git a/src/barchart.cpp b/src/barchart.cpp --- a/src/barchart.cpp +++ b/src/barchart.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -22,9 +22,9 @@ #include "barchart.h" -BarChart::BarChart(ChannelManager* channelMan) +BarChart::BarChart(const Stream* stream) { - _channelMan = channelMan; + _stream = stream; setSpacing(0); } @@ -35,26 +35,25 @@ void BarChart::resample() QVector BarChart::chartData() const { - unsigned numChannels = _channelMan->numOfChannels(); - unsigned numOfSamples = _channelMan->numOfSamples(); + unsigned numChannels = _stream->numChannels(); + unsigned numSamples = _stream->numSamples(); QVector data(numChannels); for (unsigned i = 0; i < numChannels; i++) { - data[i] = _channelMan->channelBuffer(i)->sample(numOfSamples-1); + data[i] = _stream->channel(i)->yData()->sample(numSamples-1); } return data; } QwtColumnSymbol* BarChart::specialSymbol(int sampleIndex, const QPointF& sample) const { - unsigned numChannels = _channelMan->numOfChannels(); + unsigned numChannels = _stream->numChannels(); if (sampleIndex < 0 || sampleIndex > (int) numChannels) { return NULL; } - auto info = _channelMan->infoModel(); - auto color = info->color(sampleIndex); + auto color = _stream->channel(sampleIndex)->color(); QwtColumnSymbol* symbol = new QwtColumnSymbol(QwtColumnSymbol::Box); symbol->setLineWidth(1); diff --git a/src/barchart.h b/src/barchart.h --- a/src/barchart.h +++ b/src/barchart.h @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -22,12 +22,12 @@ #include #include -#include "channelmanager.h" +#include "stream.h" class BarChart : public QwtPlotBarChart { public: - explicit BarChart(ChannelManager* channelMan); + explicit BarChart(const Stream* stream); void resample(); QwtColumnSymbol* specialSymbol(int sampleIndex, const QPointF&) const; @@ -38,7 +38,7 @@ public: int index, const QPointF &sample ) const; private: - ChannelManager* _channelMan; + const Stream* _stream; QVector chartData() const; }; diff --git a/src/barplot.cpp b/src/barplot.cpp --- a/src/barplot.cpp +++ b/src/barplot.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -21,17 +21,17 @@ #include "barscaledraw.h" #include "utils.h" -BarPlot::BarPlot(ChannelManager* channelMan, PlotMenu* menu, QWidget* parent) : - QwtPlot(parent), _menu(menu), barChart(channelMan) +BarPlot::BarPlot(Stream* stream, PlotMenu* menu, QWidget* parent) : + QwtPlot(parent), _menu(menu), barChart(stream) { - _channelMan = channelMan; + _stream = stream; barChart.attach(this); setAxisMaxMinor(QwtPlot::xBottom, 0); - setAxisScaleDraw(QwtPlot::xBottom, new BarScaleDraw(channelMan)); + setAxisScaleDraw(QwtPlot::xBottom, new BarScaleDraw(stream)); update(); - connect(_channelMan, &ChannelManager::dataAdded, this, &BarPlot::update); - connect(_channelMan, &ChannelManager::numOfChannelsChanged, this, &BarPlot::update); + connect(_stream, &Stream::dataAdded, this, &BarPlot::update); + connect(_stream, &Stream::numChannelsChanged, this, &BarPlot::update); // connect to menu connect(&menu->darkBackgroundAction, SELECT::OVERLOAD_OF(&QAction::toggled), @@ -42,7 +42,7 @@ BarPlot::BarPlot(ChannelManager* channel void BarPlot::update() { // Note: -0.99 is used instead of -1 to handle the case of `numOfChannels==1` - setAxisScale(QwtPlot::xBottom, 0, _channelMan->numOfChannels()-0.99, 1); + setAxisScale(QwtPlot::xBottom, 0, _stream->numChannels()-0.99, 1); barChart.resample(); replot(); } diff --git a/src/barplot.h b/src/barplot.h --- a/src/barplot.h +++ b/src/barplot.h @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -22,7 +22,7 @@ #include -#include "channelmanager.h" +#include "stream.h" #include "plotmenu.h" #include "barchart.h" @@ -31,7 +31,7 @@ class BarPlot : public QwtPlot Q_OBJECT public: - explicit BarPlot(ChannelManager* channelMan, + explicit BarPlot(Stream* stream, PlotMenu* menu, QWidget* parent = 0); @@ -42,7 +42,7 @@ public slots: void darkBackground(bool enabled); private: - ChannelManager* _channelMan; + Stream* _stream; PlotMenu* _menu; BarChart barChart; diff --git a/src/barscaledraw.cpp b/src/barscaledraw.cpp --- a/src/barscaledraw.cpp +++ b/src/barscaledraw.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -21,14 +21,14 @@ #include -BarScaleDraw::BarScaleDraw(ChannelManager* channelMan) +BarScaleDraw::BarScaleDraw(const Stream* stream) { - _channelMan = channelMan; + _stream = stream; enableComponent(Backbone, false); setLabelRotation(-90); setLabelAlignment(Qt::AlignLeft | Qt::AlignVCenter); - QObject::connect(_channelMan, &ChannelManager::channelNameChanged, + QObject::connect(_stream, &Stream::channelNameChanged, [this]() { invalidateCache(); @@ -38,11 +38,11 @@ BarScaleDraw::BarScaleDraw(ChannelManage QwtText BarScaleDraw::label(double value) const { int index = value; - unsigned numChannels = _channelMan->numOfChannels(); + unsigned numChannels = _stream->numChannels(); if (index >=0 && index < (int) numChannels) { - return _channelMan->channelName(index); + return _stream->channel(index)->name(); } else { diff --git a/src/barscaledraw.h b/src/barscaledraw.h --- a/src/barscaledraw.h +++ b/src/barscaledraw.h @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -24,16 +24,16 @@ #include #include -#include "channelmanager.h" +#include "stream.h" class BarScaleDraw : public QwtScaleDraw { public: - explicit BarScaleDraw(ChannelManager* channelMan); + explicit BarScaleDraw(const Stream* stream); QwtText label(double value) const; private: - ChannelManager* _channelMan; + const Stream* _stream; }; #endif // BARSCALEDRAW_H diff --git a/src/dataformatpanel.cpp b/src/dataformatpanel.cpp --- a/src/dataformatpanel.cpp +++ b/src/dataformatpanel.cpp @@ -83,7 +83,7 @@ unsigned DataFormatPanel::numChannels() Source* DataFormatPanel::activeSource() { - return ¤tReader; + return currentReader; } void DataFormatPanel::pause(bool enabled) @@ -100,7 +100,7 @@ void DataFormatPanel::enableDemo(bool en demoReader.enable(); connect(&demoReader, &DemoReader::samplesPerSecondChanged, this, &DataFormatPanel::samplesPerSecondChanged); - emit sourceChanged(&demoreader); + emit sourceChanged(&demoReader); } else { @@ -130,13 +130,12 @@ void DataFormatPanel::selectReader(Abstr reader->settingsWidget()->show(); // notify if number of channels is different - if (currentReader->numOfChannels() != reader->numOfChannels()) + if (currentReader->numChannels() != reader->numChannels()) { - emit numOfChannelsChanged(reader->numOfChannels()); + emit numOfChannelsChanged(reader->numChannels()); } reader->pause(paused); - reader->recording = currentReader->recording; currentReader = reader; emit sourceChanged(currentReader); diff --git a/src/demoreader.h b/src/demoreader.h --- a/src/demoreader.h +++ b/src/demoreader.h @@ -53,6 +53,10 @@ public slots: /// Sets the number of channels, this doesn't trigger a `numOfChannelsChanged` signal. void setNumOfChannels(unsigned value); +signals: + // TODO: added for build only, remove later + void samplesPerSecondChanged(unsigned); + private: bool paused; unsigned _numChannels; diff --git a/src/framebufferseries.cpp b/src/framebufferseries.cpp --- a/src/framebufferseries.cpp +++ b/src/framebufferseries.cpp @@ -20,7 +20,7 @@ #include #include "framebufferseries.h" -FrameBufferSeries::FrameBufferSeries(FrameBuffer* buffer) +FrameBufferSeries::FrameBufferSeries(const FrameBuffer* buffer) { xAsIndex = true; _xmin = 0; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -60,17 +60,16 @@ MainWindow::MainWindow(QWidget *parent) ui(new Ui::MainWindow), aboutDialog(this), portControl(&serialPort), - channelMan(1, 1, this), secondaryPlot(NULL), - snapshotMan(this, &channelMan), + snapshotMan(this, &stream), commandPanel(&serialPort), - dataFormatPanel(&serialPort, &channelMan, &recorder), - recordPanel(&recorder, &channelMan), + dataFormatPanel(&serialPort), + recordPanel(&stream), updateCheckDialog(this) { ui->setupUi(this); - plotMan = new PlotManager(ui->plotArea, &plotMenu, channelMan.infoModel()); + plotMan = new PlotManager(ui->plotArea, &plotMenu, &stream); ui->tabWidget->insertTab(0, &portControl, "Port"); ui->tabWidget->insertTab(1, &dataFormatPanel, "Data Format"); @@ -179,18 +178,8 @@ MainWindow::MainWindow(QWidget *parent) QObject::connect(snapshotMan.takeSnapshotAction(), &QAction::triggered, plotMan, &PlotManager::flashSnapshotOverlay); - // init data format and reader - QObject::connect(&channelMan, &ChannelManager::dataAdded, - plotMan, &PlotManager::replot); - QObject::connect(ui->actionPause, &QAction::triggered, - &channelMan, &ChannelManager::pause); - - QObject::connect(&recordPanel, &RecordPanel::recordStarted, - &dataFormatPanel, &DataFormatPanel::startRecording); - - QObject::connect(&recordPanel, &RecordPanel::recordStopped, - &dataFormatPanel, &DataFormatPanel::stopRecording); + &stream, &Stream::pause); QObject::connect(ui->actionPause, &QAction::triggered, [this](bool enabled) @@ -219,24 +208,8 @@ MainWindow::MainWindow(QWidget *parent) // init data arrays and plot numOfSamples = plotControlPanel.numOfSamples(); - unsigned numOfChannels = dataFormatPanel.numOfChannels(); - - channelMan.setNumOfSamples(numOfSamples); - channelMan.setNumOfChannels(dataFormatPanel.numOfChannels()); - - connect(&dataFormatPanel, &DataFormatPanel::numOfChannelsChanged, - &channelMan, &ChannelManager::setNumOfChannels); - - connect(&channelMan, &ChannelManager::numOfChannelsChanged, - this, &MainWindow::onNumOfChannelsChanged); - - plotControlPanel.setChannelInfoModel(channelMan.infoModel()); - - // init curve list - for (unsigned int i = 0; i < numOfChannels; i++) - { - plotMan->addCurve(channelMan.channelName(i), channelMan.channelBuffer(i)); - } + stream.setNumSamples(numOfSamples); + plotControlPanel.setChannelInfoModel(stream.infoModel()); // init scales plotMan->setYAxis(plotControlPanel.autoScale(), @@ -370,38 +343,14 @@ void MainWindow::onPortToggled(bool open void MainWindow::clearPlot() { - for (unsigned ci = 0; ci < channelMan.numOfChannels(); ci++) - { - channelMan.channelBuffer(ci)->clear(); - } + stream.clear(); plotMan->replot(); } void MainWindow::onNumOfSamplesChanged(int value) { numOfSamples = value; - channelMan.setNumOfSamples(value); - plotMan->replot(); -} - -void MainWindow::onNumOfChannelsChanged(unsigned value) -{ - unsigned int oldNum = plotMan->numOfCurves(); - unsigned numOfChannels = value; - - if (numOfChannels > oldNum) - { - // add new channels - for (unsigned int i = oldNum; i < numOfChannels; i++) - { - plotMan->addCurve(channelMan.channelName(i), channelMan.channelBuffer(i)); - } - } - else if(numOfChannels < oldNum) - { - plotMan->removeCurves(oldNum - numOfChannels); - } - + stream.setNumSamples(value); plotMan->replot(); } @@ -463,7 +412,7 @@ void MainWindow::showBarPlot(bool show) { if (show) { - auto plot = new BarPlot(&channelMan, &plotMenu); + auto plot = new BarPlot(&stream, &plotMenu); plot->setYAxis(plotControlPanel.autoScale(), plotControlPanel.yMin(), plotControlPanel.yMax()); @@ -547,7 +496,7 @@ void MainWindow::saveAllSettings(QSettin saveMWSettings(settings); portControl.saveSettings(settings); dataFormatPanel.saveSettings(settings); - channelMan.saveSettings(settings); + stream.saveSettings(settings); plotControlPanel.saveSettings(settings); plotMenu.saveSettings(settings); commandPanel.saveSettings(settings); @@ -560,7 +509,7 @@ void MainWindow::loadAllSettings(QSettin loadMWSettings(settings); portControl.loadSettings(settings); dataFormatPanel.loadSettings(settings); - channelMan.loadSettings(settings); + stream.loadSettings(settings); plotControlPanel.loadSettings(settings); plotMenu.loadSettings(settings); commandPanel.loadSettings(settings); diff --git a/src/mainwindow.h b/src/mainwindow.h --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -40,8 +40,7 @@ #include "plotcontrolpanel.h" #include "recordpanel.h" #include "ui_about_dialog.h" -#include "framebuffer.h" -#include "channelmanager.h" +#include "stream.h" #include "snapshotmanager.h" #include "plotmanager.h" #include "plotmenu.h" @@ -77,7 +76,8 @@ private: unsigned int numOfSamples; QList curves; - ChannelManager channelMan; + // ChannelManager channelMan; + Stream stream; PlotManager* plotMan; QWidget* secondaryPlot; SnapshotManager snapshotMan; @@ -114,7 +114,6 @@ private slots: void onPortToggled(bool open); void onNumOfSamplesChanged(int value); - void onNumOfChannelsChanged(unsigned value); void clearPlot(); void onSpsChanged(unsigned sps); diff --git a/src/plotmanager.cpp b/src/plotmanager.cpp --- a/src/plotmanager.cpp +++ b/src/plotmanager.cpp @@ -31,6 +31,55 @@ PlotManager::PlotManager(QWidget* plotAr const Stream* stream, QObject* parent) : QObject(parent) { + construct(plotArea, menu); + _stream = stream; + if (_stream == NULL) return; + + // connect to ChannelInfoModel + infoModel = _stream->infoModel(); + connect(infoModel, &QAbstractItemModel::dataChanged, + this, &PlotManager::onChannelInfoChanged); + connect(infoModel, &QAbstractItemModel::modelReset, + [this]() + { + onChannelInfoChanged(infoModel->index(0, 0), // start + infoModel->index(infoModel->rowCount()-1, 0), // end + {}); // roles ignored + }); + + + connect(stream, &Stream::numChannelsChanged, this, &PlotManager::onNumChannelsChanged); + connect(stream, &Stream::dataAdded, this, &PlotManager::replot); + + // add initial curves if any? + for (unsigned int i = 0; i < stream->numChannels(); i++) + { + addCurve(stream->channel(i)->name(), stream->channel(i)->yData()); + } + +} + +PlotManager::PlotManager(QWidget* plotArea, PlotMenu* menu, + Snapshot* snapshot, QObject *parent) : + QObject(parent) +{ + construct(plotArea, menu); + + setNumOfSamples(snapshot->numSamples()); + setPlotWidth(snapshot->numSamples()); + + for (unsigned ci = 0; ci < snapshot->numChannels(); ci++) + { + addCurve(snapshot->channelName(ci), snapshot->data[ci]); + } + + infoModel = snapshot->infoModel(); + connect(infoModel, &QAbstractItemModel::dataChanged, + this, &PlotManager::onChannelInfoChanged); +} + +void PlotManager::construct(QWidget* plotArea, PlotMenu* menu) +{ _menu = menu; _plotArea = plotArea; _autoScaled = true; @@ -38,7 +87,6 @@ PlotManager::PlotManager(QWidget* plotAr _yMax = 1; _xAxisAsIndex = true; isDemoShown = false; - _stream = stream; _numOfSamples = 1; _plotWidth = 1; showSymbols = Plot::ShowSymbolsAuto; @@ -72,22 +120,6 @@ PlotManager::PlotManager(QWidget* plotAr darkBackground(menu->darkBackgroundAction.isChecked()); showLegend(menu->showLegendAction.isChecked()); setMulti(menu->showMultiAction.isChecked()); - - // connect to channel info model - if (_stream != NULL) - { - auto infoModel = _stream->infoModel(); - connect(infoModel, &QAbstractItemModel::dataChanged, - this, &PlotManager::onChannelInfoChanged); - - connect(infoModel, &QAbstractItemModel::modelReset, - [this]() - { - onChannelInfoChanged(infoModel->index(0, 0), // start - infoModel->index(infoModel->rowCount()-1, 0), // end - {}); // roles ignored - }); - } } PlotManager::~PlotManager() @@ -107,6 +139,27 @@ PlotManager::~PlotManager() if (emptyPlot != NULL) delete emptyPlot; } +void PlotManager::onNumChannelsChanged(unsigned value) +{ + unsigned int oldNum = numOfCurves(); + unsigned numOfChannels = value; + + if (numOfChannels > oldNum) + { + // add new channels + for (unsigned int i = oldNum; i < numOfChannels; i++) + { + addCurve(_stream->channel(i)->name(), _stream->channel(i)->yData()); + } + } + else if(numOfChannels < oldNum) + { + removeCurves(oldNum - numOfChannels); + } + + replot(); +} + void PlotManager::onChannelInfoChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles) @@ -276,7 +329,7 @@ Plot* PlotManager::addPlotWidget() return plot; } -void PlotManager::addCurve(QString title, FrameBuffer* buffer) +void PlotManager::addCurve(QString title, const FrameBuffer* buffer) { auto curve = new QwtPlotCurve(title); auto series = new FrameBufferSeries(buffer); @@ -298,7 +351,7 @@ void PlotManager::_addCurve(QwtPlotCurve curves.append(curve); unsigned index = curves.size()-1; - auto color = _stream->channel(index)->color(); + auto color = infoModel->color(index); curve->setPen(color); // create the plot for the curve if we are on multi display diff --git a/src/plotmanager.h b/src/plotmanager.h --- a/src/plotmanager.h +++ b/src/plotmanager.h @@ -32,6 +32,7 @@ #include "plot.h" #include "framebufferseries.h" #include "stream.h" +#include "snapshot.h" #include "plotmenu.h" class PlotManager : public QObject @@ -42,10 +43,13 @@ public: explicit PlotManager(QWidget* plotArea, PlotMenu* menu, const Stream* stream = NULL, QObject *parent = 0); + explicit PlotManager(QWidget* plotArea, PlotMenu* menu, + Snapshot* snapshot, + QObject *parent = 0); ~PlotManager(); /// Add a new curve with title and buffer. A color is /// automatically chosen for curve. - void addCurve(QString title, FrameBuffer* buffer); + void addCurve(QString title, const FrameBuffer* buffer); /// Alternative of `addCurve` for static curve data (snapshots). void addCurve(QString title, QVector data); /// Removes curves from the end @@ -80,7 +84,8 @@ private: QList curves; QList plotWidgets; Plot* emptyPlot; ///< for displaying when all channels are hidden - const Stream* stream; ///< attached stream, can be `NULL` + const Stream* _stream; ///< attached stream, can be `NULL` + const ChannelInfoModel* infoModel; bool isDemoShown; bool _autoScaled; double _yMin; @@ -92,6 +97,8 @@ private: double _plotWidth; Plot::ShowSymbols showSymbols; + /// Common constructor + void construct(QWidget* plotArea, PlotMenu* menu); /// Setups the layout for multi or single plot void setupLayout(bool multiPlot); /// Inserts a new plot widget to the current layout. @@ -111,6 +118,7 @@ private slots: void darkBackground(bool enabled = true); void setSymbols(Plot::ShowSymbols shown); + void onNumChannelsChanged(unsigned value); void onChannelInfoChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight, const QVector & roles = QVector ()); diff --git a/src/recordpanel.cpp b/src/recordpanel.cpp --- a/src/recordpanel.cpp +++ b/src/recordpanel.cpp @@ -235,7 +235,7 @@ void RecordPanel::startRecording(void) } if (recorder.startRecording(selectedFile, getSeparator(), channelNames)) { - stream->connectFollower(&recorder); + _stream->connectFollower(&recorder); } } diff --git a/src/snapshot.cpp b/src/snapshot.cpp --- a/src/snapshot.cpp +++ b/src/snapshot.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -108,9 +108,24 @@ void Snapshot::setName(QString name) emit nameChanged(this); } +unsigned Snapshot::numChannels() const +{ + return data.size(); +} + +unsigned Snapshot::numSamples() const +{ + return data[0].size(); +} + +const ChannelInfoModel* Snapshot::infoModel() const +{ + return &cInfoModel; +} + ChannelInfoModel* Snapshot::infoModel() { - return &cInfoModel; + return const_cast(static_cast(*this).infoModel()); } QString Snapshot::channelName(unsigned channel) diff --git a/src/snapshot.h b/src/snapshot.h --- a/src/snapshot.h +++ b/src/snapshot.h @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -45,6 +45,9 @@ public: QString name(); QString displayName(); ///< `name()` plus '*' if snapshot is not saved + unsigned numChannels() const; ///< number of channels in this snapshot + unsigned numSamples() const; ///< number of samples in every channel + const ChannelInfoModel* infoModel() const; ChannelInfoModel* infoModel(); void setName(QString name); QString channelName(unsigned channel); diff --git a/src/snapshotmanager.cpp b/src/snapshotmanager.cpp --- a/src/snapshotmanager.cpp +++ b/src/snapshotmanager.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -31,14 +31,14 @@ #include "snapshotmanager.h" SnapshotManager::SnapshotManager(MainWindow* mainWindow, - ChannelManager* channelMan) : + Stream* stream) : _menu("&Snapshots"), _takeSnapshotAction("&Take Snapshot", this), loadSnapshotAction("&Load Snapshots", this), clearAction("&Clear Snapshots", this) { _mainWindow = mainWindow; - _channelMan = channelMan; + _stream = stream; _takeSnapshotAction.setToolTip("Take a snapshot of current plot"); _takeSnapshotAction.setShortcut(QKeySequence("F5")); @@ -63,20 +63,22 @@ SnapshotManager::~SnapshotManager() } } -Snapshot* SnapshotManager::makeSnapshot() +Snapshot* SnapshotManager::makeSnapshot() const { QString name = QTime::currentTime().toString("'Snapshot ['HH:mm:ss']'"); - auto snapshot = new Snapshot(_mainWindow, name, *(_channelMan->infoModel())); + auto snapshot = new Snapshot(_mainWindow, name, *(_stream->infoModel())); - unsigned numOfChannels = _channelMan->numOfChannels(); - unsigned numOfSamples = _channelMan->numOfSamples(); + unsigned numChannels = _stream->numChannels(); + unsigned numSamples = _stream->numSamples(); - for (unsigned ci = 0; ci < numOfChannels; ci++) + for (unsigned ci = 0; ci < numChannels; ci++) { - snapshot->data.append(QVector(numOfSamples)); - for (unsigned i = 0; i < numOfSamples; i++) + snapshot->data.append(QVector(numSamples)); + auto x = _stream->channel(ci)->xData(); + auto y = _stream->channel(ci)->yData(); + for (unsigned i = 0; i < numSamples; i++) { - snapshot->data[ci][i] = QPointF(i, _channelMan->channelBuffer(ci)->sample(i)); + snapshot->data[ci][i] = QPointF(x->sample(i), y->sample(i)); } } diff --git a/src/snapshotmanager.h b/src/snapshotmanager.h --- a/src/snapshotmanager.h +++ b/src/snapshotmanager.h @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -24,8 +24,7 @@ #include #include -#include "framebuffer.h" -#include "channelmanager.h" +#include "stream.h" #include "snapshot.h" class MainWindow; @@ -35,7 +34,7 @@ class SnapshotManager : public QObject Q_OBJECT public: - SnapshotManager(MainWindow* mainWindow, ChannelManager* channelMan); + SnapshotManager(MainWindow* mainWindow, Stream* stream); ~SnapshotManager(); QMenu* menu(); @@ -43,13 +42,13 @@ public: /// Creates a dynamically allocated snapshot object but doesn't record it in snapshots list. /// @note Caller is responsible for deletion of the returned `Snapshot` object. - Snapshot* makeSnapshot(); + Snapshot* makeSnapshot() const; bool isAllSaved(); ///< returns `true` if all snapshots are saved to a file private: MainWindow* _mainWindow; - ChannelManager* _channelMan; + Stream* _stream; QList snapshots; diff --git a/src/snapshotview.cpp b/src/snapshotview.cpp --- a/src/snapshotview.cpp +++ b/src/snapshotview.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2017 Hasan Yavuz Özderya + Copyright © 2018 Hasan Yavuz Özderya This file is part of serialplot. @@ -30,20 +30,20 @@ SnapshotView::SnapshotView(MainWindow* p ui->setupUi(this); - plotMan = new PlotManager(ui->plotArea, &plotMenu, snapshot->infoModel(), this); + plotMan = new PlotManager(ui->plotArea, &plotMenu, snapshot, this); ui->menuSnapshot->insertAction(ui->actionClose, snapshot->deleteAction()); this->setWindowTitle(snapshot->displayName()); // initialize curves - unsigned numOfChannels = snapshot->data.size(); - unsigned numOfSamples = snapshot->data[0].size(); - for (unsigned ci = 0; ci < numOfChannels; ci++) - { - plotMan->addCurve(snapshot->channelName(ci), snapshot->data[ci]); - } - plotMan->setNumOfSamples(numOfSamples); - plotMan->setPlotWidth(numOfSamples); + // unsigned numOfChannels = snapshot->data.size(); + // unsigned numOfSamples = snapshot->data[0].size(); + // for (unsigned ci = 0; ci < numOfChannels; ci++) + // { + // plotMan->addCurve(snapshot->channelName(ci), snapshot->data[ci]); + // } + // plotMan->setNumOfSamples(numOfSamples); + // plotMan->setPlotWidth(numOfSamples); renameDialog.setWindowTitle("Rename Snapshot"); renameDialog.setLabelText("Enter new name:"); diff --git a/src/stream.cpp b/src/stream.cpp --- a/src/stream.cpp +++ b/src/stream.cpp @@ -48,8 +48,8 @@ Stream::Stream(unsigned nc, bool x, unsi Stream::~Stream() { - // notify deletion - // delete channels + // TODO: notify deletion + // TODO: delete channels } bool Stream::hasX() const @@ -83,6 +83,11 @@ const ChannelInfoModel* Stream::infoMode return &_infoModel; } +ChannelInfoModel* Stream::infoModel() +{ + return const_cast(static_cast(*this).infoModel()); +} + void Stream::setNumChannels(unsigned nc, bool x) { unsigned oldNum = numChannels(); diff --git a/src/stream.h b/src/stream.h --- a/src/stream.h +++ b/src/stream.h @@ -59,6 +59,7 @@ public: const StreamChannel* channel(unsigned index) const; StreamChannel* channel(unsigned index); const ChannelInfoModel* infoModel() const; + ChannelInfoModel* infoModel(); /// Saves channel information void saveSettings(QSettings* settings) const;