diff --git a/Software/PC_Application/LibreVNA-GUI/Calibration/LibreCAL/caldevice.cpp b/Software/PC_Application/LibreVNA-GUI/Calibration/LibreCAL/caldevice.cpp index dde5435..eddfa76 100644 --- a/Software/PC_Application/LibreVNA-GUI/Calibration/LibreCAL/caldevice.cpp +++ b/Software/PC_Application/LibreVNA-GUI/Calibration/LibreCAL/caldevice.cpp @@ -23,6 +23,7 @@ CalDevice::CalDevice(QString serial) : if(!okay) { numPorts = 0; } + connect(usb, &USBDevice::communicationFailure, this, &CalDevice::disconnected); } CalDevice::~CalDevice() @@ -32,24 +33,24 @@ CalDevice::~CalDevice() QString CalDevice::StandardToString(CalDevice::Standard s) { - switch(s) { - case Standard::Open: return "OPEN"; - case Standard::Short: return "SHORT"; - case Standard::Load: return "LOAD"; - case Standard::Through: return "THROUGH"; - case Standard::None: return "NONE"; + switch(s.type) { + case Standard::Type::Open: return "OPEN"; + case Standard::Type::Short: return "SHORT"; + case Standard::Type::Load: return "LOAD"; + case Standard::Type::Through: return "THROUGH "+QString::number(s.throughDest); + case Standard::Type::None: return "NONE"; } return "Invalid"; } CalDevice::Standard CalDevice::StandardFromString(QString s) { - for(int i=0;i<=(int) Standard::None;i++) { - if(s == StandardToString((Standard) i)) { - return (Standard) i; + for(auto standard : availableStandards()) { + if(s == StandardToString(standard)) { + return standard; } } - return Standard::None; + return Standard(Standard::Type::None); } CalDevice::Standard CalDevice::getStandard(int port) @@ -67,7 +68,7 @@ bool CalDevice::setStandard(int port, CalDevice::Standard s) std::vector CalDevice::availableStandards() { - return {Standard::None, Standard::Open, Standard::Short, Standard::Load, Standard::Through}; + return {Standard(Standard::Type::None), Standard(Standard::Type::Open), Standard(Standard::Type::Short), Standard(Standard::Type::Load), Standard(1), Standard(2), Standard(3), Standard(4)}; } double CalDevice::getTemperature() @@ -113,6 +114,11 @@ unsigned int CalDevice::getNumPorts() const return numPorts; } +bool CalDevice::enterBootloader() +{ + return usb->Cmd(":BOOTloader"); +} + void CalDevice::loadCoefficientSets(QStringList names) { coeffSets.clear(); @@ -306,6 +312,18 @@ std::vector CalDevice::getCoefficientSets() const return coeffSets; } +void CalDevice::addCoefficientSet(QString name) +{ + CoefficientSet set; + set.name = name; + set.ports = numPorts; + set.loads.resize(numPorts, new CoefficientSet::Coefficient()); + set.shorts.resize(numPorts, new CoefficientSet::Coefficient()); + set.opens.resize(numPorts, new CoefficientSet::Coefficient()); + set.throughs.resize(numPorts*(numPorts-1)/2, new CoefficientSet::Coefficient()); + coeffSets.push_back(set); +} + QStringList CalDevice::getCoefficientSetNames() { QString resp = usb->Query(":COEFF:LIST?"); diff --git a/Software/PC_Application/LibreVNA-GUI/Calibration/LibreCAL/caldevice.h b/Software/PC_Application/LibreVNA-GUI/Calibration/LibreCAL/caldevice.h index b4425f1..d9f2331 100644 --- a/Software/PC_Application/LibreVNA-GUI/Calibration/LibreCAL/caldevice.h +++ b/Software/PC_Application/LibreVNA-GUI/Calibration/LibreCAL/caldevice.h @@ -14,12 +14,19 @@ public: CalDevice(QString serial); ~CalDevice(); - enum class Standard { - Open, - Short, - Load, - Through, - None + class Standard { + public: + enum class Type { + Open, + Short, + Load, + Through, + None + }; + Standard(Type type) : type(type), throughDest(0){} + Standard(int throughDest) : type(Type::Through), throughDest(throughDest){} + Type type; + int throughDest; }; static QString StandardToString(Standard s); @@ -37,6 +44,8 @@ public: QString getFirmware() const; unsigned int getNumPorts() const; + bool enterBootloader(); + class CoefficientSet { public: QString name; @@ -67,6 +76,8 @@ public: void saveCoefficientSets(); std::vector getCoefficientSets() const; + void addCoefficientSet(QString name); + QStringList getCoefficientSetNames(); bool hasModifiedCoefficients(); @@ -76,6 +87,8 @@ signals: // emitted when all coefficients have been received and it is safe to call all functions again void updateCoefficientsDone(bool success); + void disconnected(); + private: void loadCoefficientSetsThread(QStringList names = QStringList()); void saveCoefficientSetsThread(); diff --git a/Software/PC_Application/LibreVNA-GUI/Calibration/LibreCAL/librecaldialog.cpp b/Software/PC_Application/LibreVNA-GUI/Calibration/LibreCAL/librecaldialog.cpp index 96e3008..e04af2e 100644 --- a/Software/PC_Application/LibreVNA-GUI/Calibration/LibreCAL/librecaldialog.cpp +++ b/Software/PC_Application/LibreVNA-GUI/Calibration/LibreCAL/librecaldialog.cpp @@ -348,15 +348,15 @@ void LibreCALDialog::startCalibration() ui->progressCal->setValue(measurementsTaken * 100 / totalMeasurements); switch(measurementsTaken) { case 0: - setTerminationOnAllUsedPorts(CalDevice::Standard::Open); + setTerminationOnAllUsedPorts(CalDevice::Standard(CalDevice::Standard::Type::Open)); emit cal->startMeasurements(openMeasurements); break; case 1: - setTerminationOnAllUsedPorts(CalDevice::Standard::Short); + setTerminationOnAllUsedPorts(CalDevice::Standard(CalDevice::Standard::Type::Short)); emit cal->startMeasurements(shortMeasurements); break; case 2: - setTerminationOnAllUsedPorts(CalDevice::Standard::Load); + setTerminationOnAllUsedPorts(CalDevice::Standard(CalDevice::Standard::Type::Load)); emit cal->startMeasurements(loadMeasurements); break; default: { @@ -384,14 +384,13 @@ void LibreCALDialog::startCalibration() } // sever connection to this function disconnect(cal, &Calibration::measurementsUpdated, this, nullptr); - setTerminationOnAllUsedPorts(CalDevice::Standard::None); + setTerminationOnAllUsedPorts(CalDevice::Standard(CalDevice::Standard::Type::None)); enableUI(); break; } - setTerminationOnAllUsedPorts(CalDevice::Standard::None); + setTerminationOnAllUsedPorts(CalDevice::Standard(CalDevice::Standard::Type::None)); auto m = throughMeasurements[throughIndex]; - device->setStandard(m->getPort1(), CalDevice::Standard::Through); - device->setStandard(m->getPort2(), CalDevice::Standard::Through); + device->setStandard(m->getPort1(), CalDevice::Standard(m->getPort2())); emit cal->startMeasurements({m}); } break; diff --git a/Software/PC_Application/LibreVNA-GUI/Calibration/LibreCAL/usbdevice.cpp b/Software/PC_Application/LibreVNA-GUI/Calibration/LibreCAL/usbdevice.cpp index a4f0fe0..14dcdf5 100644 --- a/Software/PC_Application/LibreVNA-GUI/Calibration/LibreCAL/usbdevice.cpp +++ b/Software/PC_Application/LibreVNA-GUI/Calibration/LibreCAL/usbdevice.cpp @@ -78,11 +78,12 @@ bool USBDevice::Cmd(QString cmd) { QString rcv; bool success = send(cmd) && receive(&rcv); - if(success) { + if(success && rcv == "") { // empty response expected by commad - return rcv == ""; + return true; } else { // failed to send/receive + emit communicationFailure(); return false; } } @@ -93,7 +94,11 @@ QString USBDevice::Query(QString query) QString rcv; if(receive(&rcv)) { return rcv; + } else { + emit communicationFailure(); } + } else { + emit communicationFailure(); } return QString(); } @@ -194,7 +199,7 @@ void USBDevice::SearchDevices(std::function #include #include -#include +#include -class USBDevice +#include + +class USBDevice : public QObject { + Q_OBJECT public: // connect to a CAL device. If serial is specified only connecting to this device, otherwise to the first one found USBDevice(QString serial = QString()); @@ -20,10 +23,14 @@ public: // Returns serial numbers of all connected devices static std::set GetDevices(); +signals: + void communicationFailure(); + private: static void SearchDevices(std::function foundCallback, libusb_context *context, bool ignoreOpenError); bool send(const QString &s); bool receive(QString *s); + bool flushRX(); libusb_device_handle *m_handle; libusb_context *m_context;