#ifndef VIRTUALDEVICE_H #define VIRTUALDEVICE_H #include "device.h" #include "Tools/parameters.h" #include "compounddevice.h" #include #include #include class VirtualDevice : public QObject { Q_OBJECT public: VirtualDevice(QString serial = ""); ~VirtualDevice(); class Info { public: 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; unsigned int maxPoints; double mindBm; double maxdBm; double minRBW, maxRBW; } Limits; }; class Status { public: QString statusString; bool overload; bool unlocked; bool unlevel; bool extRef; }; static void RegisterTypes(); bool isCompoundDevice() const; Device *getDevice(); CompoundDevice *getCompoundDevice(); std::vector getDevices(); const Info& getInfo() const; static const VirtualDevice::Info &getInfo(VirtualDevice *vdev); const Status &getStatus() const; static const VirtualDevice::Status &getStatus(VirtualDevice *vdev); class VNASettings { public: double freqStart, freqStop; double dBmStart, dBmStop; double IFBW; int points; bool logSweep; std::vector excitedPorts; // port count starts at one }; class VNAMeasurement { public: unsigned int pointNum; double Z0; union { struct { // for non-zero span double frequency; double dBm; }; struct { // for zero span double us; // time in us since first datapoint }; }; std::map> measurements; Sparam toSparam(int port1, int port2); void fromSparam(Sparam S, int port1, int port2); VNAMeasurement interpolateTo(const VNAMeasurement &to, double a); }; QStringList availableVNAMeasurements(); bool setVNA(const VNASettings &s, std::function 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; double cdbm; }; struct { // for zero span double us; // time in us since first datapoint }; }; std::map measurements; }; QStringList availableSAMeasurements(); bool setSA(const SASettings &s, std::function cb = nullptr); class SGSettings { public: double freq; double dBm; int port; }; QStringList availableSGPorts(); bool setSG(const SGSettings &s); bool setIdle(std::function cb = nullptr); QStringList availableExtRefInSettings(); QStringList availableExtRefOutSettings(); bool setExtRef(QString option_in, QString option_out); static std::set GetDevices(); static VirtualDevice* getConnected(); signals: void VNAmeasurementReceived(VNAMeasurement m); void SAmeasurementReceived(SAMeasurement m); void ConnectionLost(); void InfoUpdated(); void StatusUpdated(Status status); void LogLineReceived(QString line); void NeedsFirmwareUpdate(int usedProtocol, int requiredProtocol); private: Info info; Status status; bool isCompound; std::vector devices; bool zerospan; std::map results; CompoundDevice *cdev; std::map*>> compoundDataBuffer; std::map portStageMapping; // maps from excitedPort (count starts at zero) to stage (count starts at zero) }; Q_DECLARE_METATYPE(VirtualDevice::Status) Q_DECLARE_METATYPE(VirtualDevice::VNAMeasurement) Q_DECLARE_METATYPE(VirtualDevice::SAMeasurement) #endif // VIRTUALDEVICE_H