2022-10-01 23:10:44 +08:00
|
|
|
#ifndef PREFERENCESDIALOG_H
|
|
|
|
#define PREFERENCESDIALOG_H
|
|
|
|
|
|
|
|
#include "Util/qpointervariant.h"
|
|
|
|
#include "savable.h"
|
|
|
|
|
2023-02-08 01:30:05 +08:00
|
|
|
#include "Device/LibreVNA/Compound/compounddevice.h"
|
2022-10-01 23:10:44 +08:00
|
|
|
|
|
|
|
#include <QDialog>
|
|
|
|
#include <QVariant>
|
|
|
|
#include <exception>
|
|
|
|
|
|
|
|
enum GraphDomainChangeBehavior {
|
|
|
|
RemoveChangedTraces = 0,
|
|
|
|
AdjustGraphs = 1,
|
|
|
|
AdjustGrahpsIfOnlyTrace = 2,
|
|
|
|
};
|
|
|
|
|
|
|
|
Q_DECLARE_METATYPE(GraphDomainChangeBehavior)
|
|
|
|
|
|
|
|
enum GraphLimitIndication {
|
|
|
|
DontShowAnything = 0,
|
|
|
|
PassFailText = 1,
|
|
|
|
Overlay = 2,
|
|
|
|
};
|
|
|
|
|
|
|
|
Q_DECLARE_METATYPE(GraphLimitIndication)
|
|
|
|
|
|
|
|
enum MarkerSortOrder {
|
|
|
|
PrefMarkerSortXCoord = 0,
|
|
|
|
PrefMarkerSortNumber = 1,
|
|
|
|
PrefMarkerSortTimestamp = 2,
|
|
|
|
};
|
|
|
|
|
|
|
|
Q_DECLARE_METATYPE(MarkerSortOrder)
|
|
|
|
|
|
|
|
enum MarkerSymbolStyle {
|
|
|
|
FilledNumberInside = 0,
|
|
|
|
FilledNumberAbove = 1,
|
|
|
|
EmptyNumberAbove = 2,
|
|
|
|
};
|
|
|
|
|
|
|
|
Q_DECLARE_METATYPE(MarkerSymbolStyle);
|
|
|
|
|
|
|
|
|
|
|
|
class Preferences : public Savable {
|
|
|
|
public:
|
|
|
|
static Preferences& getInstance() {
|
|
|
|
return instance;
|
|
|
|
}
|
2022-10-06 04:17:53 +08:00
|
|
|
Preferences(const Preferences&) = delete;
|
|
|
|
~Preferences();
|
2022-10-01 23:10:44 +08:00
|
|
|
void load();
|
2023-01-17 07:25:58 +08:00
|
|
|
void load(std::vector<Savable::SettingDescription> descr);
|
2022-10-01 23:10:44 +08:00
|
|
|
void store();
|
2023-01-17 07:25:58 +08:00
|
|
|
void store(std::vector<Savable::SettingDescription> descr);
|
2022-10-01 23:10:44 +08:00
|
|
|
void edit();
|
|
|
|
void setDefault();
|
2023-02-08 01:30:05 +08:00
|
|
|
void setDefault(std::vector<Savable::SettingDescription> descr);
|
2022-10-01 23:10:44 +08:00
|
|
|
|
|
|
|
void manualTCPport() { TCPoverride = true; }
|
|
|
|
|
|
|
|
struct {
|
|
|
|
bool ConnectToFirstDevice;
|
|
|
|
bool RememberSweepSettings;
|
|
|
|
bool UseSetupFile;
|
|
|
|
bool AutosaveSetupFile;
|
|
|
|
QString SetupFile;
|
|
|
|
struct {
|
|
|
|
QString type;
|
|
|
|
double f_start;
|
|
|
|
double f_stop;
|
|
|
|
bool logSweep;
|
|
|
|
double f_excitation;
|
|
|
|
|
|
|
|
double dbm_start;
|
|
|
|
double dbm_stop;
|
|
|
|
double dbm_freq;
|
|
|
|
|
|
|
|
int points;
|
|
|
|
double bandwidth;
|
|
|
|
int averaging;
|
|
|
|
} DefaultSweep;
|
|
|
|
struct {
|
|
|
|
double frequency;
|
|
|
|
double level;
|
|
|
|
} Generator;
|
|
|
|
struct {
|
|
|
|
double start;
|
|
|
|
double stop;
|
|
|
|
double RBW;
|
|
|
|
int window;
|
|
|
|
int detector;
|
|
|
|
int averaging;
|
|
|
|
} SA;
|
|
|
|
} Startup;
|
|
|
|
struct {
|
|
|
|
bool alwaysExciteAllPorts;
|
|
|
|
bool allowSegmentedSweep;
|
|
|
|
bool useMedianAveraging;
|
|
|
|
|
2022-10-30 01:32:16 +08:00
|
|
|
// Full span settings
|
|
|
|
bool fullSpanManual;
|
|
|
|
double fullSpanStart;
|
|
|
|
double fullSpanStop;
|
|
|
|
bool fullSpanCalibratedRange;
|
2022-10-01 23:10:44 +08:00
|
|
|
} Acquisition;
|
|
|
|
struct {
|
|
|
|
bool showUnits;
|
|
|
|
struct {
|
|
|
|
QColor background;
|
|
|
|
QColor axis;
|
|
|
|
struct {
|
|
|
|
QColor divisions;
|
|
|
|
struct {
|
|
|
|
bool enabled;
|
|
|
|
QColor background;
|
|
|
|
} Background;
|
|
|
|
} Ticks;
|
|
|
|
} Color;
|
|
|
|
GraphDomainChangeBehavior domainChangeBehavior;
|
|
|
|
GraphLimitIndication limitIndication;
|
|
|
|
|
|
|
|
double lineWidth;
|
|
|
|
int fontSizeAxis;
|
|
|
|
int fontSizeMarkerData;
|
|
|
|
int fontSizeTraceNames;
|
|
|
|
int fontSizeCursorOverlay;
|
2022-10-21 22:50:04 +08:00
|
|
|
|
2022-10-25 20:21:09 +08:00
|
|
|
bool enablePanAndZoom;
|
2022-10-21 22:50:04 +08:00
|
|
|
double zoomFactor;
|
2022-10-30 03:19:30 +08:00
|
|
|
|
|
|
|
struct {
|
|
|
|
bool triangle;
|
2022-10-30 04:57:50 +08:00
|
|
|
int triangleSize;
|
2022-10-30 03:19:30 +08:00
|
|
|
bool line;
|
|
|
|
bool hide;
|
|
|
|
double hidePercent;
|
|
|
|
} SweepIndicator;
|
2023-10-24 20:04:31 +08:00
|
|
|
|
|
|
|
struct {
|
|
|
|
QString transmission;
|
|
|
|
QString reflection;
|
|
|
|
} defaultGraphs;
|
2022-10-01 23:10:44 +08:00
|
|
|
} Graphs;
|
|
|
|
struct {
|
|
|
|
struct {
|
|
|
|
bool showDataOnGraphs;
|
2022-10-30 20:05:05 +08:00
|
|
|
bool showdB, showdBm, showdBuV, showdBAngle, showRealImag, showImpedance, showVSWR, showResistance, showCapacitance, showInductance, showQualityFactor;
|
2022-12-17 05:29:21 +08:00
|
|
|
bool showNoise, showPhasenoise, showCenterBandwidth, showCutoff, showInsertionLoss, showTOI, showAvgTone, showAvgModulation, showP1dB, showFlatness, showMaxDeltaNeg, showMaxDeltaPos;
|
2022-10-01 23:10:44 +08:00
|
|
|
} defaultBehavior;
|
|
|
|
bool interpolatePoints;
|
|
|
|
MarkerSortOrder sortOrder;
|
|
|
|
MarkerSymbolStyle symbolStyle;
|
|
|
|
} Marker;
|
|
|
|
struct {
|
|
|
|
bool enabled;
|
|
|
|
int port;
|
|
|
|
} SCPIServer;
|
2022-11-01 05:06:23 +08:00
|
|
|
struct {
|
|
|
|
double USBlogSizeLimit;
|
2022-11-10 06:29:37 +08:00
|
|
|
bool saveTraceData;
|
2022-11-01 05:06:23 +08:00
|
|
|
} Debug;
|
2022-10-01 23:10:44 +08:00
|
|
|
|
|
|
|
bool TCPoverride; // in case of manual port specification via command line
|
|
|
|
|
|
|
|
void fromJSON(nlohmann::json j) override;
|
|
|
|
nlohmann::json toJSON() override;
|
|
|
|
|
|
|
|
void nonTrivialParsing();
|
|
|
|
void nonTrivialWriting();
|
|
|
|
|
|
|
|
private:
|
|
|
|
Preferences() :
|
2022-10-31 22:09:19 +08:00
|
|
|
TCPoverride(false) {}
|
2022-10-01 23:10:44 +08:00
|
|
|
static Preferences instance;
|
|
|
|
|
2023-01-26 06:07:33 +08:00
|
|
|
// TODO remove settings that have been moved to LibreVNADriver
|
2022-10-01 23:10:44 +08:00
|
|
|
const std::vector<Savable::SettingDescription> descr = {{
|
|
|
|
{&Startup.ConnectToFirstDevice, "Startup.ConnectToFirstDevice", true},
|
|
|
|
{&Startup.RememberSweepSettings, "Startup.RememberSweepSettings", false},
|
|
|
|
{&Startup.UseSetupFile, "Startup.UseSetupFile", false},
|
|
|
|
{&Startup.SetupFile, "Startup.SetupFile", ""},
|
|
|
|
{&Startup.AutosaveSetupFile, "Startup.AutosaveSetupFile", false},
|
|
|
|
{&Startup.DefaultSweep.type, "Startup.DefaultSweep.type", "Frequency"},
|
|
|
|
{&Startup.DefaultSweep.f_start, "Startup.DefaultSweep.start", 1000000.0},
|
|
|
|
{&Startup.DefaultSweep.f_stop, "Startup.DefaultSweep.stop", 6000000000.0},
|
|
|
|
{&Startup.DefaultSweep.logSweep, "Startup.DefaultSweep.logSweep", false},
|
|
|
|
{&Startup.DefaultSweep.f_excitation, "Startup.DefaultSweep.excitation", -10.00},
|
|
|
|
{&Startup.DefaultSweep.dbm_start, "Startup.DefaultSweep.dbm_start", -30.00},
|
|
|
|
{&Startup.DefaultSweep.dbm_stop, "Startup.DefaultSweep.dbm_stop", -10.0},
|
|
|
|
{&Startup.DefaultSweep.dbm_freq, "Startup.DefaultSweep.dbm_freq", 1000000000.0},
|
|
|
|
{&Startup.DefaultSweep.points, "Startup.DefaultSweep.points", 501},
|
|
|
|
{&Startup.DefaultSweep.bandwidth, "Startup.DefaultSweep.bandwidth", 1000.0},
|
|
|
|
{&Startup.DefaultSweep.averaging, "Startup.DefaultSweep.averaging", 1},
|
|
|
|
{&Startup.Generator.frequency, "Startup.Generator.frequency", 1000000000.0},
|
|
|
|
{&Startup.Generator.level, "Startup.Generator.level", -10.00},
|
|
|
|
{&Startup.SA.start, "Startup.SA.start", 950000000.0},
|
|
|
|
{&Startup.SA.stop, "Startup.SA.stop", 1050000000.0},
|
|
|
|
{&Startup.SA.RBW, "Startup.SA.RBW", 10000.0},
|
|
|
|
{&Startup.SA.window, "Startup.SA.window", 1},
|
|
|
|
{&Startup.SA.detector, "Startup.SA.detector", 0},
|
|
|
|
{&Startup.SA.averaging, "Startup.SA.averaging", 1},
|
|
|
|
{&Acquisition.alwaysExciteAllPorts, "Acquisition.alwaysExciteBothPorts", true},
|
2023-10-24 22:39:21 +08:00
|
|
|
{&Acquisition.allowSegmentedSweep, "Acquisition.allowSegmentedSweep", true},
|
2022-10-01 23:10:44 +08:00
|
|
|
{&Acquisition.useMedianAveraging, "Acquisition.useMedianAveraging", false},
|
2022-10-30 01:32:16 +08:00
|
|
|
{&Acquisition.fullSpanManual, "Acquisition.fullSpanManual", false},
|
|
|
|
{&Acquisition.fullSpanStart, "Acquisition.fullSpanStart", 0.0},
|
|
|
|
{&Acquisition.fullSpanStop, "Acquisition.fullSpanStop", 6000000000.0},
|
|
|
|
{&Acquisition.fullSpanCalibratedRange, "Acquisition.fullSpanCalibratedRange", false},
|
2022-10-01 23:10:44 +08:00
|
|
|
{&Graphs.showUnits, "Graphs.showUnits", true},
|
|
|
|
{&Graphs.Color.background, "Graphs.Color.background", QColor(Qt::black)},
|
|
|
|
{&Graphs.Color.axis, "Graphs.Color.axis", QColor(Qt::white)},
|
|
|
|
{&Graphs.Color.Ticks.Background.enabled, "Graphs.Color.Ticks.Background.enabled", true},
|
|
|
|
{&Graphs.Color.Ticks.Background.background, "Graphs.Color.Ticks.Background.background", QColor(20, 20, 20)},
|
|
|
|
{&Graphs.Color.Ticks.divisions, "Graphs.Color.Ticks.divisions", QColor(Qt::gray)},
|
|
|
|
{&Graphs.domainChangeBehavior, "Graphs.domainChangeBehavior", GraphDomainChangeBehavior::AdjustGraphs},
|
|
|
|
{&Graphs.limitIndication, "Graphs.limitIndication", GraphLimitIndication::PassFailText},
|
|
|
|
{&Graphs.lineWidth, "Graphs.lineWidth", 1.0},
|
|
|
|
{&Graphs.fontSizeAxis, "Graphs.fontSizeAxis", 10},
|
|
|
|
{&Graphs.fontSizeCursorOverlay, "Graphs.fontSizeCursorOverlay", 12},
|
|
|
|
{&Graphs.fontSizeMarkerData, "Graphs.fontSizeMarkerData", 12},
|
|
|
|
{&Graphs.fontSizeTraceNames, "Graphs.fontSizeTraceNames", 12},
|
2022-10-25 20:21:09 +08:00
|
|
|
{&Graphs.enablePanAndZoom, "Graphs.enablePanAndZoom", true},
|
|
|
|
{&Graphs.zoomFactor, "Graphs.zoomFactor", 0.9},
|
2022-10-30 03:19:30 +08:00
|
|
|
{&Graphs.SweepIndicator.triangle, "Graphs.SweepIndicator.triangle", true},
|
|
|
|
{&Graphs.SweepIndicator.triangleSize, "Graphs.SweepIndicator.triangleSize", 5},
|
|
|
|
{&Graphs.SweepIndicator.line, "Graphs.SweepIndicator.line", false},
|
|
|
|
{&Graphs.SweepIndicator.hide, "Graphs.SweepIndicator.hide", false},
|
|
|
|
{&Graphs.SweepIndicator.hidePercent, "Graphs.SweepIndicator.hidePercent", 3.0},
|
2023-10-24 20:04:31 +08:00
|
|
|
{&Graphs.defaultGraphs.transmission, "Graphs.defaultGraphs.transmission", "XY Plot"},
|
|
|
|
{&Graphs.defaultGraphs.reflection, "Graphs.defaultGraphs.reflection", "Smith Chart"},
|
2022-10-01 23:10:44 +08:00
|
|
|
{&Marker.defaultBehavior.showDataOnGraphs, "Marker.defaultBehavior.ShowDataOnGraphs", true},
|
2022-10-30 20:05:05 +08:00
|
|
|
{&Marker.defaultBehavior.showdB, "Marker.defaultBehavior.showdB", true},
|
|
|
|
{&Marker.defaultBehavior.showdBm, "Marker.defaultBehavior.showdBm", true},
|
|
|
|
{&Marker.defaultBehavior.showdBuV, "Marker.defaultBehavior.showdBuV", true},
|
|
|
|
{&Marker.defaultBehavior.showdBAngle, "Marker.defaultBehavior.showdBAngle", true},
|
|
|
|
{&Marker.defaultBehavior.showRealImag, "Marker.defaultBehavior.showRealImag", true},
|
|
|
|
{&Marker.defaultBehavior.showVSWR, "Marker.defaultBehavior.showVSWR", true},
|
|
|
|
{&Marker.defaultBehavior.showImpedance, "Marker.defaultBehavior.showImpedance", true},
|
|
|
|
{&Marker.defaultBehavior.showResistance, "Marker.defaultBehavior.showResistance", true},
|
|
|
|
{&Marker.defaultBehavior.showCapacitance, "Marker.defaultBehavior.showCapacitance", true},
|
|
|
|
{&Marker.defaultBehavior.showInductance, "Marker.defaultBehavior.showInductance", true},
|
|
|
|
{&Marker.defaultBehavior.showQualityFactor, "Marker.defaultBehavior.showQualityFactor", true},
|
|
|
|
{&Marker.defaultBehavior.showNoise, "Marker.defaultBehavior.showNoise", true},
|
|
|
|
{&Marker.defaultBehavior.showPhasenoise, "Marker.defaultBehavior.showPhasenoise", true},
|
|
|
|
{&Marker.defaultBehavior.showCenterBandwidth, "Marker.defaultBehavior.showCenterBandwidth", true},
|
|
|
|
{&Marker.defaultBehavior.showCutoff, "Marker.defaultBehavior.showCutoff", true},
|
|
|
|
{&Marker.defaultBehavior.showInsertionLoss, "Marker.defaultBehavior.showInsertionLoss", true},
|
|
|
|
{&Marker.defaultBehavior.showTOI, "Marker.defaultBehavior.showTOI", true},
|
|
|
|
{&Marker.defaultBehavior.showAvgTone, "Marker.defaultBehavior.showAvgTone", true},
|
|
|
|
{&Marker.defaultBehavior.showAvgModulation, "Marker.defaultBehavior.showAvgModulation", true},
|
|
|
|
{&Marker.defaultBehavior.showP1dB, "Marker.defaultBehavior.showP1dB", true},
|
2022-12-17 05:29:21 +08:00
|
|
|
{&Marker.defaultBehavior.showFlatness, "Marker.defaultBehavior.showNonUniformity", true},
|
2022-12-14 17:59:53 +08:00
|
|
|
{&Marker.defaultBehavior.showMaxDeltaNeg, "Marker.defaultBehavior.showMaxDeltaNeg", true},
|
|
|
|
{&Marker.defaultBehavior.showMaxDeltaPos, "Marker.defaultBehavior.showMaxDeltaPos", true},
|
2022-10-01 23:10:44 +08:00
|
|
|
{&Marker.interpolatePoints, "Marker.interpolatePoints", false},
|
|
|
|
{&Marker.sortOrder, "Marker.sortOrder", MarkerSortOrder::PrefMarkerSortXCoord},
|
|
|
|
{&Marker.symbolStyle, "Marker.symbolStyle", MarkerSymbolStyle::EmptyNumberAbove},
|
|
|
|
{&SCPIServer.enabled, "SCPIServer.enabled", true},
|
|
|
|
{&SCPIServer.port, "SCPIServer.port", 19542},
|
2022-11-01 05:06:23 +08:00
|
|
|
{&Debug.USBlogSizeLimit, "Debug.USBlogSizeLimit", 10000000.0},
|
2022-11-10 06:29:37 +08:00
|
|
|
{&Debug.saveTraceData, "Debug.saveTraceData", false},
|
2022-10-01 23:10:44 +08:00
|
|
|
}};
|
|
|
|
};
|
|
|
|
|
|
|
|
namespace Ui {
|
|
|
|
class PreferencesDialog;
|
|
|
|
}
|
|
|
|
|
|
|
|
class PreferencesDialog : public QDialog
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
public:
|
|
|
|
explicit PreferencesDialog(Preferences *pref, QWidget *parent = nullptr);
|
|
|
|
~PreferencesDialog();
|
|
|
|
|
|
|
|
private:
|
|
|
|
void setInitialGUIState();
|
|
|
|
void updateFromGUI();
|
|
|
|
Ui::PreferencesDialog *ui;
|
|
|
|
Preferences *p;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif // PREFERENCESDIALOG_H
|