diff --git a/src/abstractreader.cpp b/src/abstractreader.cpp --- a/src/abstractreader.cpp +++ b/src/abstractreader.cpp @@ -19,11 +19,16 @@ #include "abstractreader.h" -AbstractReader::AbstractReader(QIODevice* device, ChannelManager* channelMan, QObject *parent) : +#include + +AbstractReader::AbstractReader(QIODevice* device, ChannelManager* channelMan, + DataRecorder* recorder, QObject* parent) : QObject(parent) { _device = device; _channelMan = channelMan; + _recorder = recorder; + recording = false; // initialize sps counter sampleCount = 0; @@ -48,5 +53,10 @@ void AbstractReader::spsTimerTimeout() void AbstractReader::addData(double* samples, unsigned length) { _channelMan->addData(samples, length); + if (recording) + { + _recorder->addData(samples, length, numOfChannels()); + qDebug() << "adding data"; + } sampleCount += length; } diff --git a/src/abstractreader.h b/src/abstractreader.h --- a/src/abstractreader.h +++ b/src/abstractreader.h @@ -26,6 +26,7 @@ #include #include "channelmanager.h" +#include "datarecorder.h" /** * All reader classes must inherit this class. @@ -34,7 +35,10 @@ class AbstractReader : public QObject { Q_OBJECT public: - explicit AbstractReader(QIODevice* device, ChannelManager* channelMan, QObject *parent = 0); + explicit AbstractReader(QIODevice* device, ChannelManager* channelMan, + DataRecorder* recorder, QObject* parent = 0); + + bool recording; /// is recording started /** * Returns a widget to be shown in data format panel when reader @@ -54,6 +58,16 @@ public: /// 'disabled'. virtual void enable(bool enabled = true) = 0; + /** + * @brief Starts sending data to recorder. + * + * @note recorder must have been started! + */ + void startRecording(); + + /// Stops recording. + void stopRecording(); + signals: void numOfChannelsChanged(unsigned); void samplesPerSecondChanged(unsigned); @@ -75,9 +89,12 @@ protected: private: const int SPS_UPDATE_TIMEOUT = 1; // second - ChannelManager* _channelMan; + unsigned sampleCount; unsigned samplesPerSecond; + + ChannelManager* _channelMan; + DataRecorder* _recorder; QTimer spsTimer; private slots: diff --git a/src/asciireader.cpp b/src/asciireader.cpp --- a/src/asciireader.cpp +++ b/src/asciireader.cpp @@ -24,8 +24,9 @@ /// If set to this value number of channels is determined from input #define NUMOFCHANNELS_AUTO (0) -AsciiReader::AsciiReader(QIODevice* device, ChannelManager* channelMan, QObject *parent) : - AbstractReader(device, channelMan, parent) +AsciiReader::AsciiReader(QIODevice* device, ChannelManager* channelMan, + DataRecorder* recorder, QObject* parent) : + AbstractReader(device, channelMan, recorder, parent) { paused = false; discardFirstLine = true; diff --git a/src/asciireader.h b/src/asciireader.h --- a/src/asciireader.h +++ b/src/asciireader.h @@ -1,5 +1,5 @@ /* - Copyright © 2016 Hasan Yavuz Özderya + Copyright © 2017 Hasan Yavuz Özderya This file is part of serialplot. @@ -30,7 +30,8 @@ class AsciiReader : public AbstractReade Q_OBJECT public: - explicit AsciiReader(QIODevice* device, ChannelManager* channelMan, QObject *parent = 0); + explicit AsciiReader(QIODevice* device, ChannelManager* channelMan, + DataRecorder* recorder, QObject *parent = 0); QWidget* settingsWidget(); unsigned numOfChannels(); void enable(bool enabled = true); diff --git a/src/binarystreamreader.cpp b/src/binarystreamreader.cpp --- a/src/binarystreamreader.cpp +++ b/src/binarystreamreader.cpp @@ -23,8 +23,9 @@ #include "binarystreamreader.h" #include "floatswap.h" -BinaryStreamReader::BinaryStreamReader(QIODevice* device, ChannelManager* channelMan, QObject *parent) : - AbstractReader(device, channelMan, parent) +BinaryStreamReader::BinaryStreamReader(QIODevice* device, ChannelManager* channelMan, + DataRecorder* recorder, QObject* parent) : + AbstractReader(device, channelMan, recorder, parent) { paused = false; skipByteRequested = false; diff --git a/src/binarystreamreader.h b/src/binarystreamreader.h --- a/src/binarystreamreader.h +++ b/src/binarystreamreader.h @@ -34,7 +34,8 @@ class BinaryStreamReader : public Abstra { Q_OBJECT public: - explicit BinaryStreamReader(QIODevice* device, ChannelManager* channelMan, QObject *parent = 0); + explicit BinaryStreamReader(QIODevice* device, ChannelManager* channelMan, + DataRecorder* recorder, QObject *parent = 0); QWidget* settingsWidget(); unsigned numOfChannels(); void enable(bool enabled = true); diff --git a/src/channelmanager.cpp b/src/channelmanager.cpp --- a/src/channelmanager.cpp +++ b/src/channelmanager.cpp @@ -30,6 +30,7 @@ ChannelManager::ChannelManager(unsigned { _numOfChannels = numberOfChannels; _numOfSamples = numberOfSamples; + _paused = false; for (unsigned int i = 0; i < numberOfChannels; i++) { @@ -97,6 +98,11 @@ void ChannelManager::setNumOfSamples(uns emit numOfSamplesChanged(number); } +void ChannelManager::pause(bool paused) +{ + _paused = paused; +} + FrameBuffer* ChannelManager::channelBuffer(unsigned channel) { return channelBuffers[channel]; @@ -165,6 +171,8 @@ void ChannelManager::addData(double* dat { Q_ASSERT(size % _numOfChannels == 0); + if (_paused) return; + int n = size / _numOfChannels; for (unsigned ci = 0; ci < _numOfChannels; ci++) { diff --git a/src/channelmanager.h b/src/channelmanager.h --- a/src/channelmanager.h +++ b/src/channelmanager.h @@ -72,9 +72,13 @@ public slots: */ void addData(double* data, unsigned size); + /// When paused `addData` does nothing. + void pause(bool paused); + private: unsigned _numOfChannels; unsigned _numOfSamples; + bool _paused; QList channelBuffers; // QStringListModel _channelNames; ChannelInfoModel _infoModel; diff --git a/src/dataformatpanel.cpp b/src/dataformatpanel.cpp --- a/src/dataformatpanel.cpp +++ b/src/dataformatpanel.cpp @@ -31,19 +31,21 @@ DataFormatPanel::DataFormatPanel(QSerialPort* port, ChannelManager* channelMan, + DataRecorder* recorder, QWidget *parent) : QWidget(parent), ui(new Ui::DataFormatPanel), - bsReader(port, channelMan, this), - asciiReader(port, channelMan, this), - framedReader(port, channelMan, this), - demoReader(port, channelMan, this) + bsReader(port, channelMan, recorder, this), + asciiReader(port, channelMan, recorder, this), + framedReader(port, channelMan, recorder, this), + demoReader(port, channelMan, recorder, this) { ui->setupUi(this); serialPort = port; _channelMan = channelMan; paused = false; + demoEnabled = false; // initalize default reader currentReader = &bsReader; @@ -98,6 +100,7 @@ void DataFormatPanel::enableDemo(bool en if (enabled) { demoReader.enable(); + demoReader.recording = currentReader->recording; connect(&demoReader, &DemoReader::samplesPerSecondChanged, this, &DataFormatPanel::samplesPerSecondChanged); } @@ -106,6 +109,19 @@ void DataFormatPanel::enableDemo(bool en demoReader.enable(false); disconnect(&demoReader, 0, this, 0); } + demoEnabled = enabled; +} + +void DataFormatPanel::startRecording() +{ + currentReader->recording = true; + if (demoEnabled) demoReader.recording = true; +} + +void DataFormatPanel::stopRecording() +{ + currentReader->recording = false; + if (demoEnabled) demoReader.recording = false; } void DataFormatPanel::selectReader(AbstractReader* reader) @@ -132,8 +148,8 @@ void DataFormatPanel::selectReader(Abstr emit numOfChannelsChanged(reader->numOfChannels()); } - // pause reader->pause(paused); + reader->recording = currentReader->recording; currentReader = reader; } diff --git a/src/dataformatpanel.h b/src/dataformatpanel.h --- a/src/dataformatpanel.h +++ b/src/dataformatpanel.h @@ -34,6 +34,7 @@ #include "asciireader.h" #include "demoreader.h" #include "framedreader.h" +#include "datarecorder.h" namespace Ui { class DataFormatPanel; @@ -46,7 +47,8 @@ class DataFormatPanel : public QWidget public: explicit DataFormatPanel(QSerialPort* port, ChannelManager* channelMan, - QWidget *parent = 0); + DataRecorder* recorder, + QWidget* parent = 0); ~DataFormatPanel(); /// Returns currently selected number of channels @@ -60,6 +62,16 @@ public slots: void pause(bool); void enableDemo(bool); // demo shouldn't be enabled when port is open + /** + * @brief Starts sending data to recorder. + * + * @note recorder must have been started! + */ + void startRecording(); + + /// Stops recording. + void stopRecording(); + signals: void numOfChannelsChanged(unsigned); void samplesPerSecondChanged(unsigned); @@ -80,6 +92,7 @@ private: bool paused; + bool demoEnabled; DemoReader demoReader; }; diff --git a/src/demoreader.cpp b/src/demoreader.cpp --- a/src/demoreader.cpp +++ b/src/demoreader.cpp @@ -25,8 +25,9 @@ #define M_PI 3.14159265358979323846 #endif -DemoReader::DemoReader(QIODevice* device, ChannelManager* channelMan, QObject *parent) : - AbstractReader(device, channelMan, parent) +DemoReader::DemoReader(QIODevice* device, ChannelManager* channelMan, + DataRecorder* recorder, QObject* parent) : + AbstractReader(device, channelMan, recorder, parent) { paused = false; _numOfChannels = 1; diff --git a/src/demoreader.h b/src/demoreader.h --- a/src/demoreader.h +++ b/src/demoreader.h @@ -1,5 +1,5 @@ /* - Copyright © 2016 Hasan Yavuz Özderya + Copyright © 2017 Hasan Yavuz Özderya This file is part of serialplot. @@ -38,7 +38,8 @@ class DemoReader : public AbstractReader Q_OBJECT public: - explicit DemoReader(QIODevice* device, ChannelManager* channelMan, QObject *parent = 0); + explicit DemoReader(QIODevice* device, ChannelManager* channelMan, + DataRecorder* recorder, QObject* parent = 0); /// Demo reader is an exception so this function returns NULL QWidget* settingsWidget(); diff --git a/src/framedreader.cpp b/src/framedreader.cpp --- a/src/framedreader.cpp +++ b/src/framedreader.cpp @@ -23,8 +23,9 @@ #include "framedreader.h" -FramedReader::FramedReader(QIODevice* device, ChannelManager* channelMan, QObject *parent) : - AbstractReader(device, channelMan, parent) +FramedReader::FramedReader(QIODevice* device, ChannelManager* channelMan, + DataRecorder* recorder, QObject* parent) : + AbstractReader(device, channelMan, recorder, parent) { paused = false; diff --git a/src/framedreader.h b/src/framedreader.h --- a/src/framedreader.h +++ b/src/framedreader.h @@ -1,5 +1,5 @@ /* - Copyright © 2016 Hasan Yavuz Özderya + Copyright © 2017 Hasan Yavuz Özderya This file is part of serialplot. @@ -33,7 +33,8 @@ class FramedReader : public AbstractRead Q_OBJECT public: - explicit FramedReader(QIODevice* device, ChannelManager* channelMan, QObject *parent = 0); + explicit FramedReader(QIODevice* device, ChannelManager* channelMan, + DataRecorder* recorder, QObject *parent = 0); QWidget* settingsWidget(); unsigned numOfChannels(); void enable(bool enabled = true); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -62,8 +62,8 @@ MainWindow::MainWindow(QWidget *parent) channelMan(1, 1, this), snapshotMan(this, &channelMan), commandPanel(&serialPort), - dataFormatPanel(&serialPort, &channelMan), - recordPanel(this) + dataFormatPanel(&serialPort, &channelMan, &recorder), + recordPanel(&recorder) { ui->setupUi(this); @@ -152,13 +152,40 @@ MainWindow::MainWindow(QWidget *parent) QObject::connect(&(this->serialPort), SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(onPortError(QSerialPort::SerialPortError))); - // TODO: `replot` must be triggered from ChannelManager // init data format and reader QObject::connect(&channelMan, &ChannelManager::dataAdded, plotMan, &PlotManager::replot); QObject::connect(ui->actionPause, &QAction::triggered, - &dataFormatPanel, &DataFormatPanel::pause); + &channelMan, &ChannelManager::pause); + + QObject::connect(&recordPanel, &RecordPanel::recordStarted, + &dataFormatPanel, &DataFormatPanel::startRecording); + + QObject::connect(&recordPanel, &RecordPanel::recordStopped, + &dataFormatPanel, &DataFormatPanel::stopRecording); + + QObject::connect(ui->actionPause, &QAction::triggered, + [this](bool enabled) + { + if (enabled && !recordPanel.recordPaused()) + { + dataFormatPanel.pause(true); + } + else + { + dataFormatPanel.pause(false); + } + }); + + QObject::connect(&recordPanel, &RecordPanel::recordPausedChanged, + [this](bool enabled) + { + if (ui->actionPause->isChecked() && enabled) + { + dataFormatPanel.pause(false); + } + }); // init data arrays and plot numOfSamples = plotControlPanel.numOfSamples(); diff --git a/src/mainwindow.h b/src/mainwindow.h --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -44,6 +44,7 @@ #include "channelmanager.h" #include "snapshotmanager.h" #include "plotmanager.h" +#include "datarecorder.h" namespace Ui { class MainWindow; @@ -75,12 +76,13 @@ private: ChannelManager channelMan; PlotManager* plotMan; SnapshotManager snapshotMan; + DataRecorder recorder; // operated by `recordPanel` QLabel spsLabel; CommandPanel commandPanel; DataFormatPanel dataFormatPanel; + RecordPanel recordPanel; PlotControlPanel plotControlPanel; - RecordPanel recordPanel; bool isDemoRunning(); /// Stores settings for all modules diff --git a/src/recordpanel.cpp b/src/recordpanel.cpp --- a/src/recordpanel.cpp +++ b/src/recordpanel.cpp @@ -29,14 +29,14 @@ #include -RecordPanel::RecordPanel(QWidget *parent) : +RecordPanel::RecordPanel(DataRecorder* recorder, QWidget *parent) : QWidget(parent), ui(new Ui::RecordPanel), recordToolBar(tr("Record Toolbar")), - recordAction(QIcon::fromTheme("media-record"), tr("Record"), this), - recorder(this) + recordAction(QIcon::fromTheme("media-record"), tr("Record"), this) { overwriteSelected = false; + _recorder = recorder; ui->setupUi(this); @@ -50,6 +50,9 @@ RecordPanel::RecordPanel(QWidget *parent this, &RecordPanel::selectFile); connect(&recordAction, &QAction::triggered, this, &RecordPanel::onRecord); + + connect(ui->cbRecordPaused, SIGNAL(toggled(bool)), + this, SIGNAL(recordPausedChanged(bool))); } RecordPanel::~RecordPanel() @@ -62,6 +65,16 @@ QToolBar* RecordPanel::toolbar() return &recordToolBar; } +bool RecordPanel::isRecording() +{ + return recordAction.isChecked(); +} + +bool RecordPanel::recordPaused() +{ + return ui->cbRecordPaused->isChecked(); +} + bool RecordPanel::selectFile() { QString fileName = QFileDialog::getSaveFileName( @@ -201,18 +214,18 @@ void RecordPanel::startRecording(void) // TEST CODE QStringList cn; - cn << "chan0" << "chan1" << "chan2"; + // cn << "chan0" << "chan1" << "chan2"; - recorder.startRecording(selectedFile, cn); + _recorder->startRecording(selectedFile, cn); // add test data - double data[3] = {15., 15., 15.}; - recorder.addData(data, 3, 3); + // double data[3] = {15., 15., 15.}; + // _recorder.addData(data, 3, 3); + emit recordStarted(); } void RecordPanel::stopRecording(void) { - // TODO - qDebug() << "stop recording"; - recorder.stopRecording(); + emit recordStopped(); + _recorder->stopRecording(); } diff --git a/src/recordpanel.h b/src/recordpanel.h --- a/src/recordpanel.h +++ b/src/recordpanel.h @@ -36,18 +36,26 @@ class RecordPanel : public QWidget Q_OBJECT public: - explicit RecordPanel(QWidget *parent = 0); + explicit RecordPanel(DataRecorder* recorder, QWidget* parent = 0); ~RecordPanel(); QToolBar* toolbar(); + bool isRecording(); + bool recordPaused(); + +signals: + void recordStarted(); + void recordStopped(); + void recordPausedChanged(bool enabled); + private: Ui::RecordPanel *ui; QToolBar recordToolBar; QAction recordAction; QString selectedFile; bool overwriteSelected; - DataRecorder recorder; + DataRecorder* _recorder; /** * @brief Increments the file name.