LibreVNA/Software/PC_Application/Device/virtualdevice.h

217 lines
5.8 KiB
C
Raw Normal View History

2022-08-04 23:31:24 +08:00
#ifndef VIRTUALDEVICE_H
#define VIRTUALDEVICE_H
#include "device.h"
2022-08-05 02:12:15 +08:00
#include "Tools/parameters.h"
2022-08-06 00:29:31 +08:00
#include "compounddevice.h"
2022-08-04 23:31:24 +08:00
#include <set>
#include <complex>
#include <QObject>
class VirtualDevice : public QObject
{
Q_OBJECT
public:
VirtualDevice(QString serial = "");
~VirtualDevice();
class Info {
public:
2022-08-07 09:01:22 +08:00
Info();
Info(Device *dev);
void subset(const Info &merge);
2022-08-04 23:31:24 +08:00
uint16_t ProtocolVersion;
uint8_t FW_major;
uint8_t FW_minor;
uint8_t FW_patch;
uint8_t hardware_version;
char HW_Revision;
int ports;
bool supportsVNAmode;
bool supportsSAmode;
bool supportsSGmode;
bool supportsExtRef;
struct {
double minFreq, maxFreq, maxFreqHarmonic;
double minIFBW, maxIFBW;
2022-08-05 18:20:41 +08:00
unsigned int maxPoints;
2022-08-04 23:31:24 +08:00
double mindBm;
double maxdBm;
double minRBW, maxRBW;
} Limits;
};
class Status {
public:
2022-08-07 09:01:22 +08:00
Status();
Status(Device *dev);
void merge(const Status &merge);
2022-08-04 23:31:24 +08:00
QString statusString;
bool overload;
bool unlocked;
bool unlevel;
2022-08-05 18:20:41 +08:00
bool extRef;
2022-08-04 23:31:24 +08:00
};
2022-08-05 18:20:41 +08:00
static void RegisterTypes();
2022-08-04 23:31:24 +08:00
bool isCompoundDevice() const;
Device *getDevice();
2022-08-06 00:29:31 +08:00
CompoundDevice *getCompoundDevice();
2022-08-04 23:31:24 +08:00
std::vector<Device*> getDevices();
const Info& getInfo() const;
2022-08-07 09:01:22 +08:00
static VirtualDevice::Info getInfo(VirtualDevice *vdev);
2022-08-04 23:31:24 +08:00
const Status &getStatus() const;
2022-08-07 09:01:22 +08:00
static VirtualDevice::Status getStatus(VirtualDevice *vdev);
2022-08-04 23:31:24 +08:00
class VNASettings {
public:
double freqStart, freqStop;
double dBmStart, dBmStop;
double IFBW;
int points;
bool logSweep;
std::vector<int> excitedPorts; // port count starts at one
2022-08-04 23:31:24 +08:00
};
class VNAMeasurement {
public:
2022-08-05 18:20:41 +08:00
unsigned int pointNum;
2022-08-05 02:12:15 +08:00
double Z0;
2022-08-04 23:31:24 +08:00
union {
struct {
// for non-zero span
double frequency;
double dBm;
};
struct {
// for zero span
double us; // time in us since first datapoint
};
};
std::map<QString, std::complex<double>> measurements;
2022-08-05 02:12:15 +08:00
2022-08-27 21:28:45 +08:00
Sparam toSparam(int port1, int port2) const;
2022-08-05 02:12:15 +08:00
void fromSparam(Sparam S, int port1, int port2);
VNAMeasurement interpolateTo(const VNAMeasurement &to, double a);
2022-08-04 23:31:24 +08:00
};
QStringList availableVNAMeasurements();
bool setVNA(const VNASettings &s, std::function<void(bool)> cb = nullptr);
QString serial();
class SASettings {
public:
enum class Window {
None = 0,
Kaiser = 1,
Hann = 2,
FlatTop = 3,
Last
};
enum class Detector {
PPeak = 0,
NPeak = 1,
Sample = 2,
Normal = 3,
Average = 4,
Last
};
double freqStart, freqStop;
double RBW;
int points;
Window window;
Detector detector;
bool signalID;
bool trackingGenerator;
int trackingPort;
double trackingOffset;
double trackingPower;
};
class SAMeasurement {
public:
int pointNum;
union {
struct {
// for non-zero span
double frequency;
};
struct {
// for zero span
double us; // time in us since first datapoint
};
};
std::map<QString, double> measurements;
};
QStringList availableSAMeasurements();
bool setSA(const SASettings &s, std::function<void(bool)> cb = nullptr);
class SGSettings {
public:
double freq;
double dBm;
2022-08-07 09:01:22 +08:00
int port; // starts at one, set to zero to disable all ports
2022-08-04 23:31:24 +08:00
};
QStringList availableSGPorts();
bool setSG(const SGSettings &s);
bool setIdle(std::function<void(bool)> cb = nullptr);
QStringList availableExtRefInSettings();
QStringList availableExtRefOutSettings();
bool setExtRef(QString option_in, QString option_out);
2022-08-07 09:01:22 +08:00
static std::set<QString> GetAvailableVirtualDevices();
2022-08-04 23:31:24 +08:00
static VirtualDevice* getConnected();
signals:
2022-08-05 18:20:41 +08:00
void VNAmeasurementReceived(VNAMeasurement m);
void SAmeasurementReceived(SAMeasurement m);
2022-08-04 23:31:24 +08:00
void ConnectionLost();
void InfoUpdated();
2022-08-05 18:20:41 +08:00
void StatusUpdated(Status status);
2022-08-04 23:31:24 +08:00
void LogLineReceived(QString line);
void NeedsFirmwareUpdate(int usedProtocol, int requiredProtocol);
2022-08-07 09:01:22 +08:00
private slots:
2022-08-09 00:08:40 +08:00
void singleDatapointReceived(Device *dev, Protocol::VNADatapoint<32> *res);
void compoundDatapointReceivecd(Device *dev, Protocol::VNADatapoint<32> *data);
void singleSpectrumResultReceived(Device *dev, Protocol::SpectrumAnalyzerResult res);
void compoundSpectrumResultReceived(Device *dev, Protocol::SpectrumAnalyzerResult res);
2022-08-07 09:01:22 +08:00
void compoundInfoUpdated(Device *dev);
void compoundStatusUpdated(Device *dev);
2022-08-04 23:31:24 +08:00
private:
2022-08-07 09:01:22 +08:00
void checkIfAllTransmissionsComplete(std::function<void(bool)> cb = nullptr);
2022-08-04 23:31:24 +08:00
Info info;
Status status;
std::vector<Device*> devices;
bool zerospan;
std::map<Device*, Device::TransmissionResult> results;
2022-08-06 00:29:31 +08:00
CompoundDevice *cdev;
2022-08-07 09:01:22 +08:00
std::map<int, std::map<Device*, Protocol::VNADatapoint<32>*>> compoundVNABuffer;
std::map<int, std::map<Device*, Protocol::SpectrumAnalyzerResult>> compoundSABuffer;
std::map<Device*, Protocol::DeviceInfo> compoundInfoBuffer;
std::map<Device*, Protocol::DeviceStatusV1> compoundStatusBuffer;
std::map<int, int> portStageMapping; // maps from excitedPort (count starts at zero) to stage (count starts at zero)
2022-08-04 23:31:24 +08:00
};
2022-08-05 18:20:41 +08:00
Q_DECLARE_METATYPE(VirtualDevice::Status)
Q_DECLARE_METATYPE(VirtualDevice::VNAMeasurement)
Q_DECLARE_METATYPE(VirtualDevice::SAMeasurement)
2022-08-04 23:31:24 +08:00
#endif // VIRTUALDEVICE_H