Commit 1c7190e77afeb00acd07d3bb7cfefbd87e5e4114
Committed by
David Gräff
1 parent
9b32a462
Introduce PostProcessingSettings. Remove utils/dsoStrings and add translation me…
…thods directly to the location where the relevant enums are declared. Remove union for math-channel/coupling value: Some compilers have issues here.
Showing
25 changed files
with
316 additions
and
346 deletions
openhantek/readme.md
| @@ -52,8 +52,28 @@ and the graphical part. | @@ -52,8 +52,28 @@ and the graphical part. | ||
| 52 | 52 | ||
| 53 | All OpenGL rendering takes place in the `GlScope` class. A helper class `GlScopeGraph` contains exactly one | 53 | All OpenGL rendering takes place in the `GlScope` class. A helper class `GlScopeGraph` contains exactly one |
| 54 | data sample snapshot including all channels for voltage and spectrum and a pointer to the respective GPU buffer. | 54 | data sample snapshot including all channels for voltage and spectrum and a pointer to the respective GPU buffer. |
| 55 | -`GlScope` works for OpenGL 3.2 and OpenGL ES 2.0, but this needs to be decided at compile time. Usually Qt | ||
| 56 | -selects the right interface. | 55 | +`GlScope` works for OpenGL 3.2 and OpenGL ES 2.0. If both is present, OpenGL will be prefered, but can be |
| 56 | +overwritten by the user via a command flag. | ||
| 57 | + | ||
| 58 | +### Export | ||
| 59 | + | ||
| 60 | +All export related funtionality is within *src/exporting*. | ||
| 61 | + | ||
| 62 | +The following exporters are implemented: | ||
| 63 | + | ||
| 64 | +* Export to comma separated value file (CSV): Write to a user selected file, | ||
| 65 | +* Export to an image/pdf: Writes an image/pdf to a user selected file, | ||
| 66 | +* Print exporter: Creates a printable document and opens the print dialog. | ||
| 67 | + | ||
| 68 | +All export classes (exportcsv, exportimage, exportprint) implement the | ||
| 69 | +ExporterInterface and are registered to the ExporterRegistry in the main.cpp. | ||
| 70 | + | ||
| 71 | +Some export classes are still using the legacyExportDrawer class to | ||
| 72 | +draw the grid and paint all the labels, values and graphs. | ||
| 73 | + | ||
| 74 | +The plan is to retire this legacy class and replace the paint code with | ||
| 75 | +a `GlScope` class shared OpenGL drawing code for at least the grid and the | ||
| 76 | +scope graphs. | ||
| 57 | 77 | ||
| 58 | ## Data flow | 78 | ## Data flow |
| 59 | 79 |
openhantek/src/configdialog/DsoConfigAnalysisPage.cpp
| @@ -15,14 +15,14 @@ DsoConfigAnalysisPage::DsoConfigAnalysisPage(DsoSettings *settings, QWidget *par | @@ -15,14 +15,14 @@ DsoConfigAnalysisPage::DsoConfigAnalysisPage(DsoSettings *settings, QWidget *par | ||
| 15 | windowFunctionLabel = new QLabel(tr("Window function")); | 15 | windowFunctionLabel = new QLabel(tr("Window function")); |
| 16 | windowFunctionComboBox = new QComboBox(); | 16 | windowFunctionComboBox = new QComboBox(); |
| 17 | windowFunctionComboBox->addItems(windowFunctionStrings); | 17 | windowFunctionComboBox->addItems(windowFunctionStrings); |
| 18 | - windowFunctionComboBox->setCurrentIndex((int)settings->scope.spectrumWindow); | 18 | + windowFunctionComboBox->setCurrentIndex((int)settings->post.spectrumWindow); |
| 19 | 19 | ||
| 20 | referenceLevelLabel = new QLabel(tr("Reference level")); | 20 | referenceLevelLabel = new QLabel(tr("Reference level")); |
| 21 | referenceLevelSpinBox = new QDoubleSpinBox(); | 21 | referenceLevelSpinBox = new QDoubleSpinBox(); |
| 22 | referenceLevelSpinBox->setDecimals(1); | 22 | referenceLevelSpinBox->setDecimals(1); |
| 23 | referenceLevelSpinBox->setMinimum(-40.0); | 23 | referenceLevelSpinBox->setMinimum(-40.0); |
| 24 | referenceLevelSpinBox->setMaximum(100.0); | 24 | referenceLevelSpinBox->setMaximum(100.0); |
| 25 | - referenceLevelSpinBox->setValue(settings->scope.spectrumReference); | 25 | + referenceLevelSpinBox->setValue(settings->post.spectrumReference); |
| 26 | referenceLevelUnitLabel = new QLabel(tr("dBm")); | 26 | referenceLevelUnitLabel = new QLabel(tr("dBm")); |
| 27 | referenceLevelLayout = new QHBoxLayout(); | 27 | referenceLevelLayout = new QHBoxLayout(); |
| 28 | referenceLevelLayout->addWidget(referenceLevelSpinBox); | 28 | referenceLevelLayout->addWidget(referenceLevelSpinBox); |
| @@ -33,7 +33,7 @@ DsoConfigAnalysisPage::DsoConfigAnalysisPage(DsoSettings *settings, QWidget *par | @@ -33,7 +33,7 @@ DsoConfigAnalysisPage::DsoConfigAnalysisPage(DsoSettings *settings, QWidget *par | ||
| 33 | minimumMagnitudeSpinBox->setDecimals(1); | 33 | minimumMagnitudeSpinBox->setDecimals(1); |
| 34 | minimumMagnitudeSpinBox->setMinimum(-40.0); | 34 | minimumMagnitudeSpinBox->setMinimum(-40.0); |
| 35 | minimumMagnitudeSpinBox->setMaximum(100.0); | 35 | minimumMagnitudeSpinBox->setMaximum(100.0); |
| 36 | - minimumMagnitudeSpinBox->setValue(settings->scope.spectrumLimit); | 36 | + minimumMagnitudeSpinBox->setValue(settings->post.spectrumLimit); |
| 37 | minimumMagnitudeUnitLabel = new QLabel(tr("dBm")); | 37 | minimumMagnitudeUnitLabel = new QLabel(tr("dBm")); |
| 38 | minimumMagnitudeLayout = new QHBoxLayout(); | 38 | minimumMagnitudeLayout = new QHBoxLayout(); |
| 39 | minimumMagnitudeLayout->addWidget(minimumMagnitudeSpinBox); | 39 | minimumMagnitudeLayout->addWidget(minimumMagnitudeSpinBox); |
| @@ -59,7 +59,7 @@ DsoConfigAnalysisPage::DsoConfigAnalysisPage(DsoSettings *settings, QWidget *par | @@ -59,7 +59,7 @@ DsoConfigAnalysisPage::DsoConfigAnalysisPage(DsoSettings *settings, QWidget *par | ||
| 59 | 59 | ||
| 60 | /// \brief Saves the new settings. | 60 | /// \brief Saves the new settings. |
| 61 | void DsoConfigAnalysisPage::saveSettings() { | 61 | void DsoConfigAnalysisPage::saveSettings() { |
| 62 | - settings->scope.spectrumWindow = (Dso::WindowFunction)windowFunctionComboBox->currentIndex(); | ||
| 63 | - settings->scope.spectrumReference = referenceLevelSpinBox->value(); | ||
| 64 | - settings->scope.spectrumLimit = minimumMagnitudeSpinBox->value(); | 62 | + settings->post.spectrumWindow = (Dso::WindowFunction)windowFunctionComboBox->currentIndex(); |
| 63 | + settings->post.spectrumReference = referenceLevelSpinBox->value(); | ||
| 64 | + settings->post.spectrumLimit = minimumMagnitudeSpinBox->value(); | ||
| 65 | } | 65 | } |
openhantek/src/docks/HorizontalDock.cpp
| @@ -15,7 +15,6 @@ | @@ -15,7 +15,6 @@ | ||
| 15 | 15 | ||
| 16 | #include "scopesettings.h" | 16 | #include "scopesettings.h" |
| 17 | #include "sispinbox.h" | 17 | #include "sispinbox.h" |
| 18 | -#include "utils/dsoStrings.h" | ||
| 19 | #include "utils/printutils.h" | 18 | #include "utils/printutils.h" |
| 20 | 19 | ||
| 21 | template<typename... Args> struct SELECT { | 20 | template<typename... Args> struct SELECT { |
openhantek/src/docks/SpectrumDock.cpp
| @@ -14,7 +14,6 @@ | @@ -14,7 +14,6 @@ | ||
| 14 | 14 | ||
| 15 | #include "settings.h" | 15 | #include "settings.h" |
| 16 | #include "sispinbox.h" | 16 | #include "sispinbox.h" |
| 17 | -#include "utils/dsoStrings.h" | ||
| 18 | #include "utils/printutils.h" | 17 | #include "utils/printutils.h" |
| 19 | 18 | ||
| 20 | template<typename... Args> struct SELECT { | 19 | template<typename... Args> struct SELECT { |
openhantek/src/docks/TriggerDock.cpp
| @@ -15,7 +15,6 @@ | @@ -15,7 +15,6 @@ | ||
| 15 | #include "hantekdso/controlspecification.h" | 15 | #include "hantekdso/controlspecification.h" |
| 16 | #include "settings.h" | 16 | #include "settings.h" |
| 17 | #include "sispinbox.h" | 17 | #include "sispinbox.h" |
| 18 | -#include "utils/dsoStrings.h" | ||
| 19 | #include "utils/printutils.h" | 18 | #include "utils/printutils.h" |
| 20 | 19 | ||
| 21 | TriggerDock::TriggerDock(DsoSettingsScope *scope, const Dso::ControlSpecification *spec, QWidget *parent, | 20 | TriggerDock::TriggerDock(DsoSettingsScope *scope, const Dso::ControlSpecification *spec, QWidget *parent, |
openhantek/src/docks/VoltageDock.cpp
| @@ -14,7 +14,6 @@ | @@ -14,7 +14,6 @@ | ||
| 14 | 14 | ||
| 15 | #include "settings.h" | 15 | #include "settings.h" |
| 16 | #include "sispinbox.h" | 16 | #include "sispinbox.h" |
| 17 | -#include "utils/dsoStrings.h" | ||
| 18 | #include "utils/printutils.h" | 17 | #include "utils/printutils.h" |
| 19 | 18 | ||
| 20 | template<typename... Args> struct SELECT { | 19 | template<typename... Args> struct SELECT { |
| @@ -66,9 +65,9 @@ VoltageDock::VoltageDock(DsoSettingsScope *scope, const Dso::ControlSpecificatio | @@ -66,9 +65,9 @@ VoltageDock::VoltageDock(DsoSettingsScope *scope, const Dso::ControlSpecificatio | ||
| 66 | dockLayout->addWidget(b.invertCheckBox, (int)channel * 3 + 2, 1); | 65 | dockLayout->addWidget(b.invertCheckBox, (int)channel * 3 + 2, 1); |
| 67 | 66 | ||
| 68 | if (channel < spec->channels) | 67 | if (channel < spec->channels) |
| 69 | - setCoupling(channel, scope->voltage[channel].couplingIndex); | 68 | + setCoupling(channel, scope->voltage[channel].couplingOrMathIndex); |
| 70 | else | 69 | else |
| 71 | - setMode(scope->voltage[channel].math); | 70 | + setMode(scope->voltage[channel].couplingOrMathIndex); |
| 72 | setGain(channel, scope->voltage[channel].gainStepIndex); | 71 | setGain(channel, scope->voltage[channel].gainStepIndex); |
| 73 | setUsed(channel, scope->voltage[channel].used); | 72 | setUsed(channel, scope->voltage[channel].used); |
| 74 | 73 | ||
| @@ -80,12 +79,11 @@ VoltageDock::VoltageDock(DsoSettingsScope *scope, const Dso::ControlSpecificatio | @@ -80,12 +79,11 @@ VoltageDock::VoltageDock(DsoSettingsScope *scope, const Dso::ControlSpecificatio | ||
| 80 | this->scope->voltage[channel].inverted = checked; | 79 | this->scope->voltage[channel].inverted = checked; |
| 81 | }); | 80 | }); |
| 82 | connect(b.miscComboBox, SELECT<int>::OVERLOAD_OF(&QComboBox::currentIndexChanged), [this,channel,spec,scope](int index){ | 81 | connect(b.miscComboBox, SELECT<int>::OVERLOAD_OF(&QComboBox::currentIndexChanged), [this,channel,spec,scope](int index){ |
| 82 | + this->scope->voltage[channel].couplingOrMathIndex = (unsigned)index; | ||
| 83 | if (channel < spec->channels) { | 83 | if (channel < spec->channels) { |
| 84 | - this->scope->voltage[channel].couplingIndex = (unsigned)index; | ||
| 85 | emit couplingChanged(channel, scope->coupling(channel, spec)); | 84 | emit couplingChanged(channel, scope->coupling(channel, spec)); |
| 86 | } else { | 85 | } else { |
| 87 | - this->scope->voltage[channel].math = (Dso::MathMode) index; | ||
| 88 | - emit modeChanged(this->scope->voltage[channel].math); | 86 | + emit modeChanged(Dso::getMathMode(this->scope->voltage[channel])); |
| 89 | } | 87 | } |
| 90 | }); | 88 | }); |
| 91 | connect(b.usedCheckBox, &QAbstractButton::toggled, [this,channel](bool checked) { | 89 | connect(b.usedCheckBox, &QAbstractButton::toggled, [this,channel](bool checked) { |
| @@ -119,9 +117,9 @@ void VoltageDock::setGain(ChannelID channel, unsigned gainStepIndex) { | @@ -119,9 +117,9 @@ void VoltageDock::setGain(ChannelID channel, unsigned gainStepIndex) { | ||
| 119 | channelBlocks[channel].gainComboBox->setCurrentIndex((unsigned)gainStepIndex); | 117 | channelBlocks[channel].gainComboBox->setCurrentIndex((unsigned)gainStepIndex); |
| 120 | } | 118 | } |
| 121 | 119 | ||
| 122 | -void VoltageDock::setMode(Dso::MathMode mode) { | 120 | +void VoltageDock::setMode(unsigned mathModeIndex) { |
| 123 | QSignalBlocker blocker(channelBlocks[spec->channels].miscComboBox); | 121 | QSignalBlocker blocker(channelBlocks[spec->channels].miscComboBox); |
| 124 | - channelBlocks[spec->channels].miscComboBox->setCurrentIndex((int)mode); | 122 | + channelBlocks[spec->channels].miscComboBox->setCurrentIndex((int)mathModeIndex); |
| 125 | } | 123 | } |
| 126 | 124 | ||
| 127 | void VoltageDock::setUsed(ChannelID channel, bool used) { | 125 | void VoltageDock::setUsed(ChannelID channel, bool used) { |
openhantek/src/docks/VoltageDock.h
| @@ -10,6 +10,7 @@ | @@ -10,6 +10,7 @@ | ||
| 10 | 10 | ||
| 11 | #include "scopesettings.h" | 11 | #include "scopesettings.h" |
| 12 | #include "hantekdso/controlspecification.h" | 12 | #include "hantekdso/controlspecification.h" |
| 13 | +#include "post/postprocessingsettings.h" | ||
| 13 | 14 | ||
| 14 | class SiSpinBox; | 15 | class SiSpinBox; |
| 15 | 16 | ||
| @@ -28,7 +29,7 @@ class VoltageDock : public QDockWidget { | @@ -28,7 +29,7 @@ class VoltageDock : public QDockWidget { | ||
| 28 | 29 | ||
| 29 | /// \brief Sets the coupling for a channel. | 30 | /// \brief Sets the coupling for a channel. |
| 30 | /// \param channel The channel, whose coupling should be set. | 31 | /// \param channel The channel, whose coupling should be set. |
| 31 | - /// \param coupling The coupling-mode. | 32 | + /// \param couplingIndex The coupling-mode index. |
| 32 | void setCoupling(ChannelID channel, unsigned couplingIndex); | 33 | void setCoupling(ChannelID channel, unsigned couplingIndex); |
| 33 | 34 | ||
| 34 | /// \brief Sets the gain for a channel. | 35 | /// \brief Sets the gain for a channel. |
| @@ -37,8 +38,8 @@ class VoltageDock : public QDockWidget { | @@ -37,8 +38,8 @@ class VoltageDock : public QDockWidget { | ||
| 37 | void setGain(ChannelID channel, unsigned gainStepIndex); | 38 | void setGain(ChannelID channel, unsigned gainStepIndex); |
| 38 | 39 | ||
| 39 | /// \brief Sets the mode for the math channel. | 40 | /// \brief Sets the mode for the math channel. |
| 40 | - /// \param mode The math-mode. | ||
| 41 | - void setMode(Dso::MathMode mode); | 41 | + /// \param mathModeIndex The math-mode index. |
| 42 | + void setMode(unsigned mathModeIndex); | ||
| 42 | 43 | ||
| 43 | /// \brief Enables/disables a channel. | 44 | /// \brief Enables/disables a channel. |
| 44 | /// \param channel The channel, that should be enabled/disabled. | 45 | /// \param channel The channel, that should be enabled/disabled. |
openhantek/src/docks/dockwindows.cpp
| @@ -8,7 +8,7 @@ | @@ -8,7 +8,7 @@ | ||
| 8 | 8 | ||
| 9 | #include <cmath> | 9 | #include <cmath> |
| 10 | 10 | ||
| 11 | -#include "post/enums.h" | 11 | +#include "post/postprocessingsettings.h" |
| 12 | #include "hantekdso/enums.h" | 12 | #include "hantekdso/enums.h" |
| 13 | #include "hantekprotocol/types.h" | 13 | #include "hantekprotocol/types.h" |
| 14 | #include "dockwindows.h" | 14 | #include "dockwindows.h" |
openhantek/src/dsowidget.cpp
| @@ -10,10 +10,10 @@ | @@ -10,10 +10,10 @@ | ||
| 10 | 10 | ||
| 11 | #include "dsowidget.h" | 11 | #include "dsowidget.h" |
| 12 | 12 | ||
| 13 | +#include "post/postprocessingsettings.h" | ||
| 13 | #include "post/graphgenerator.h" | 14 | #include "post/graphgenerator.h" |
| 14 | #include "post/ppresult.h" | 15 | #include "post/ppresult.h" |
| 15 | 16 | ||
| 16 | -#include "utils/dsoStrings.h" | ||
| 17 | #include "utils/printutils.h" | 17 | #include "utils/printutils.h" |
| 18 | 18 | ||
| 19 | #include "glscope.h" | 19 | #include "glscope.h" |
| @@ -252,10 +252,6 @@ void DsoWidget::setupSliders(DsoWidget::Sliders &sliders) { | @@ -252,10 +252,6 @@ void DsoWidget::setupSliders(DsoWidget::Sliders &sliders) { | ||
| 252 | } | 252 | } |
| 253 | } | 253 | } |
| 254 | 254 | ||
| 255 | -void DsoWidget::setExporterForNextFrame(std::unique_ptr<Exporter> exporter) { | ||
| 256 | - this->exportNextFrame = std::move(exporter); | ||
| 257 | -} | ||
| 258 | - | ||
| 259 | /// \brief Set the trigger level sliders minimum and maximum to the new values. | 255 | /// \brief Set the trigger level sliders minimum and maximum to the new values. |
| 260 | void DsoWidget::adaptTriggerLevelSlider(DsoWidget::Sliders &sliders, ChannelID channel) { | 256 | void DsoWidget::adaptTriggerLevelSlider(DsoWidget::Sliders &sliders, ChannelID channel) { |
| 261 | sliders.triggerLevelSlider->setLimits((int)channel, | 257 | sliders.triggerLevelSlider->setLimits((int)channel, |
| @@ -422,7 +418,8 @@ void DsoWidget::updateVoltageCoupling(ChannelID channel) { | @@ -422,7 +418,8 @@ void DsoWidget::updateVoltageCoupling(ChannelID channel) { | ||
| 422 | 418 | ||
| 423 | /// \brief Handles modeChanged signal from the voltage dock. | 419 | /// \brief Handles modeChanged signal from the voltage dock. |
| 424 | void DsoWidget::updateMathMode() { | 420 | void DsoWidget::updateMathMode() { |
| 425 | - measurementMiscLabel[spec->channels]->setText(Dso::mathModeString(scope->voltage[spec->channels].math)); | 421 | + measurementMiscLabel[spec->channels]->setText( |
| 422 | + Dso::mathModeString(Dso::getMathMode(scope->voltage[spec->channels]))); | ||
| 426 | } | 423 | } |
| 427 | 424 | ||
| 428 | /// \brief Handles gainChanged signal from the voltage dock. | 425 | /// \brief Handles gainChanged signal from the voltage dock. |
| @@ -486,15 +483,8 @@ void DsoWidget::updateZoom(bool enabled) { | @@ -486,15 +483,8 @@ void DsoWidget::updateZoom(bool enabled) { | ||
| 486 | 483 | ||
| 487 | /// \brief Prints analyzed data. | 484 | /// \brief Prints analyzed data. |
| 488 | void DsoWidget::showNew(std::shared_ptr<PPresult> data) { | 485 | void DsoWidget::showNew(std::shared_ptr<PPresult> data) { |
| 489 | - if (exportNextFrame) { | ||
| 490 | - exportNextFrame->exportSamples(data.get()); | ||
| 491 | - exportNextFrame.reset(nullptr); | ||
| 492 | - } | ||
| 493 | - | ||
| 494 | - mainScope->showData(data.get()); | ||
| 495 | - mainScope->update(); | ||
| 496 | - zoomScope->showData(data.get()); | ||
| 497 | - zoomScope->update(); | 486 | + mainScope->showData(data); |
| 487 | + zoomScope->showData(data); | ||
| 498 | 488 | ||
| 499 | if (spec->isSoftwareTriggerDevice) { | 489 | if (spec->isSoftwareTriggerDevice) { |
| 500 | QPalette triggerLabelPalette = palette(); | 490 | QPalette triggerLabelPalette = palette(); |
openhantek/src/dsowidget.h
| @@ -8,7 +8,6 @@ | @@ -8,7 +8,6 @@ | ||
| 8 | #include <QGridLayout> | 8 | #include <QGridLayout> |
| 9 | #include <memory> | 9 | #include <memory> |
| 10 | 10 | ||
| 11 | -#include "exporting/exporter.h" | ||
| 12 | #include "glscope.h" | 11 | #include "glscope.h" |
| 13 | #include "levelslider.h" | 12 | #include "levelslider.h" |
| 14 | #include "hantekdso/controlspecification.h" | 13 | #include "hantekdso/controlspecification.h" |
| @@ -36,7 +35,6 @@ class DsoWidget : public QWidget { | @@ -36,7 +35,6 @@ class DsoWidget : public QWidget { | ||
| 36 | /// \param parent The parent widget. | 35 | /// \param parent The parent widget. |
| 37 | /// \param flags Flags for the window manager. | 36 | /// \param flags Flags for the window manager. |
| 38 | DsoWidget(DsoSettingsScope* scope, DsoSettingsView* view, const Dso::ControlSpecification* spec, QWidget *parent = 0, Qt::WindowFlags flags = 0); | 37 | DsoWidget(DsoSettingsScope* scope, DsoSettingsView* view, const Dso::ControlSpecification* spec, QWidget *parent = 0, Qt::WindowFlags flags = 0); |
| 39 | - void setExporterForNextFrame(std::unique_ptr<Exporter> exporter); | ||
| 40 | 38 | ||
| 41 | // Data arrived | 39 | // Data arrived |
| 42 | void showNew(std::shared_ptr<PPresult> data); | 40 | void showNew(std::shared_ptr<PPresult> data); |
| @@ -87,7 +85,6 @@ class DsoWidget : public QWidget { | @@ -87,7 +85,6 @@ class DsoWidget : public QWidget { | ||
| 87 | 85 | ||
| 88 | GlScope *mainScope; ///< The main scope screen | 86 | GlScope *mainScope; ///< The main scope screen |
| 89 | GlScope *zoomScope; ///< The optional magnified scope screen | 87 | GlScope *zoomScope; ///< The optional magnified scope screen |
| 90 | - std::unique_ptr<Exporter> exportNextFrame; | ||
| 91 | 88 | ||
| 92 | public slots: | 89 | public slots: |
| 93 | // Horizontal axis | 90 | // Horizontal axis |
openhantek/src/hantekdso/enums.cpp
| 1 | #include "enums.h" | 1 | #include "enums.h" |
| 2 | +#include <QCoreApplication> | ||
| 2 | 3 | ||
| 3 | namespace Dso { | 4 | namespace Dso { |
| 4 | Enum<Dso::TriggerMode, Dso::TriggerMode::HARDWARE_SOFTWARE, Dso::TriggerMode::SINGLE> TriggerModeEnum; | 5 | Enum<Dso::TriggerMode, Dso::TriggerMode::HARDWARE_SOFTWARE, Dso::TriggerMode::SINGLE> TriggerModeEnum; |
| 5 | Enum<Dso::Slope, Dso::Slope::Positive, Dso::Slope::Negative> SlopeEnum; | 6 | Enum<Dso::Slope, Dso::Slope::Positive, Dso::Slope::Negative> SlopeEnum; |
| 6 | Enum<Dso::GraphFormat, Dso::GraphFormat::TY, Dso::GraphFormat::XY> GraphFormatEnum; | 7 | Enum<Dso::GraphFormat, Dso::GraphFormat::TY, Dso::GraphFormat::XY> GraphFormatEnum; |
| 8 | + | ||
| 9 | + /// \brief Return string representation of the given channel mode. | ||
| 10 | + /// \param mode The ::ChannelMode that should be returned as string. | ||
| 11 | + /// \return The string that should be used in labels etc., empty when invalid. | ||
| 12 | + QString channelModeString(ChannelMode mode) { | ||
| 13 | + switch (mode) { | ||
| 14 | + case ChannelMode::Voltage: | ||
| 15 | + return QCoreApplication::tr("Voltage"); | ||
| 16 | + case ChannelMode::Spectrum: | ||
| 17 | + return QCoreApplication::tr("Spectrum"); | ||
| 18 | + } | ||
| 19 | + return QString(); | ||
| 20 | + } | ||
| 21 | + | ||
| 22 | + /// \brief Return string representation of the given graph format. | ||
| 23 | + /// \param format The ::GraphFormat that should be returned as string. | ||
| 24 | + /// \return The string that should be used in labels etc. | ||
| 25 | + QString graphFormatString(GraphFormat format) { | ||
| 26 | + switch (format) { | ||
| 27 | + case GraphFormat::TY: | ||
| 28 | + return QCoreApplication::tr("T - Y"); | ||
| 29 | + case GraphFormat::XY: | ||
| 30 | + return QCoreApplication::tr("X - Y"); | ||
| 31 | + } | ||
| 32 | + return QString(); | ||
| 33 | + } | ||
| 34 | + | ||
| 35 | + /// \brief Return string representation of the given channel coupling. | ||
| 36 | + /// \param coupling The ::Coupling that should be returned as string. | ||
| 37 | + /// \return The string that should be used in labels etc. | ||
| 38 | + QString couplingString(Coupling coupling) { | ||
| 39 | + switch (coupling) { | ||
| 40 | + case Coupling::AC: | ||
| 41 | + return QCoreApplication::tr("AC"); | ||
| 42 | + case Coupling::DC: | ||
| 43 | + return QCoreApplication::tr("DC"); | ||
| 44 | + case Coupling::GND: | ||
| 45 | + return QCoreApplication::tr("GND"); | ||
| 46 | + } | ||
| 47 | + return QString(); | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | + | ||
| 51 | + /// \brief Return string representation of the given trigger mode. | ||
| 52 | + /// \param mode The ::TriggerMode that should be returned as string. | ||
| 53 | + /// \return The string that should be used in labels etc. | ||
| 54 | + QString triggerModeString(TriggerMode mode) { | ||
| 55 | + switch (mode) { | ||
| 56 | + case TriggerMode::WAIT_FORCE: | ||
| 57 | + return QCoreApplication::tr("Wait/Force"); | ||
| 58 | + case TriggerMode::HARDWARE_SOFTWARE: | ||
| 59 | + return QCoreApplication::tr("Hard-/Software"); | ||
| 60 | + case TriggerMode::SINGLE: | ||
| 61 | + return QCoreApplication::tr("Single"); | ||
| 62 | + } | ||
| 63 | + return QString(); | ||
| 64 | + } | ||
| 65 | + | ||
| 66 | + /// \brief Return string representation of the given trigger slope. | ||
| 67 | + /// \param slope The ::Slope that should be returned as string. | ||
| 68 | + /// \return The string that should be used in labels etc. | ||
| 69 | + QString slopeString(Slope slope) { | ||
| 70 | + switch (slope) { | ||
| 71 | + case Slope::Positive: | ||
| 72 | + return QString::fromUtf8("\u2197"); | ||
| 73 | + case Slope::Negative: | ||
| 74 | + return QString::fromUtf8("\u2198"); | ||
| 75 | + default: | ||
| 76 | + return QString(); | ||
| 77 | + } | ||
| 78 | + } | ||
| 79 | + | ||
| 80 | + /// \brief Return string representation of the given graph interpolation mode. | ||
| 81 | + /// \param interpolation The ::InterpolationMode that should be returned as | ||
| 82 | + /// string. | ||
| 83 | + /// \return The string that should be used in labels etc. | ||
| 84 | + QString interpolationModeString(InterpolationMode interpolation) { | ||
| 85 | + switch (interpolation) { | ||
| 86 | + case INTERPOLATION_OFF: | ||
| 87 | + return QCoreApplication::tr("Off"); | ||
| 88 | + case INTERPOLATION_LINEAR: | ||
| 89 | + return QCoreApplication::tr("Linear"); | ||
| 90 | + case INTERPOLATION_SINC: | ||
| 91 | + return QCoreApplication::tr("Sinc"); | ||
| 92 | + default: | ||
| 93 | + return QString(); | ||
| 94 | + } | ||
| 95 | + } | ||
| 7 | } | 96 | } |
openhantek/src/hantekdso/enums.h
| @@ -2,6 +2,7 @@ | @@ -2,6 +2,7 @@ | ||
| 2 | 2 | ||
| 3 | #include "utils/enumclass.h" | 3 | #include "utils/enumclass.h" |
| 4 | #include <QMetaType> | 4 | #include <QMetaType> |
| 5 | +#include <QString> | ||
| 5 | namespace Dso { | 6 | namespace Dso { |
| 6 | /// \enum ChannelMode | 7 | /// \enum ChannelMode |
| 7 | /// \brief The channel display modes. | 8 | /// \brief The channel display modes. |
| @@ -52,6 +53,13 @@ enum InterpolationMode { | @@ -52,6 +53,13 @@ enum InterpolationMode { | ||
| 52 | INTERPOLATION_SINC, ///< Smooth graph through the dots | 53 | INTERPOLATION_SINC, ///< Smooth graph through the dots |
| 53 | INTERPOLATION_COUNT ///< Total number of interpolation modes | 54 | INTERPOLATION_COUNT ///< Total number of interpolation modes |
| 54 | }; | 55 | }; |
| 56 | + | ||
| 57 | +QString channelModeString(ChannelMode mode); | ||
| 58 | +QString graphFormatString(GraphFormat format); | ||
| 59 | +QString couplingString(Coupling coupling); | ||
| 60 | +QString triggerModeString(TriggerMode mode); | ||
| 61 | +QString slopeString(Slope slope); | ||
| 62 | +QString interpolationModeString(InterpolationMode interpolation); | ||
| 55 | } | 63 | } |
| 56 | 64 | ||
| 57 | Q_DECLARE_METATYPE(Dso::TriggerMode) | 65 | Q_DECLARE_METATYPE(Dso::TriggerMode) |
openhantek/src/hantekdso/hantekdsocontrol.cpp
| @@ -22,30 +22,17 @@ using namespace Hantek; | @@ -22,30 +22,17 @@ using namespace Hantek; | ||
| 22 | using namespace Dso; | 22 | using namespace Dso; |
| 23 | 23 | ||
| 24 | /// \brief Start sampling process. | 24 | /// \brief Start sampling process. |
| 25 | -void HantekDsoControl::startSampling() { | ||
| 26 | - sampling = true; | 25 | +void HantekDsoControl::enableSampling(bool enabled) { |
| 26 | + sampling = enabled; | ||
| 27 | 27 | ||
| 28 | // Emit signals for initial settings | 28 | // Emit signals for initial settings |
| 29 | - emit availableRecordLengthsChanged(controlsettings.samplerate.limits->recordLengths); | ||
| 30 | - updateSamplerateLimits(); | ||
| 31 | - emit recordLengthChanged(getRecordLength()); | ||
| 32 | - if (!isRollMode()) emit recordTimeChanged((double)getRecordLength() / controlsettings.samplerate.current); | ||
| 33 | - emit samplerateChanged(controlsettings.samplerate.current); | 29 | + // emit availableRecordLengthsChanged(controlsettings.samplerate.limits->recordLengths); |
| 30 | + // updateSamplerateLimits(); | ||
| 31 | + // emit recordLengthChanged(getRecordLength()); | ||
| 32 | + // if (!isRollMode()) emit recordTimeChanged((double)getRecordLength() / controlsettings.samplerate.current); | ||
| 33 | + // emit samplerateChanged(controlsettings.samplerate.current); | ||
| 34 | 34 | ||
| 35 | - if (specification->isFixedSamplerateDevice) { | ||
| 36 | - // Convert to GUI presentable values (1e5 -> 1.0, 48e6 -> 480.0 etc) | ||
| 37 | - QList<double> sampleSteps; | ||
| 38 | - for (auto &v : specification->fixedSampleRates) { sampleSteps << v.samplerate / 1e5; } | ||
| 39 | - emit samplerateSet(1, sampleSteps); | ||
| 40 | - } | ||
| 41 | - | ||
| 42 | - emit samplingStarted(); | ||
| 43 | -} | ||
| 44 | - | ||
| 45 | -/// \brief Stop sampling process. | ||
| 46 | -void HantekDsoControl::stopSampling() { | ||
| 47 | - sampling = false; | ||
| 48 | - emit samplingStopped(); | 35 | + emit samplingStatusChanged(enabled); |
| 49 | } | 36 | } |
| 50 | 37 | ||
| 51 | const USBDevice *HantekDsoControl::getDevice() const { return device; } | 38 | const USBDevice *HantekDsoControl::getDevice() const { return device; } |
| @@ -91,25 +78,27 @@ int HantekDsoControl::bulkCommand(const std::vector<unsigned char> *command, int | @@ -91,25 +78,27 @@ int HantekDsoControl::bulkCommand(const std::vector<unsigned char> *command, int | ||
| 91 | return device->bulkWrite(command->data(), command->size(), attempts); | 78 | return device->bulkWrite(command->data(), command->size(), attempts); |
| 92 | } | 79 | } |
| 93 | 80 | ||
| 94 | -unsigned HantekDsoControl::getChannelCount() { return specification->channels; } | 81 | +unsigned HantekDsoControl::getChannelCount() const { return specification->channels; } |
| 95 | 82 | ||
| 96 | const ControlSettings *HantekDsoControl::getDeviceSettings() const { return &controlsettings; } | 83 | const ControlSettings *HantekDsoControl::getDeviceSettings() const { return &controlsettings; } |
| 97 | 84 | ||
| 98 | -const std::vector<unsigned> &HantekDsoControl::getAvailableRecordLengths() { // | 85 | +const std::vector<unsigned> &HantekDsoControl::getAvailableRecordLengths() const { // |
| 99 | return controlsettings.samplerate.limits->recordLengths; | 86 | return controlsettings.samplerate.limits->recordLengths; |
| 100 | } | 87 | } |
| 101 | 88 | ||
| 102 | -double HantekDsoControl::getMinSamplerate() { | 89 | +double HantekDsoControl::getMinSamplerate() const { |
| 103 | return (double)specification->samplerate.single.base / specification->samplerate.single.maxDownsampler; | 90 | return (double)specification->samplerate.single.base / specification->samplerate.single.maxDownsampler; |
| 104 | } | 91 | } |
| 105 | 92 | ||
| 106 | -double HantekDsoControl::getMaxSamplerate() { | 93 | +double HantekDsoControl::getMaxSamplerate() const { |
| 107 | if (controlsettings.usedChannels <= 1) | 94 | if (controlsettings.usedChannels <= 1) |
| 108 | return specification->samplerate.multi.max; | 95 | return specification->samplerate.multi.max; |
| 109 | else | 96 | else |
| 110 | return specification->samplerate.single.max; | 97 | return specification->samplerate.single.max; |
| 111 | } | 98 | } |
| 112 | 99 | ||
| 100 | +bool HantekDsoControl::isSampling() const { return sampling; } | ||
| 101 | + | ||
| 113 | /// \brief Updates the interval of the periodic thread timer. | 102 | /// \brief Updates the interval of the periodic thread timer. |
| 114 | void HantekDsoControl::updateInterval() { | 103 | void HantekDsoControl::updateInterval() { |
| 115 | // Check the current oscilloscope state everytime 25% of the time the buffer | 104 | // Check the current oscilloscope state everytime 25% of the time the buffer |
| @@ -593,13 +582,21 @@ void HantekDsoControl::restoreTargets() { | @@ -593,13 +582,21 @@ void HantekDsoControl::restoreTargets() { | ||
| 593 | } | 582 | } |
| 594 | 583 | ||
| 595 | void HantekDsoControl::updateSamplerateLimits() { | 584 | void HantekDsoControl::updateSamplerateLimits() { |
| 596 | - // Works only if the minimum samplerate for normal mode is lower than for fast | ||
| 597 | - // rate mode, which is the case for all models | ||
| 598 | - const double min = (double)specification->samplerate.single.base / specification->samplerate.single.maxDownsampler; | ||
| 599 | - const double max = getMaxSamplerate(); | ||
| 600 | - | ||
| 601 | - emit samplerateLimitsChanged(min / specification->bufferDividers[controlsettings.recordLengthId], | ||
| 602 | - max / specification->bufferDividers[controlsettings.recordLengthId]); | 585 | + if (specification->isFixedSamplerateDevice) { |
| 586 | + // Convert to GUI presentable values (1e5 -> 1.0, 48e6 -> 480.0 etc) | ||
| 587 | + QList<double> sampleSteps; | ||
| 588 | + for (auto &v : specification->fixedSampleRates) { sampleSteps << v.samplerate / 1e5; } | ||
| 589 | + emit samplerateSet(1, sampleSteps); | ||
| 590 | + } else { | ||
| 591 | + // Works only if the minimum samplerate for normal mode is lower than for fast | ||
| 592 | + // rate mode, which is the case for all models | ||
| 593 | + const double min = | ||
| 594 | + (double)specification->samplerate.single.base / specification->samplerate.single.maxDownsampler; | ||
| 595 | + const double max = getMaxSamplerate(); | ||
| 596 | + | ||
| 597 | + emit samplerateLimitsChanged(min / specification->bufferDividers[controlsettings.recordLengthId], | ||
| 598 | + max / specification->bufferDividers[controlsettings.recordLengthId]); | ||
| 599 | + } | ||
| 603 | } | 600 | } |
| 604 | 601 | ||
| 605 | Dso::ErrorCode HantekDsoControl::setRecordLength(unsigned index) { | 602 | Dso::ErrorCode HantekDsoControl::setRecordLength(unsigned index) { |
| @@ -1175,7 +1172,7 @@ void HantekDsoControl::run() { | @@ -1175,7 +1172,7 @@ void HantekDsoControl::run() { | ||
| 1175 | 1172 | ||
| 1176 | // Check if we're in single trigger mode | 1173 | // Check if we're in single trigger mode |
| 1177 | if (controlsettings.trigger.mode == Dso::TriggerMode::SINGLE && this->_samplingStarted) | 1174 | if (controlsettings.trigger.mode == Dso::TriggerMode::SINGLE && this->_samplingStarted) |
| 1178 | - this->stopSampling(); | 1175 | + this->enableSampling(false); |
| 1179 | 1176 | ||
| 1180 | // Sampling completed, restart it when necessary | 1177 | // Sampling completed, restart it when necessary |
| 1181 | this->_samplingStarted = false; | 1178 | this->_samplingStarted = false; |
| @@ -1216,7 +1213,7 @@ void HantekDsoControl::run() { | @@ -1216,7 +1213,7 @@ void HantekDsoControl::run() { | ||
| 1216 | 1213 | ||
| 1217 | // Check if we're in single trigger mode | 1214 | // Check if we're in single trigger mode |
| 1218 | if (controlsettings.trigger.mode == Dso::TriggerMode::SINGLE && this->_samplingStarted) | 1215 | if (controlsettings.trigger.mode == Dso::TriggerMode::SINGLE && this->_samplingStarted) |
| 1219 | - this->stopSampling(); | 1216 | + this->enableSampling(false); |
| 1220 | 1217 | ||
| 1221 | // Sampling completed, restart it when necessary | 1218 | // Sampling completed, restart it when necessary |
| 1222 | this->_samplingStarted = false; | 1219 | this->_samplingStarted = false; |
openhantek/src/hantekdso/hantekdsocontrol.h
| @@ -52,7 +52,7 @@ class HantekDsoControl : public QObject { | @@ -52,7 +52,7 @@ class HantekDsoControl : public QObject { | ||
| 52 | 52 | ||
| 53 | /// \brief Gets the physical channel count for this oscilloscope. | 53 | /// \brief Gets the physical channel count for this oscilloscope. |
| 54 | /// \return The number of physical channels. | 54 | /// \return The number of physical channels. |
| 55 | - unsigned getChannelCount(); | 55 | + unsigned getChannelCount() const; |
| 56 | 56 | ||
| 57 | /// Return the read-only device control settings. Use the set- Methods to change | 57 | /// Return the read-only device control settings. Use the set- Methods to change |
| 58 | /// device settings. | 58 | /// device settings. |
| @@ -60,15 +60,17 @@ class HantekDsoControl : public QObject { | @@ -60,15 +60,17 @@ class HantekDsoControl : public QObject { | ||
| 60 | 60 | ||
| 61 | /// \brief Get available record lengths for this oscilloscope. | 61 | /// \brief Get available record lengths for this oscilloscope. |
| 62 | /// \return The number of physical channels, empty list for continuous. | 62 | /// \return The number of physical channels, empty list for continuous. |
| 63 | - const std::vector<unsigned> &getAvailableRecordLengths(); | 63 | + const std::vector<unsigned> &getAvailableRecordLengths() const; |
| 64 | 64 | ||
| 65 | /// \brief Get minimum samplerate for this oscilloscope. | 65 | /// \brief Get minimum samplerate for this oscilloscope. |
| 66 | /// \return The minimum samplerate for the current configuration in S/s. | 66 | /// \return The minimum samplerate for the current configuration in S/s. |
| 67 | - double getMinSamplerate(); | 67 | + double getMinSamplerate() const; |
| 68 | 68 | ||
| 69 | /// \brief Get maximum samplerate for this oscilloscope. | 69 | /// \brief Get maximum samplerate for this oscilloscope. |
| 70 | /// \return The maximum samplerate for the current configuration in S/s. | 70 | /// \return The maximum samplerate for the current configuration in S/s. |
| 71 | - double getMaxSamplerate(); | 71 | + double getMaxSamplerate() const; |
| 72 | + | ||
| 73 | + bool isSampling() const; | ||
| 72 | 74 | ||
| 73 | /// Return the associated usb device. | 75 | /// Return the associated usb device. |
| 74 | const USBDevice *getDevice() const; | 76 | const USBDevice *getDevice() const; |
| @@ -182,8 +184,8 @@ class HantekDsoControl : public QObject { | @@ -182,8 +184,8 @@ class HantekDsoControl : public QObject { | ||
| 182 | bool sampling = false; ///< true, if the oscilloscope is taking samples | 184 | bool sampling = false; ///< true, if the oscilloscope is taking samples |
| 183 | 185 | ||
| 184 | // Device setup | 186 | // Device setup |
| 185 | - const Dso::ControlSpecification* specification; ///< The specifications of the device | ||
| 186 | - Dso::ControlSettings controlsettings; ///< The current settings of the device | 187 | + const Dso::ControlSpecification *specification; ///< The specifications of the device |
| 188 | + Dso::ControlSettings controlsettings; ///< The current settings of the device | ||
| 187 | 189 | ||
| 188 | // Results | 190 | // Results |
| 189 | DSOsamples result; | 191 | DSOsamples result; |
| @@ -206,8 +208,10 @@ class HantekDsoControl : public QObject { | @@ -206,8 +208,10 @@ class HantekDsoControl : public QObject { | ||
| 206 | int bulkCommand(const std::vector<unsigned char> *command, int attempts = HANTEK_ATTEMPTS) const; | 208 | int bulkCommand(const std::vector<unsigned char> *command, int attempts = HANTEK_ATTEMPTS) const; |
| 207 | 209 | ||
| 208 | public slots: | 210 | public slots: |
| 209 | - void startSampling(); | ||
| 210 | - void stopSampling(); | 211 | + /// \brief If sampling is disabled, no samplesAvailable() signals are send anymore, no samples |
| 212 | + /// are fetched from the device and no processing takes place. | ||
| 213 | + /// \param enabled Enables/Disables sampling | ||
| 214 | + void enableSampling(bool enabled); | ||
| 211 | 215 | ||
| 212 | /// \brief Sets the size of the oscilloscopes sample buffer. | 216 | /// \brief Sets the size of the oscilloscopes sample buffer. |
| 213 | /// \param index The record length index that should be set. | 217 | /// \param index The record length index that should be set. |
| @@ -270,19 +274,21 @@ class HantekDsoControl : public QObject { | @@ -270,19 +274,21 @@ class HantekDsoControl : public QObject { | ||
| 270 | void forceTrigger(); | 274 | void forceTrigger(); |
| 271 | 275 | ||
| 272 | signals: | 276 | signals: |
| 273 | - void samplingStarted(); ///< The oscilloscope started sampling/waiting for trigger | ||
| 274 | - void samplingStopped(); ///< The oscilloscope stopped sampling/waiting for trigger | 277 | + void samplingStatusChanged(bool enabled); ///< The oscilloscope started/stopped sampling/waiting for trigger |
| 275 | void statusMessage(const QString &message, int timeout); ///< Status message about the oscilloscope | 278 | void statusMessage(const QString &message, int timeout); ///< Status message about the oscilloscope |
| 276 | void samplesAvailable(const DSOsamples *samples); ///< New sample data is available | 279 | void samplesAvailable(const DSOsamples *samples); ///< New sample data is available |
| 277 | 280 | ||
| 278 | void availableRecordLengthsChanged(const std::vector<unsigned> &recordLengths); ///< The available record | 281 | void availableRecordLengthsChanged(const std::vector<unsigned> &recordLengths); ///< The available record |
| 279 | /// lengths, empty list for | 282 | /// lengths, empty list for |
| 280 | 283 | ||
| 281 | - void samplerateLimitsChanged(double minimum, double maximum); ///< The minimum or maximum samplerate has changed | ||
| 282 | - void recordLengthChanged(unsigned long duration); ///< The record length has changed | ||
| 283 | - void recordTimeChanged(double duration); ///< The record time duration has changed | ||
| 284 | - void samplerateChanged(double samplerate); ///< The samplerate has changed | ||
| 285 | - void samplerateSet(int mode, QList<double> sampleSteps); ///< The samplerate has changed | 284 | + /// The available samplerate range has changed |
| 285 | + void samplerateLimitsChanged(double minimum, double maximum); | ||
| 286 | + /// The available samplerate for fixed samplerate devices has changed | ||
| 287 | + void samplerateSet(int mode, QList<double> sampleSteps); | ||
| 288 | + | ||
| 289 | + void recordLengthChanged(unsigned long duration); ///< The record length has changed | ||
| 290 | + void recordTimeChanged(double duration); ///< The record time duration has changed | ||
| 291 | + void samplerateChanged(double samplerate); ///< The samplerate has changed | ||
| 286 | 292 | ||
| 287 | void communicationError() const; | 293 | void communicationError() const; |
| 288 | }; | 294 | }; |
openhantek/src/post/enums.cpp deleted
openhantek/src/post/mathchannelgenerator.cpp
| 1 | #include "mathchannelgenerator.h" | 1 | #include "mathchannelgenerator.h" |
| 2 | #include "scopesettings.h" | 2 | #include "scopesettings.h" |
| 3 | +#include "post/postprocessingsettings.h" | ||
| 4 | +#include "enums.h" | ||
| 3 | 5 | ||
| 4 | MathChannelGenerator::MathChannelGenerator(const DsoSettingsScope *scope, unsigned physicalChannels) | 6 | MathChannelGenerator::MathChannelGenerator(const DsoSettingsScope *scope, unsigned physicalChannels) |
| 5 | : physicalChannels(physicalChannels), scope(scope) {} | 7 | : physicalChannels(physicalChannels), scope(scope) {} |
| @@ -27,7 +29,7 @@ void MathChannelGenerator::process(PPresult *result) { | @@ -27,7 +29,7 @@ void MathChannelGenerator::process(PPresult *result) { | ||
| 27 | std::vector<double>::const_iterator ch1Iterator = result->data(0)->voltage.sample.begin(); | 29 | std::vector<double>::const_iterator ch1Iterator = result->data(0)->voltage.sample.begin(); |
| 28 | std::vector<double>::const_iterator ch2Iterator = result->data(1)->voltage.sample.begin(); | 30 | std::vector<double>::const_iterator ch2Iterator = result->data(1)->voltage.sample.begin(); |
| 29 | for (std::vector<double>::iterator it = resultData.begin(); it != resultData.end(); ++it) { | 31 | for (std::vector<double>::iterator it = resultData.begin(); it != resultData.end(); ++it) { |
| 30 | - switch (scope->voltage[physicalChannels].math) { | 32 | + switch (Dso::getMathMode(scope->voltage[physicalChannels])) { |
| 31 | case Dso::MathMode::ADD_CH1_CH2: | 33 | case Dso::MathMode::ADD_CH1_CH2: |
| 32 | *it = *ch1Iterator + *ch2Iterator; | 34 | *it = *ch1Iterator + *ch2Iterator; |
| 33 | break; | 35 | break; |
openhantek/src/post/postprocessingsettings.cpp
0 → 100644
| 1 | +#include "postprocessingsettings.h" | ||
| 2 | + | ||
| 3 | +#include <QCoreApplication> | ||
| 4 | +#include <QString> | ||
| 5 | + | ||
| 6 | +namespace Dso { | ||
| 7 | + | ||
| 8 | +Enum<Dso::MathMode, Dso::MathMode::ADD_CH1_CH2, Dso::MathMode::SUB_CH1_FROM_CH2> MathModeEnum; | ||
| 9 | +Enum<Dso::WindowFunction, Dso::WindowFunction::RECTANGULAR, Dso::WindowFunction::FLATTOP> WindowFunctionEnum; | ||
| 10 | + | ||
| 11 | +/// \brief Return string representation of the given math mode. | ||
| 12 | +/// \param mode The ::MathMode that should be returned as string. | ||
| 13 | +/// \return The string that should be used in labels etc. | ||
| 14 | +QString mathModeString(MathMode mode) { | ||
| 15 | + switch (mode) { | ||
| 16 | + case MathMode::ADD_CH1_CH2: | ||
| 17 | + return QCoreApplication::tr("CH1 + CH2"); | ||
| 18 | + case MathMode::SUB_CH2_FROM_CH1: | ||
| 19 | + return QCoreApplication::tr("CH1 - CH2"); | ||
| 20 | + case MathMode::SUB_CH1_FROM_CH2: | ||
| 21 | + return QCoreApplication::tr("CH2 - CH1"); | ||
| 22 | + } | ||
| 23 | + return QString(); | ||
| 24 | +} | ||
| 25 | +/// \brief Return string representation of the given dft window function. | ||
| 26 | +/// \param window The ::WindowFunction that should be returned as string. | ||
| 27 | +/// \return The string that should be used in labels etc. | ||
| 28 | +QString windowFunctionString(WindowFunction window) { | ||
| 29 | + switch (window) { | ||
| 30 | + case WindowFunction::RECTANGULAR: | ||
| 31 | + return QCoreApplication::tr("Rectangular"); | ||
| 32 | + case WindowFunction::HAMMING: | ||
| 33 | + return QCoreApplication::tr("Hamming"); | ||
| 34 | + case WindowFunction::HANN: | ||
| 35 | + return QCoreApplication::tr("Hann"); | ||
| 36 | + case WindowFunction::COSINE: | ||
| 37 | + return QCoreApplication::tr("Cosine"); | ||
| 38 | + case WindowFunction::LANCZOS: | ||
| 39 | + return QCoreApplication::tr("Lanczos"); | ||
| 40 | + case WindowFunction::BARTLETT: | ||
| 41 | + return QCoreApplication::tr("Bartlett"); | ||
| 42 | + case WindowFunction::TRIANGULAR: | ||
| 43 | + return QCoreApplication::tr("Triangular"); | ||
| 44 | + case WindowFunction::GAUSS: | ||
| 45 | + return QCoreApplication::tr("Gauss"); | ||
| 46 | + case WindowFunction::BARTLETTHANN: | ||
| 47 | + return QCoreApplication::tr("Bartlett-Hann"); | ||
| 48 | + case WindowFunction::BLACKMAN: | ||
| 49 | + return QCoreApplication::tr("Blackman"); | ||
| 50 | + // case WindowFunction::WINDOW_KAISER: | ||
| 51 | + // return QCoreApplication::tr("Kaiser"); | ||
| 52 | + case WindowFunction::NUTTALL: | ||
| 53 | + return QCoreApplication::tr("Nuttall"); | ||
| 54 | + case WindowFunction::BLACKMANHARRIS: | ||
| 55 | + return QCoreApplication::tr("Blackman-Harris"); | ||
| 56 | + case WindowFunction::BLACKMANNUTTALL: | ||
| 57 | + return QCoreApplication::tr("Blackman-Nuttall"); | ||
| 58 | + case WindowFunction::FLATTOP: | ||
| 59 | + return QCoreApplication::tr("Flat top"); | ||
| 60 | + } | ||
| 61 | + return QString(); | ||
| 62 | +} | ||
| 63 | +} |
openhantek/src/post/enums.h renamed to openhantek/src/post/postprocessingsettings.h
| 1 | #pragma once | 1 | #pragma once |
| 2 | 2 | ||
| 3 | -#include <QMetaType> | ||
| 4 | #include "utils/enumclass.h" | 3 | #include "utils/enumclass.h" |
| 4 | +#include <QMetaType> | ||
| 5 | namespace Dso { | 5 | namespace Dso { |
| 6 | 6 | ||
| 7 | /// \enum MathMode | 7 | /// \enum MathMode |
| 8 | /// \brief The different math modes for the math-channel. | 8 | /// \brief The different math modes for the math-channel. |
| 9 | -enum class MathMode { | ||
| 10 | - ADD_CH1_CH2, | ||
| 11 | - SUB_CH2_FROM_CH1, | ||
| 12 | - SUB_CH1_FROM_CH2 | ||
| 13 | -}; | ||
| 14 | -extern Enum<Dso::MathMode,Dso::MathMode::ADD_CH1_CH2,Dso::MathMode::SUB_CH1_FROM_CH2> MathModeEnum; | 9 | +enum class MathMode : unsigned { ADD_CH1_CH2, SUB_CH2_FROM_CH1, SUB_CH1_FROM_CH2 }; |
| 10 | +extern Enum<Dso::MathMode, Dso::MathMode::ADD_CH1_CH2, Dso::MathMode::SUB_CH1_FROM_CH2> MathModeEnum; | ||
| 11 | + | ||
| 12 | +template<class T> | ||
| 13 | +inline MathMode getMathMode(T& t) { return (MathMode)t.couplingOrMathIndex; } | ||
| 15 | 14 | ||
| 16 | /// \enum WindowFunction | 15 | /// \enum WindowFunction |
| 17 | /// \brief The supported window functions. | 16 | /// \brief The supported window functions. |
| 18 | /// These are needed for spectrum analysis and are applied to the sample values | 17 | /// These are needed for spectrum analysis and are applied to the sample values |
| 19 | /// before calculating the DFT. | 18 | /// before calculating the DFT. |
| 20 | -enum class WindowFunction: int { | 19 | +enum class WindowFunction : int { |
| 21 | RECTANGULAR, ///< Rectangular window (aka Dirichlet) | 20 | RECTANGULAR, ///< Rectangular window (aka Dirichlet) |
| 22 | HAMMING, ///< Hamming window | 21 | HAMMING, ///< Hamming window |
| 23 | HANN, ///< Hann window | 22 | HANN, ///< Hann window |
| @@ -32,12 +31,19 @@ enum class WindowFunction: int { | @@ -32,12 +31,19 @@ enum class WindowFunction: int { | ||
| 32 | NUTTALL, ///< Nuttall window, cont. first deriv. | 31 | NUTTALL, ///< Nuttall window, cont. first deriv. |
| 33 | BLACKMANHARRIS, ///< Blackman-Harris window | 32 | BLACKMANHARRIS, ///< Blackman-Harris window |
| 34 | BLACKMANNUTTALL, ///< Blackman-Nuttall window | 33 | BLACKMANNUTTALL, ///< Blackman-Nuttall window |
| 35 | - FLATTOP ///< Flat top window | 34 | + FLATTOP ///< Flat top window |
| 36 | }; | 35 | }; |
| 37 | -extern Enum<Dso::WindowFunction,Dso::WindowFunction::RECTANGULAR,Dso::WindowFunction::FLATTOP> WindowFunctionEnum; | 36 | +extern Enum<Dso::WindowFunction, Dso::WindowFunction::RECTANGULAR, Dso::WindowFunction::FLATTOP> WindowFunctionEnum; |
| 38 | 37 | ||
| 38 | +QString mathModeString(MathMode mode); | ||
| 39 | +QString windowFunctionString(WindowFunction window); | ||
| 39 | } | 40 | } |
| 40 | 41 | ||
| 41 | Q_DECLARE_METATYPE(Dso::MathMode) | 42 | Q_DECLARE_METATYPE(Dso::MathMode) |
| 42 | Q_DECLARE_METATYPE(Dso::WindowFunction) | 43 | Q_DECLARE_METATYPE(Dso::WindowFunction) |
| 43 | 44 | ||
| 45 | +struct DsoSettingsPostProcessing { | ||
| 46 | + Dso::WindowFunction spectrumWindow = Dso::WindowFunction::HANN; ///< Window function for DFT | ||
| 47 | + double spectrumReference = 0.0; ///< Reference level for spectrum in dBm | ||
| 48 | + double spectrumLimit = -20.0; ///< Minimum magnitude of the spectrum (Avoids peaks) | ||
| 49 | +}; |
openhantek/src/post/spectrumgenerator.cpp
| @@ -16,7 +16,8 @@ | @@ -16,7 +16,8 @@ | ||
| 16 | #include "utils/printutils.h" | 16 | #include "utils/printutils.h" |
| 17 | 17 | ||
| 18 | /// \brief Analyzes the data from the dso. | 18 | /// \brief Analyzes the data from the dso. |
| 19 | -SpectrumGenerator::SpectrumGenerator(const DsoSettingsScope *scope) : scope(scope) {} | 19 | +SpectrumGenerator::SpectrumGenerator(const DsoSettingsScope *scope, const DsoSettingsPostProcessing *postprocessing) |
| 20 | + : scope(scope), postprocessing(postprocessing) {} | ||
| 20 | 21 | ||
| 21 | SpectrumGenerator::~SpectrumGenerator() { | 22 | SpectrumGenerator::~SpectrumGenerator() { |
| 22 | if (lastWindowBuffer) fftw_free(lastWindowBuffer); | 23 | if (lastWindowBuffer) fftw_free(lastWindowBuffer); |
| @@ -36,15 +37,15 @@ void SpectrumGenerator::process(PPresult *result) { | @@ -36,15 +37,15 @@ void SpectrumGenerator::process(PPresult *result) { | ||
| 36 | 37 | ||
| 37 | // Calculate new window | 38 | // Calculate new window |
| 38 | size_t sampleCount = channelData->voltage.sample.size(); | 39 | size_t sampleCount = channelData->voltage.sample.size(); |
| 39 | - if (!lastWindowBuffer || lastWindow != scope->spectrumWindow || lastRecordLength != sampleCount) { | 40 | + if (!lastWindowBuffer || lastWindow != postprocessing->spectrumWindow || lastRecordLength != sampleCount) { |
| 40 | if (lastWindowBuffer) fftw_free(lastWindowBuffer); | 41 | if (lastWindowBuffer) fftw_free(lastWindowBuffer); |
| 41 | lastWindowBuffer = fftw_alloc_real(sampleCount); | 42 | lastWindowBuffer = fftw_alloc_real(sampleCount); |
| 42 | lastRecordLength = (unsigned)sampleCount; | 43 | lastRecordLength = (unsigned)sampleCount; |
| 43 | 44 | ||
| 44 | unsigned int windowEnd = lastRecordLength - 1; | 45 | unsigned int windowEnd = lastRecordLength - 1; |
| 45 | - lastWindow = scope->spectrumWindow; | 46 | + lastWindow = postprocessing->spectrumWindow; |
| 46 | 47 | ||
| 47 | - switch (scope->spectrumWindow) { | 48 | + switch (postprocessing->spectrumWindow) { |
| 48 | case Dso::WindowFunction::HAMMING: | 49 | case Dso::WindowFunction::HAMMING: |
| 49 | for (unsigned int windowPosition = 0; windowPosition < lastRecordLength; ++windowPosition) | 50 | for (unsigned int windowPosition = 0; windowPosition < lastRecordLength; ++windowPosition) |
| 50 | *(lastWindowBuffer + windowPosition) = 0.54 - 0.46 * cos(2.0 * M_PI * windowPosition / windowEnd); | 51 | *(lastWindowBuffer + windowPosition) = 0.54 - 0.46 * cos(2.0 * M_PI * windowPosition / windowEnd); |
| @@ -210,8 +211,8 @@ void SpectrumGenerator::process(PPresult *result) { | @@ -210,8 +211,8 @@ void SpectrumGenerator::process(PPresult *result) { | ||
| 210 | // Finally calculate the real spectrum if we want it | 211 | // Finally calculate the real spectrum if we want it |
| 211 | if (scope->spectrum[channel].used) { | 212 | if (scope->spectrum[channel].used) { |
| 212 | // Convert values into dB (Relative to the reference level) | 213 | // Convert values into dB (Relative to the reference level) |
| 213 | - double offset = 60 - scope->spectrumReference - 20 * log10(dftLength); | ||
| 214 | - double offsetLimit = scope->spectrumLimit - scope->spectrumReference; | 214 | + double offset = 60 - postprocessing->spectrumReference - 20 * log10(dftLength); |
| 215 | + double offsetLimit = postprocessing->spectrumLimit - postprocessing->spectrumReference; | ||
| 215 | for (std::vector<double>::iterator spectrumIterator = channelData->spectrum.sample.begin(); | 216 | for (std::vector<double>::iterator spectrumIterator = channelData->spectrum.sample.begin(); |
| 216 | spectrumIterator != channelData->spectrum.sample.end(); ++spectrumIterator) { | 217 | spectrumIterator != channelData->spectrum.sample.end(); ++spectrumIterator) { |
| 217 | double value = 20 * log10(fabs(*spectrumIterator)) + offset; | 218 | double value = 20 * log10(fabs(*spectrumIterator)) + offset; |
openhantek/src/post/spectrumgenerator.h
| @@ -11,7 +11,7 @@ | @@ -11,7 +11,7 @@ | ||
| 11 | #include "ppresult.h" | 11 | #include "ppresult.h" |
| 12 | #include "dsosamples.h" | 12 | #include "dsosamples.h" |
| 13 | #include "utils/printutils.h" | 13 | #include "utils/printutils.h" |
| 14 | -#include "enums.h" | 14 | +#include "postprocessingsettings.h" |
| 15 | 15 | ||
| 16 | #include "processor.h" | 16 | #include "processor.h" |
| 17 | 17 | ||
| @@ -23,12 +23,13 @@ struct DsoSettingsScope; | @@ -23,12 +23,13 @@ struct DsoSettingsScope; | ||
| 23 | /// time-/frequencysteps between two values. | 23 | /// time-/frequencysteps between two values. |
| 24 | class SpectrumGenerator : public Processor { | 24 | class SpectrumGenerator : public Processor { |
| 25 | public: | 25 | public: |
| 26 | - SpectrumGenerator(const DsoSettingsScope* scope); | 26 | + SpectrumGenerator(const DsoSettingsScope* scope, const DsoSettingsPostProcessing* postprocessing); |
| 27 | virtual ~SpectrumGenerator(); | 27 | virtual ~SpectrumGenerator(); |
| 28 | virtual void process(PPresult *data) override; | 28 | virtual void process(PPresult *data) override; |
| 29 | 29 | ||
| 30 | private: | 30 | private: |
| 31 | const DsoSettingsScope* scope; | 31 | const DsoSettingsScope* scope; |
| 32 | + const DsoSettingsPostProcessing* postprocessing; | ||
| 32 | unsigned int lastRecordLength = 0; ///< The record length of the previously analyzed data | 33 | unsigned int lastRecordLength = 0; ///< The record length of the previously analyzed data |
| 33 | Dso::WindowFunction lastWindow = (Dso::WindowFunction)-1; ///< The previously used dft window function | 34 | Dso::WindowFunction lastWindow = (Dso::WindowFunction)-1; ///< The previously used dft window function |
| 34 | double *lastWindowBuffer = nullptr; | 35 | double *lastWindowBuffer = nullptr; |
openhantek/src/scopesettings.h
| @@ -7,7 +7,6 @@ | @@ -7,7 +7,6 @@ | ||
| 7 | #include "hantekdso/controlspecification.h" | 7 | #include "hantekdso/controlspecification.h" |
| 8 | #include "hantekdso/enums.h" | 8 | #include "hantekdso/enums.h" |
| 9 | #include "hantekprotocol/definitions.h" | 9 | #include "hantekprotocol/definitions.h" |
| 10 | -#include "post/enums.h" | ||
| 11 | #include <vector> | 10 | #include <vector> |
| 12 | 11 | ||
| 13 | #define MARKER_COUNT 2 ///< Number of markers | 12 | #define MARKER_COUNT 2 ///< Number of markers |
| @@ -52,37 +51,30 @@ struct DsoSettingsScopeSpectrum { | @@ -52,37 +51,30 @@ struct DsoSettingsScopeSpectrum { | ||
| 52 | /// \brief Holds the settings for the normal voltage graphs. | 51 | /// \brief Holds the settings for the normal voltage graphs. |
| 53 | /// TODO Use ControlSettingsVoltage | 52 | /// TODO Use ControlSettingsVoltage |
| 54 | struct DsoSettingsScopeVoltage { | 53 | struct DsoSettingsScopeVoltage { |
| 55 | - double offset = 0.0; ///< Vertical offset in divs | ||
| 56 | - double trigger = 0.0; ///< Trigger level in V | ||
| 57 | - unsigned gainStepIndex = 6; ///< The vertical resolution in V/div (default = 1.0) | ||
| 58 | - union { ///< Different enums, coupling for real- and mode for math-channels | ||
| 59 | - Dso::MathMode math; | ||
| 60 | - unsigned couplingIndex = 0; | ||
| 61 | - int rawValue; | ||
| 62 | - }; | ||
| 63 | - QString name; ///< Name of this channel | ||
| 64 | - bool inverted = false; ///< true if the channel is inverted (mirrored on cross-axis) | ||
| 65 | - bool used = false; ///< true if this channel is enabled | 54 | + double offset = 0.0; ///< Vertical offset in divs |
| 55 | + double trigger = 0.0; ///< Trigger level in V | ||
| 56 | + unsigned gainStepIndex = 6; ///< The vertical resolution in V/div (default = 1.0) | ||
| 57 | + unsigned couplingOrMathIndex = 0; ///< Different index: coupling for real- and mode for math-channels | ||
| 58 | + QString name; ///< Name of this channel | ||
| 59 | + bool inverted = false; ///< true if the channel is inverted (mirrored on cross-axis) | ||
| 60 | + bool used = false; ///< true if this channel is enabled | ||
| 66 | }; | 61 | }; |
| 67 | 62 | ||
| 68 | /// \brief Holds the settings for the oscilloscope. | 63 | /// \brief Holds the settings for the oscilloscope. |
| 69 | struct DsoSettingsScope { | 64 | struct DsoSettingsScope { |
| 70 | std::vector<double> gainSteps = {1e-2, 2e-2, 5e-2, 1e-1, 2e-1, | 65 | std::vector<double> gainSteps = {1e-2, 2e-2, 5e-2, 1e-1, 2e-1, |
| 71 | 5e-1, 1e0, 2e0, 5e0}; ///< The selectable voltage gain steps in V/div | 66 | 5e-1, 1e0, 2e0, 5e0}; ///< The selectable voltage gain steps in V/div |
| 72 | - Dso::WindowFunction spectrumWindow = Dso::WindowFunction::HANN; ///< Window function for DFT | ||
| 73 | std::vector<DsoSettingsScopeSpectrum> spectrum; ///< Spectrum analysis settings | 67 | std::vector<DsoSettingsScopeSpectrum> spectrum; ///< Spectrum analysis settings |
| 74 | std::vector<DsoSettingsScopeVoltage> voltage; ///< Settings for the normal graphs | 68 | std::vector<DsoSettingsScopeVoltage> voltage; ///< Settings for the normal graphs |
| 75 | DsoSettingsScopeHorizontal horizontal; ///< Settings for the horizontal axis | 69 | DsoSettingsScopeHorizontal horizontal; ///< Settings for the horizontal axis |
| 76 | DsoSettingsScopeTrigger trigger; ///< Settings for the trigger | 70 | DsoSettingsScopeTrigger trigger; ///< Settings for the trigger |
| 77 | - double spectrumReference = 0.0; ///< Reference level for spectrum in dBm | ||
| 78 | - double spectrumLimit = -20.0; ///< Minimum magnitude of the spectrum (Avoids peaks) | ||
| 79 | 71 | ||
| 80 | double gain(unsigned channel) const { return gainSteps[voltage[channel].gainStepIndex]; } | 72 | double gain(unsigned channel) const { return gainSteps[voltage[channel].gainStepIndex]; } |
| 81 | bool anyUsed(ChannelID channel) { return voltage[channel].used | spectrum[channel].used; } | 73 | bool anyUsed(ChannelID channel) { return voltage[channel].used | spectrum[channel].used; } |
| 82 | 74 | ||
| 83 | - Dso::Coupling coupling(ChannelID channel, const Dso::ControlSpecification *deviceSpecification) { | ||
| 84 | - return deviceSpecification->couplings[voltage[channel].couplingIndex]; | 75 | + Dso::Coupling coupling(ChannelID channel, const Dso::ControlSpecification *deviceSpecification) const { |
| 76 | + return deviceSpecification->couplings[voltage[channel].couplingOrMathIndex]; | ||
| 85 | } | 77 | } |
| 86 | // Channels, including math channels | 78 | // Channels, including math channels |
| 87 | - unsigned countChannels() { return (unsigned)voltage.size(); } | 79 | + unsigned countChannels() const { return (unsigned)voltage.size(); } |
| 88 | }; | 80 | }; |
openhantek/src/settings.cpp
| @@ -35,7 +35,7 @@ DsoSettings::DsoSettings(const Dso::ControlSpecification* deviceSpecification) { | @@ -35,7 +35,7 @@ DsoSettings::DsoSettings(const Dso::ControlSpecification* deviceSpecification) { | ||
| 35 | scope.spectrum.push_back(newSpectrum); | 35 | scope.spectrum.push_back(newSpectrum); |
| 36 | 36 | ||
| 37 | DsoSettingsScopeVoltage newVoltage; | 37 | DsoSettingsScopeVoltage newVoltage; |
| 38 | - newVoltage.math = Dso::MathMode::ADD_CH1_CH2; | 38 | + newVoltage.couplingOrMathIndex = (unsigned)Dso::MathMode::ADD_CH1_CH2; |
| 39 | newVoltage.name = QApplication::tr("MATH"); | 39 | newVoltage.name = QApplication::tr("MATH"); |
| 40 | scope.voltage.push_back(newVoltage); | 40 | scope.voltage.push_back(newVoltage); |
| 41 | 41 | ||
| @@ -106,19 +106,20 @@ void DsoSettings::load() { | @@ -106,19 +106,20 @@ void DsoSettings::load() { | ||
| 106 | for (ChannelID channel = 0; channel < scope.voltage.size(); ++channel) { | 106 | for (ChannelID channel = 0; channel < scope.voltage.size(); ++channel) { |
| 107 | store->beginGroup(QString("vertical%1").arg(channel)); | 107 | store->beginGroup(QString("vertical%1").arg(channel)); |
| 108 | if (store->contains("gainStepIndex")) scope.voltage[channel].gainStepIndex = store->value("gainStepIndex").toUInt(); | 108 | if (store->contains("gainStepIndex")) scope.voltage[channel].gainStepIndex = store->value("gainStepIndex").toUInt(); |
| 109 | - if (store->contains("couplingIndex")) scope.voltage[channel].couplingIndex = store->value("couplingIndex").toUInt(); | 109 | + if (store->contains("couplingOrMathIndex")) scope.voltage[channel].couplingOrMathIndex = store->value("couplingIndex").toUInt(); |
| 110 | if (store->contains("inverted")) scope.voltage[channel].inverted = store->value("inverted").toBool(); | 110 | if (store->contains("inverted")) scope.voltage[channel].inverted = store->value("inverted").toBool(); |
| 111 | - if (store->contains("misc")) scope.voltage[channel].rawValue = store->value("misc").toInt(); | ||
| 112 | if (store->contains("offset")) scope.voltage[channel].offset = store->value("offset").toDouble(); | 111 | if (store->contains("offset")) scope.voltage[channel].offset = store->value("offset").toDouble(); |
| 113 | if (store->contains("trigger")) scope.voltage[channel].trigger = store->value("trigger").toDouble(); | 112 | if (store->contains("trigger")) scope.voltage[channel].trigger = store->value("trigger").toDouble(); |
| 114 | if (store->contains("used")) scope.voltage[channel].used = store->value("used").toBool(); | 113 | if (store->contains("used")) scope.voltage[channel].used = store->value("used").toBool(); |
| 115 | store->endGroup(); | 114 | store->endGroup(); |
| 116 | } | 115 | } |
| 117 | - if (store->contains("spectrumLimit")) scope.spectrumLimit = store->value("spectrumLimit").toDouble(); | 116 | + |
| 117 | + // Post processing | ||
| 118 | + if (store->contains("spectrumLimit")) post.spectrumLimit = store->value("spectrumLimit").toDouble(); | ||
| 118 | if (store->contains("spectrumReference")) | 119 | if (store->contains("spectrumReference")) |
| 119 | - scope.spectrumReference = store->value("spectrumReference").toDouble(); | 120 | + post.spectrumReference = store->value("spectrumReference").toDouble(); |
| 120 | if (store->contains("spectrumWindow")) | 121 | if (store->contains("spectrumWindow")) |
| 121 | - scope.spectrumWindow = (Dso::WindowFunction)store->value("spectrumWindow").toInt(); | 122 | + post.spectrumWindow = (Dso::WindowFunction)store->value("spectrumWindow").toInt(); |
| 122 | store->endGroup(); | 123 | store->endGroup(); |
| 123 | 124 | ||
| 124 | // View | 125 | // View |
| @@ -209,17 +210,18 @@ void DsoSettings::save() { | @@ -209,17 +210,18 @@ void DsoSettings::save() { | ||
| 209 | for (ChannelID channel = 0; channel < scope.voltage.size(); ++channel) { | 210 | for (ChannelID channel = 0; channel < scope.voltage.size(); ++channel) { |
| 210 | store->beginGroup(QString("vertical%1").arg(channel)); | 211 | store->beginGroup(QString("vertical%1").arg(channel)); |
| 211 | store->setValue("gainStepIndex", scope.voltage[channel].gainStepIndex); | 212 | store->setValue("gainStepIndex", scope.voltage[channel].gainStepIndex); |
| 212 | - store->setValue("couplingIndex", scope.voltage[channel].couplingIndex); | 213 | + store->setValue("couplingOrMathIndex", scope.voltage[channel].couplingOrMathIndex); |
| 213 | store->setValue("inverted", scope.voltage[channel].inverted); | 214 | store->setValue("inverted", scope.voltage[channel].inverted); |
| 214 | - store->setValue("misc", scope.voltage[channel].rawValue); | ||
| 215 | store->setValue("offset", scope.voltage[channel].offset); | 215 | store->setValue("offset", scope.voltage[channel].offset); |
| 216 | store->setValue("trigger", scope.voltage[channel].trigger); | 216 | store->setValue("trigger", scope.voltage[channel].trigger); |
| 217 | store->setValue("used", scope.voltage[channel].used); | 217 | store->setValue("used", scope.voltage[channel].used); |
| 218 | store->endGroup(); | 218 | store->endGroup(); |
| 219 | } | 219 | } |
| 220 | - store->setValue("spectrumLimit", scope.spectrumLimit); | ||
| 221 | - store->setValue("spectrumReference", scope.spectrumReference); | ||
| 222 | - store->setValue("spectrumWindow", (int)scope.spectrumWindow); | 220 | + |
| 221 | + // Post processing | ||
| 222 | + store->setValue("spectrumLimit", post.spectrumLimit); | ||
| 223 | + store->setValue("spectrumReference", post.spectrumReference); | ||
| 224 | + store->setValue("spectrumWindow", (int)post.spectrumWindow); | ||
| 223 | store->endGroup(); | 225 | store->endGroup(); |
| 224 | 226 | ||
| 225 | // View | 227 | // View |
openhantek/src/settings.h
| @@ -7,22 +7,22 @@ | @@ -7,22 +7,22 @@ | ||
| 7 | #include <QString> | 7 | #include <QString> |
| 8 | #include <memory> | 8 | #include <memory> |
| 9 | 9 | ||
| 10 | +#include "exporting/exportsettings.h" | ||
| 11 | +#include "post/postprocessingsettings.h" | ||
| 10 | #include "scopesettings.h" | 12 | #include "scopesettings.h" |
| 11 | #include "viewsettings.h" | 13 | #include "viewsettings.h" |
| 12 | -#include "exporting/exportsettings.h" | ||
| 13 | -#include "hantekdso/controlspecification.h" | ||
| 14 | -#include "hantekdso/controlsettings.h" | ||
| 15 | 14 | ||
| 16 | /// \brief Holds the settings of the program. | 15 | /// \brief Holds the settings of the program. |
| 17 | class DsoSettings { | 16 | class DsoSettings { |
| 18 | public: | 17 | public: |
| 19 | - explicit DsoSettings(const Dso::ControlSpecification* deviceSpecification); | 18 | + explicit DsoSettings(const Dso::ControlSpecification *deviceSpecification); |
| 20 | bool setFilename(const QString &filename); | 19 | bool setFilename(const QString &filename); |
| 21 | 20 | ||
| 22 | - DsoSettingsExport exporting; ///< General options of the program | ||
| 23 | - DsoSettingsScope scope; ///< All oscilloscope related settings | ||
| 24 | - DsoSettingsView view; ///< All view related settings | ||
| 25 | - bool alwaysSave = true; ///< Always save the settings on exit | 21 | + DsoSettingsExport exporting; ///< General options of the program |
| 22 | + DsoSettingsScope scope; ///< All oscilloscope related settings | ||
| 23 | + DsoSettingsView view; ///< All view related settings | ||
| 24 | + DsoSettingsPostProcessing post; ///< All post processing related settings | ||
| 25 | + bool alwaysSave = true; ///< Always save the settings on exit | ||
| 26 | 26 | ||
| 27 | QByteArray mainWindowGeometry; ///< Geometry of the main window | 27 | QByteArray mainWindowGeometry; ///< Geometry of the main window |
| 28 | QByteArray mainWindowState; ///< State of docking windows and toolbars | 28 | QByteArray mainWindowState; ///< State of docking windows and toolbars |
openhantek/src/utils/dsoStrings.cpp deleted
| 1 | -//////////////////////////////////////////////////////////////////////////////// | ||
| 2 | -// | ||
| 3 | -// OpenHantek | ||
| 4 | -// dso.cpp | ||
| 5 | -// | ||
| 6 | -// Copyright (C) 2010 Oliver Haag | ||
| 7 | -// oliver.haag@gmail.com | ||
| 8 | -// | ||
| 9 | -// This program is free software: you can redistribute it and/or modify it | ||
| 10 | -// under the terms of the GNU General Public License as published by the Free | ||
| 11 | -// Software Foundation, either version 3 of the License, or (at your option) | ||
| 12 | -// any later version. | ||
| 13 | -// | ||
| 14 | -// This program is distributed in the hope that it will be useful, but WITHOUT | ||
| 15 | -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 16 | -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| 17 | -// more details. | ||
| 18 | -// | ||
| 19 | -// You should have received a copy of the GNU General Public License along with | ||
| 20 | -// this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 21 | -// | ||
| 22 | -//////////////////////////////////////////////////////////////////////////////// | ||
| 23 | - | ||
| 24 | -#include <QApplication> | ||
| 25 | - | ||
| 26 | -#include "dsoStrings.h" | ||
| 27 | - | ||
| 28 | -namespace Dso { | ||
| 29 | -/// \brief Return string representation of the given channel mode. | ||
| 30 | -/// \param mode The ::ChannelMode that should be returned as string. | ||
| 31 | -/// \return The string that should be used in labels etc., empty when invalid. | ||
| 32 | -QString channelModeString(ChannelMode mode) { | ||
| 33 | - switch (mode) { | ||
| 34 | - case ChannelMode::Voltage: | ||
| 35 | - return QApplication::tr("Voltage"); | ||
| 36 | - case ChannelMode::Spectrum: | ||
| 37 | - return QApplication::tr("Spectrum"); | ||
| 38 | - } | ||
| 39 | - return QString(); | ||
| 40 | -} | ||
| 41 | - | ||
| 42 | -/// \brief Return string representation of the given graph format. | ||
| 43 | -/// \param format The ::GraphFormat that should be returned as string. | ||
| 44 | -/// \return The string that should be used in labels etc. | ||
| 45 | -QString graphFormatString(GraphFormat format) { | ||
| 46 | - switch (format) { | ||
| 47 | - case GraphFormat::TY: | ||
| 48 | - return QApplication::tr("T - Y"); | ||
| 49 | - case GraphFormat::XY: | ||
| 50 | - return QApplication::tr("X - Y"); | ||
| 51 | - } | ||
| 52 | - return QString(); | ||
| 53 | -} | ||
| 54 | - | ||
| 55 | -/// \brief Return string representation of the given channel coupling. | ||
| 56 | -/// \param coupling The ::Coupling that should be returned as string. | ||
| 57 | -/// \return The string that should be used in labels etc. | ||
| 58 | -QString couplingString(Coupling coupling) { | ||
| 59 | - switch (coupling) { | ||
| 60 | - case Coupling::AC: | ||
| 61 | - return QApplication::tr("AC"); | ||
| 62 | - case Coupling::DC: | ||
| 63 | - return QApplication::tr("DC"); | ||
| 64 | - case Coupling::GND: | ||
| 65 | - return QApplication::tr("GND"); | ||
| 66 | - } | ||
| 67 | - return QString(); | ||
| 68 | -} | ||
| 69 | - | ||
| 70 | -/// \brief Return string representation of the given math mode. | ||
| 71 | -/// \param mode The ::MathMode that should be returned as string. | ||
| 72 | -/// \return The string that should be used in labels etc. | ||
| 73 | -QString mathModeString(MathMode mode) { | ||
| 74 | - switch (mode) { | ||
| 75 | - case MathMode::ADD_CH1_CH2: | ||
| 76 | - return QApplication::tr("CH1 + CH2"); | ||
| 77 | - case MathMode::SUB_CH2_FROM_CH1: | ||
| 78 | - return QApplication::tr("CH1 - CH2"); | ||
| 79 | - case MathMode::SUB_CH1_FROM_CH2: | ||
| 80 | - return QApplication::tr("CH2 - CH1"); | ||
| 81 | - } | ||
| 82 | - return QString(); | ||
| 83 | -} | ||
| 84 | - | ||
| 85 | -/// \brief Return string representation of the given trigger mode. | ||
| 86 | -/// \param mode The ::TriggerMode that should be returned as string. | ||
| 87 | -/// \return The string that should be used in labels etc. | ||
| 88 | -QString triggerModeString(TriggerMode mode) { | ||
| 89 | - switch (mode) { | ||
| 90 | - case TriggerMode::WAIT_FORCE: | ||
| 91 | - return QApplication::tr("Wait/Force"); | ||
| 92 | - case TriggerMode::HARDWARE_SOFTWARE: | ||
| 93 | - return QApplication::tr("Hard-/Software"); | ||
| 94 | - case TriggerMode::SINGLE: | ||
| 95 | - return QApplication::tr("Single"); | ||
| 96 | - } | ||
| 97 | - return QString(); | ||
| 98 | -} | ||
| 99 | - | ||
| 100 | -/// \brief Return string representation of the given trigger slope. | ||
| 101 | -/// \param slope The ::Slope that should be returned as string. | ||
| 102 | -/// \return The string that should be used in labels etc. | ||
| 103 | -QString slopeString(Slope slope) { | ||
| 104 | - switch (slope) { | ||
| 105 | - case Slope::Positive: | ||
| 106 | - return QString::fromUtf8("\u2197"); | ||
| 107 | - case Slope::Negative: | ||
| 108 | - return QString::fromUtf8("\u2198"); | ||
| 109 | - default: | ||
| 110 | - return QString(); | ||
| 111 | - } | ||
| 112 | -} | ||
| 113 | - | ||
| 114 | -/// \brief Return string representation of the given dft window function. | ||
| 115 | -/// \param window The ::WindowFunction that should be returned as string. | ||
| 116 | -/// \return The string that should be used in labels etc. | ||
| 117 | -QString windowFunctionString(WindowFunction window) { | ||
| 118 | - switch (window) { | ||
| 119 | - case WindowFunction::RECTANGULAR: | ||
| 120 | - return QApplication::tr("Rectangular"); | ||
| 121 | - case WindowFunction::HAMMING: | ||
| 122 | - return QApplication::tr("Hamming"); | ||
| 123 | - case WindowFunction::HANN: | ||
| 124 | - return QApplication::tr("Hann"); | ||
| 125 | - case WindowFunction::COSINE: | ||
| 126 | - return QApplication::tr("Cosine"); | ||
| 127 | - case WindowFunction::LANCZOS: | ||
| 128 | - return QApplication::tr("Lanczos"); | ||
| 129 | - case WindowFunction::BARTLETT: | ||
| 130 | - return QApplication::tr("Bartlett"); | ||
| 131 | - case WindowFunction::TRIANGULAR: | ||
| 132 | - return QApplication::tr("Triangular"); | ||
| 133 | - case WindowFunction::GAUSS: | ||
| 134 | - return QApplication::tr("Gauss"); | ||
| 135 | - case WindowFunction::BARTLETTHANN: | ||
| 136 | - return QApplication::tr("Bartlett-Hann"); | ||
| 137 | - case WindowFunction::BLACKMAN: | ||
| 138 | - return QApplication::tr("Blackman"); | ||
| 139 | - // case WindowFunction::WINDOW_KAISER: | ||
| 140 | - // return QApplication::tr("Kaiser"); | ||
| 141 | - case WindowFunction::NUTTALL: | ||
| 142 | - return QApplication::tr("Nuttall"); | ||
| 143 | - case WindowFunction::BLACKMANHARRIS: | ||
| 144 | - return QApplication::tr("Blackman-Harris"); | ||
| 145 | - case WindowFunction::BLACKMANNUTTALL: | ||
| 146 | - return QApplication::tr("Blackman-Nuttall"); | ||
| 147 | - case WindowFunction::FLATTOP: | ||
| 148 | - return QApplication::tr("Flat top"); | ||
| 149 | - default: | ||
| 150 | - return QString(); | ||
| 151 | - } | ||
| 152 | -} | ||
| 153 | - | ||
| 154 | -/// \brief Return string representation of the given graph interpolation mode. | ||
| 155 | -/// \param interpolation The ::InterpolationMode that should be returned as | ||
| 156 | -/// string. | ||
| 157 | -/// \return The string that should be used in labels etc. | ||
| 158 | -QString interpolationModeString(InterpolationMode interpolation) { | ||
| 159 | - switch (interpolation) { | ||
| 160 | - case INTERPOLATION_OFF: | ||
| 161 | - return QApplication::tr("Off"); | ||
| 162 | - case INTERPOLATION_LINEAR: | ||
| 163 | - return QApplication::tr("Linear"); | ||
| 164 | - case INTERPOLATION_SINC: | ||
| 165 | - return QApplication::tr("Sinc"); | ||
| 166 | - default: | ||
| 167 | - return QString(); | ||
| 168 | - } | ||
| 169 | -} | ||
| 170 | -} |
openhantek/src/utils/dsoStrings.h deleted
| 1 | -// SPDX-License-Identifier: GPL-2.0+ | ||
| 2 | - | ||
| 3 | -#pragma once | ||
| 4 | -#include <QString> | ||
| 5 | -#include "post/enums.h" | ||
| 6 | -#include "hantekdso/enums.h" | ||
| 7 | - | ||
| 8 | -#define MARKER_COUNT 2 ///< Number of markers | ||
| 9 | - | ||
| 10 | -/// \namespace Dso | ||
| 11 | -/// \brief All DSO specific things for different modes and so on. | ||
| 12 | -namespace Dso { | ||
| 13 | - | ||
| 14 | -QString channelModeString(ChannelMode mode); | ||
| 15 | -QString graphFormatString(GraphFormat format); | ||
| 16 | -QString couplingString(Coupling coupling); | ||
| 17 | -QString mathModeString(MathMode mode); | ||
| 18 | -QString triggerModeString(TriggerMode mode); | ||
| 19 | -QString slopeString(Slope slope); | ||
| 20 | -QString windowFunctionString(WindowFunction window); | ||
| 21 | -QString interpolationModeString(InterpolationMode interpolation); | ||
| 22 | -} |