2020-08-31 04:03:41 +08:00
|
|
|
#ifndef TRACEMARKER_H
|
|
|
|
#define TRACEMARKER_H
|
|
|
|
|
2021-10-21 19:00:34 +08:00
|
|
|
#include "../trace.h"
|
|
|
|
#include "CustomWidgets/siunitedit.h"
|
|
|
|
#include "savable.h"
|
|
|
|
|
2020-08-31 04:03:41 +08:00
|
|
|
#include <QPixmap>
|
|
|
|
#include <QObject>
|
2021-05-14 21:31:38 +08:00
|
|
|
#include <QMenu>
|
2020-10-20 23:03:49 +08:00
|
|
|
#include <QComboBox>
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
class MarkerModel;
|
|
|
|
class MarkerGroup;
|
2020-08-31 04:03:41 +08:00
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
class Marker : public QObject, public Savable
|
2020-08-31 04:03:41 +08:00
|
|
|
{
|
|
|
|
Q_OBJECT;
|
|
|
|
public:
|
2021-06-19 21:33:43 +08:00
|
|
|
Marker(MarkerModel *model, int number = 1, Marker *parent = nullptr, QString descr = QString());
|
|
|
|
~Marker();
|
2020-08-31 04:03:41 +08:00
|
|
|
void assignTrace(Trace *t);
|
|
|
|
Trace* trace();
|
2021-05-14 21:05:22 +08:00
|
|
|
|
|
|
|
enum class Format {
|
|
|
|
dB,
|
2022-03-29 04:07:09 +08:00
|
|
|
dBm,
|
|
|
|
dBuV,
|
2021-05-14 21:05:22 +08:00
|
|
|
dBAngle,
|
|
|
|
RealImag,
|
|
|
|
Impedance,
|
2021-06-19 21:33:43 +08:00
|
|
|
VSWR,
|
2021-06-28 05:40:50 +08:00
|
|
|
SeriesR,
|
|
|
|
Capacitance,
|
|
|
|
Inductance,
|
|
|
|
QualityFactor,
|
2021-05-14 21:05:22 +08:00
|
|
|
// Noise marker parameters
|
|
|
|
Noise,
|
|
|
|
PhaseNoise,
|
|
|
|
// Filter parameters
|
|
|
|
CenterBandwidth,
|
|
|
|
Cutoff,
|
|
|
|
InsertionLoss,
|
|
|
|
// TOI parameters
|
|
|
|
TOI, // third order intercept point
|
|
|
|
AvgTone, // average level of tone
|
|
|
|
AvgModulationProduct, // average level of modulation products
|
2021-07-10 18:16:28 +08:00
|
|
|
// compression parameters
|
|
|
|
P1dB, // power level at 1dB compression
|
2021-05-14 21:05:22 +08:00
|
|
|
// keep last at end
|
|
|
|
Last,
|
|
|
|
};
|
|
|
|
|
|
|
|
static QString formatToString(Format f);
|
|
|
|
static Format formatFromString(QString s);
|
|
|
|
static std::vector<Format> formats();
|
2021-05-15 02:34:23 +08:00
|
|
|
std::vector<Format> applicableFormats();
|
2021-05-14 21:05:22 +08:00
|
|
|
|
|
|
|
QString readableData(Format format = Format::Last);
|
2021-05-15 02:55:54 +08:00
|
|
|
QString readablePosition();
|
2020-10-21 01:15:06 +08:00
|
|
|
QString readableSettings();
|
2020-12-03 05:15:34 +08:00
|
|
|
QString tooltipSettings();
|
2020-11-03 07:37:06 +08:00
|
|
|
QString readableType();
|
2020-08-31 04:03:41 +08:00
|
|
|
|
2020-11-23 04:25:41 +08:00
|
|
|
double getPosition() const;
|
2020-08-31 04:03:41 +08:00
|
|
|
std::complex<double> getData() const;
|
2020-11-03 07:37:06 +08:00
|
|
|
bool isMovable();
|
2021-07-10 18:16:28 +08:00
|
|
|
Trace::DataType getDomain();
|
2020-08-31 04:03:41 +08:00
|
|
|
|
|
|
|
QPixmap& getSymbol();
|
|
|
|
|
|
|
|
int getNumber() const;
|
2020-11-03 07:37:06 +08:00
|
|
|
void setNumber(int value);
|
|
|
|
|
2020-12-10 11:07:52 +08:00
|
|
|
bool editingFrequency;
|
2020-10-20 03:21:04 +08:00
|
|
|
Trace *getTrace() const;
|
|
|
|
|
2020-12-05 19:59:23 +08:00
|
|
|
enum class Type {
|
|
|
|
Manual,
|
|
|
|
Maximum,
|
|
|
|
Minimum,
|
|
|
|
Delta,
|
|
|
|
PeakTable,
|
|
|
|
Lowpass,
|
|
|
|
Highpass,
|
|
|
|
Bandpass,
|
|
|
|
TOI,
|
|
|
|
PhaseNoise,
|
2021-07-10 18:16:28 +08:00
|
|
|
P1dB,
|
2020-12-05 19:59:23 +08:00
|
|
|
// keep last at end
|
|
|
|
Last,
|
|
|
|
};
|
|
|
|
Type getType() const;
|
2020-10-20 23:03:49 +08:00
|
|
|
QWidget *getTypeEditor(QAbstractItemDelegate *delegate = nullptr);
|
|
|
|
void updateTypeFromEditor(QWidget *c);
|
|
|
|
SIUnitEdit* getSettingsEditor();
|
2020-10-21 01:15:06 +08:00
|
|
|
void adjustSettings(double value);
|
2020-10-20 23:03:49 +08:00
|
|
|
|
2021-05-14 21:31:38 +08:00
|
|
|
QMenu *getContextMenu();
|
2021-04-25 21:46:34 +08:00
|
|
|
|
2020-10-20 23:03:49 +08:00
|
|
|
// Updates marker position and data on automatic markers. Should be called whenever the tracedata is complete
|
|
|
|
void update();
|
2021-06-19 21:33:43 +08:00
|
|
|
Marker *getParent() const;
|
|
|
|
const std::vector<Marker *>& getHelperMarkers() const;
|
|
|
|
Marker *helperMarker(unsigned int i);
|
|
|
|
void assignDeltaMarker(Marker *m);
|
2020-11-03 07:37:06 +08:00
|
|
|
QString getSuffix() const;
|
2020-10-20 23:03:49 +08:00
|
|
|
|
2020-12-05 19:59:23 +08:00
|
|
|
virtual nlohmann::json toJSON() override;
|
|
|
|
virtual void fromJSON(nlohmann::json j) override;
|
|
|
|
// Markers are referenced by pointers throughout this project (e.g. when added to a trace)
|
|
|
|
// When saving the current marker configuration, the pointer is not useful (e.g. for determining
|
|
|
|
// the associated delta marker. Instead a marker hash is saved to identify the correct marker.
|
|
|
|
// The hash should be influenced by every setting the marker can have. It should not depend on
|
|
|
|
// the marker data.
|
|
|
|
unsigned int toHash();
|
|
|
|
|
|
|
|
|
2021-05-14 22:18:43 +08:00
|
|
|
std::set<Format> getGraphDisplayFormats() const;
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
MarkerGroup *getGroup() const;
|
|
|
|
void setGroup(MarkerGroup *value);
|
|
|
|
|
2020-08-31 04:03:41 +08:00
|
|
|
public slots:
|
2020-11-23 04:25:41 +08:00
|
|
|
void setPosition(double freq);
|
2021-06-19 21:33:43 +08:00
|
|
|
void updateContextmenu();
|
2020-08-31 04:03:41 +08:00
|
|
|
signals:
|
2021-06-19 21:33:43 +08:00
|
|
|
void positionChanged(double pos);
|
|
|
|
void deleted(Marker *m);
|
|
|
|
void dataChanged(Marker *m);
|
|
|
|
void symbolChanged(Marker *m);
|
|
|
|
void typeChanged(Marker *m);
|
|
|
|
void assignedDeltaChanged(Marker *m);
|
|
|
|
void traceChanged(Marker *m);
|
|
|
|
void beginRemoveHelperMarkers(Marker *m);
|
|
|
|
void endRemoveHelperMarkers(Marker *m);
|
|
|
|
void dataFormatChanged(Marker *m);
|
2020-08-31 04:03:41 +08:00
|
|
|
|
|
|
|
private slots:
|
|
|
|
void parentTraceDeleted(Trace *t);
|
|
|
|
void traceDataChanged();
|
|
|
|
void updateSymbol();
|
2020-12-03 05:15:34 +08:00
|
|
|
void checkDeltaMarker();
|
2020-12-10 20:23:25 +08:00
|
|
|
void deltaDeleted();
|
2021-06-19 21:33:43 +08:00
|
|
|
void traceTypeChanged();
|
2020-10-20 23:03:49 +08:00
|
|
|
signals:
|
|
|
|
void rawDataChanged();
|
2021-06-19 21:33:43 +08:00
|
|
|
void domainChanged(Marker *m);
|
2020-08-31 04:03:41 +08:00
|
|
|
private:
|
2020-10-23 20:12:45 +08:00
|
|
|
std::set<Type> getSupportedTypes();
|
2020-10-20 23:03:49 +08:00
|
|
|
static QString typeToString(Type t) {
|
|
|
|
switch(t) {
|
|
|
|
case Type::Manual: return "Manual";
|
|
|
|
case Type::Maximum: return "Maximum";
|
|
|
|
case Type::Minimum: return "Minimum";
|
|
|
|
case Type::Delta: return "Delta";
|
2020-11-03 07:37:06 +08:00
|
|
|
case Type::PeakTable: return "Peak Table";
|
2020-10-21 01:15:06 +08:00
|
|
|
case Type::Lowpass: return "Lowpass";
|
|
|
|
case Type::Highpass: return "Highpass";
|
|
|
|
case Type::Bandpass: return "Bandpass";
|
2020-10-23 20:12:45 +08:00
|
|
|
case Type::TOI: return "TOI/IP3";
|
2020-11-09 04:28:47 +08:00
|
|
|
case Type::PhaseNoise: return "Phase noise";
|
2021-07-10 18:16:28 +08:00
|
|
|
case Type::P1dB: return "1dB compression";
|
2020-10-20 23:03:49 +08:00
|
|
|
default: return QString();
|
|
|
|
}
|
|
|
|
}
|
2020-11-23 04:25:41 +08:00
|
|
|
void constrainPosition();
|
2021-05-14 21:05:22 +08:00
|
|
|
void constrainFormat();
|
2021-06-19 21:33:43 +08:00
|
|
|
Marker *bestDeltaCandidate();
|
2020-10-21 01:15:06 +08:00
|
|
|
void deleteHelperMarkers();
|
2020-10-23 20:12:45 +08:00
|
|
|
void setType(Type t);
|
|
|
|
double toDecibel();
|
2020-11-03 07:37:06 +08:00
|
|
|
bool isVisible();
|
2020-10-20 23:03:49 +08:00
|
|
|
|
2021-05-14 21:05:22 +08:00
|
|
|
void setTableFormat(Format f);
|
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
MarkerModel *model;
|
2020-08-31 04:03:41 +08:00
|
|
|
Trace *parentTrace;
|
2020-11-23 04:25:41 +08:00
|
|
|
double position;
|
2020-08-31 04:03:41 +08:00
|
|
|
int number;
|
2020-11-23 04:25:41 +08:00
|
|
|
// Frequency domain: S parameter
|
2020-12-03 05:15:34 +08:00
|
|
|
// Time domain: impulse response
|
2020-08-31 04:03:41 +08:00
|
|
|
std::complex<double> data;
|
|
|
|
QPixmap symbol;
|
2020-10-20 23:03:49 +08:00
|
|
|
Type type;
|
2020-10-21 01:15:06 +08:00
|
|
|
QString suffix;
|
2020-11-03 07:37:06 +08:00
|
|
|
QString description;
|
2020-10-20 23:03:49 +08:00
|
|
|
|
2021-05-14 21:31:38 +08:00
|
|
|
QMenu contextmenu;
|
2021-04-25 21:46:34 +08:00
|
|
|
|
2021-06-19 21:33:43 +08:00
|
|
|
Marker *delta;
|
|
|
|
std::vector<Marker*> helperMarkers;
|
|
|
|
Marker *parent;
|
2020-12-03 05:15:34 +08:00
|
|
|
// settings for the different marker types
|
|
|
|
double cutoffAmplitude;
|
|
|
|
double peakThreshold;
|
|
|
|
double offset;
|
2021-05-14 21:05:22 +08:00
|
|
|
|
|
|
|
Format formatTable;
|
|
|
|
std::set<Format> formatGraph;
|
2021-06-19 21:33:43 +08:00
|
|
|
|
|
|
|
MarkerGroup *group;
|
2020-08-31 04:03:41 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // TRACEMARKER_H
|