LibreVNA/Software/PC_Application/Calibration/amplitudecaldialog.h
2022-08-08 18:08:40 +02:00

133 lines
4.2 KiB
C++

#ifndef AMPLITUDECALDIALOG_H
#define AMPLITUDECALDIALOG_H
#include "mode.h"
#include "modehandler.h"
#include "Device/device.h"
#include <QDialog>
namespace Ui {
class AmplitudeCalDialog;
}
class AmplitudeCalDialog;
class AmplitudeModel : public QAbstractTableModel
{
friend AmplitudeCalDialog;
Q_OBJECT
public:
AmplitudeModel(AmplitudeCalDialog *c);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role) const override;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
Qt::ItemFlags flags(const QModelIndex &index) const override;
private:
enum {
ColIndexFreq,
ColIndexCorrectionFactors,
ColIndexPort1,
ColIndexPort2,
ColIndexLast
};
AmplitudeCalDialog *c;
};
class AmplitudeCalDialog : public QDialog
{
Q_OBJECT
public:
explicit AmplitudeCalDialog(Device *dev, ModeHandler *handler, QWidget *parent = nullptr);
~AmplitudeCalDialog();
void reject() override;
class CorrectionPoint {
public:
double frequency;
int16_t correctionPort1;
int16_t correctionPort2;
double amplitudePort1;
double amplitudePort2;
bool port1set;
bool port2set;
};
std::vector<CorrectionPoint> getPoints() const;
void setAmplitude(double amplitude, unsigned int point, bool port2);
enum class CalibrationMode {
BothPorts,
OnlyPort1,
OnlyPort2,
};
CalibrationMode getMode() const;
protected slots:
void ReceivedPoint(Protocol::AmplitudeCorrectionPoint p);
void LoadFromDevice();
void SaveToDevice();
void RemovePoint(unsigned int i);
void RemoveAllPoints();
bool AddPoint(CorrectionPoint& p);
bool AddPoint(double frequency);
void AddPointDialog();
void AutomaticMeasurementDialog();
void ReceivedMeasurement(Device *dev, Protocol::SpectrumAnalyzerResult res);
signals:
void pointsUpdated();
void newPointCreated(CorrectionPoint& p);
protected:
static constexpr double excitationAmplitude = -20.0;
static constexpr int automaticSweepPoints = 31;
static constexpr int averages = 3;
static constexpr int automaticSettling = 1;
bool ConfirmActionIfEdited();
void UpdateSaveButton();
virtual Protocol::PacketType requestCommand() = 0;
virtual Protocol::PacketType pointType() = 0;
// will get called whenever a new cell is selected (frequency=0 means invalid selection)
virtual void SelectedPoint(double frequency, bool port2) = 0;
// will get called whenever the amplitude is changed. Derived class is responsible for updating correction factor
virtual void AmplitudeChanged(CorrectionPoint& point, bool port2) = 0;
// called whenver the correction factor have been retrieved from the device and the amplitudes need to be updated
virtual void UpdateAmplitude(CorrectionPoint& point) = 0;
std::vector<CorrectionPoint> points;
Ui::AmplitudeCalDialog *ui;
Device *dev;
Mode *activeMode;
ModeHandler *modeHandler;
AmplitudeModel model;
bool edited;
CalibrationMode mode;
void SetupNextAutomaticPoint(bool isSourceCal);
void ReceivedAutomaticMeasurementResult(Device *dev, Protocol::SpectrumAnalyzerResult res);
struct {
QDialog *dialog;
std::vector<CorrectionPoint> points;
bool measuringPort2; // true if port2 is being calibrated
unsigned int measuringCount; // number of calibration point
unsigned int settlingCount; // number of measurements still to ignore before taking measurement
bool isSourceCal;
QProgressBar *progress;
} automatic;
// raw (uncorrected) measurements from device.
// Used in reveicer calibration as well as in automatic calibrations
struct MeasurementResult {
double port1, port2;
};
std::vector<MeasurementResult> sweepMeasurements;
std::deque<MeasurementResult> measured;
MeasurementResult averageMeasurement();
};
#endif // SOURCECALDIALOG_H