diff --git a/sdrbase/util/doublebuffer.h b/sdrbase/util/doublebuffer.h index b76db989a..f7bfb22ba 100644 --- a/sdrbase/util/doublebuffer.h +++ b/sdrbase/util/doublebuffer.h @@ -20,6 +20,10 @@ #include #include +#include + +#include "simpleserializer.h" + template class DoubleBufferSimple { @@ -89,6 +93,48 @@ public: unsigned int absoluteFill() const { return m_current - m_data.begin(); } void reset() { m_current = m_data.begin(); } + QByteArray serialize() const + { + SimpleSerializer s(1); + + QByteArray buf(reinterpret_cast(m_data.data()), m_data.size()*sizeof(T)); + s.writeS32(1, m_size); + s.writeU32(2, m_current - m_data.begin()); + s.writeBlob(3, buf); + + return s.final(); + } + + bool deserialize(const QByteArray& data) + { + SimpleDeserializer d(data); + + if(!d.isValid()) { + return false; + } + + if (d.getVersion() == 1) + { + unsigned int tmpUInt; + QByteArray buf; + + d.readS32(1, &m_size, m_data.size()/2); + m_data.resize(2*m_size); + d.readU32(2, &tmpUInt, 0); + m_current = m_data.begin() + tmpUInt; + d.readBlob(3, &buf); + const T* begin = reinterpret_cast(buf.data()); + const T* end = begin + (buf.length()/sizeof(T)); + std::copy(m_data.begin(), begin, end); + + return true; + } + else + { + return false; + } + } + private: int m_size; std::vector m_data; diff --git a/sdrgui/gui/glscopegui.cpp b/sdrgui/gui/glscopegui.cpp index 17b08b15b..82ce036b7 100644 --- a/sdrgui/gui/glscopegui.cpp +++ b/sdrgui/gui/glscopegui.cpp @@ -16,6 +16,7 @@ /////////////////////////////////////////////////////////////////////////////////// #include +#include #include "glscopegui.h" #include "glscope.h" @@ -768,12 +769,43 @@ void GLScopeGUI::on_traceColor_clicked() } } +void GLScopeGUI::on_memorySave_clicked(bool checked __attribute__((unused))) +{ + qDebug("GLScopeGUI::on_memorySave_clicked"); + QString fileName = QFileDialog::getSaveFileName(this, + tr("Open trace memory file"), ".", tr("Trace memory files (*.trcm)"), 0, QFileDialog::DontUseNativeDialog); + + if (fileName != "") + { + QFileInfo fileInfo(fileName); + + if (fileInfo.suffix() != "trcm") { + fileName += ".trcm"; + } + + qDebug("GLScopeGUI::on_memorySave_clicked: %s", qPrintable(fileName)); + } +} + +void GLScopeGUI::on_memoryLoad_clicked(bool checked __attribute__((unused))) +{ + qDebug("GLScopeGUI::on_memoryLoad_clicked"); + + QString fileName = QFileDialog::getOpenFileName(this, + tr("Open trace memory file"), ".", tr("Trace memory files (*.trcm)"), 0, QFileDialog::DontUseNativeDialog); + + if (fileName != "") + { + qDebug("GLScopeGUI::on_memoryLoad_clicked: %s", qPrintable(fileName)); + } +} + void GLScopeGUI::on_mem_valueChanged(int value) { QString text; text.sprintf("%02d", value); ui->memText->setText(text); - disableLiveMode(value > 0); // block trigger UI line if memory is active + disableLiveMode(value > 0); // live / memory mode toggle m_scopeVis->setMemoryIndex(value); } @@ -1224,6 +1256,8 @@ void GLScopeGUI::disableLiveMode(bool disable) ui->trigPre->setEnabled(!disable); ui->trigOneShot->setEnabled(!disable); ui->freerun->setEnabled(!disable); + ui->memorySave->setEnabled(disable); + ui->memoryLoad->setEnabled(disable); } void GLScopeGUI::fillTraceData(ScopeVis::TraceData& traceData) diff --git a/sdrgui/gui/glscopegui.h b/sdrgui/gui/glscopegui.h index 77584c471..be3ccdd98 100644 --- a/sdrgui/gui/glscopegui.h +++ b/sdrgui/gui/glscopegui.h @@ -211,6 +211,8 @@ private slots: void on_traceDelayFine_valueChanged(int value); void on_traceView_toggled(bool checked); void on_traceColor_clicked(); + void on_memorySave_clicked(bool checked); + void on_memoryLoad_clicked(bool checked); void on_mem_valueChanged(int value); // Third row void on_trig_valueChanged(int value); diff --git a/sdrgui/gui/glscopegui.ui b/sdrgui/gui/glscopegui.ui index e4da3f321..04a336824 100644 --- a/sdrgui/gui/glscopegui.ui +++ b/sdrgui/gui/glscopegui.ui @@ -1102,6 +1102,71 @@ kS/s + + + + 0 + + + + + false + + + + 18 + 18 + + + + Save traces in memory + + + + + + + :/save.png:/save.png + + + + 16 + 16 + + + + + + + + false + + + + 18 + 18 + + + + Load traces into memory + + + + + + + :/load.png:/load.png + + + + 16 + 16 + + + + + +