diff --git a/Desktop_Interface/genericusbdriver.cpp b/Desktop_Interface/genericusbdriver.cpp index 1f1d42933..4a68385ea 100644 --- a/Desktop_Interface/genericusbdriver.cpp +++ b/Desktop_Interface/genericusbdriver.cpp @@ -69,7 +69,11 @@ genericUsbDriver::genericUsbDriver(QWidget *parent) : QLabel(parent) //qDebug() << k; //qDebug() << NUM_ISO_ENDPOINTS; pipeID[k] = 0x81+k; +#ifdef PLATFORM_WINDOWS + qDebug() << "pipeID" << k << "=" << static_cast(pipeID[k]); +#else qDebug() << "pipeID" << k << "=" << pipeID[k]; +#endif } connectTimer = new QTimer(); diff --git a/Desktop_Interface/genericusbdriver.h b/Desktop_Interface/genericusbdriver.h index 95dcc7a57..17f2b0591 100644 --- a/Desktop_Interface/genericusbdriver.h +++ b/Desktop_Interface/genericusbdriver.h @@ -93,7 +93,11 @@ class genericUsbDriver : public QLabel //Generic Vars //bufferControl *bufferPtr = NULL; QTimer *psuTimer = nullptr; +#ifdef PLATFORM_WINDOWS + unsigned char pipeID[NUM_ISO_ENDPOINTS]; +#else unsigned char pipeID[3]; +#endif QTimer *isoTimer = nullptr; QTimer *connectTimer = nullptr; QTimer *recoveryTimer; diff --git a/Desktop_Interface/mainwindow.cpp b/Desktop_Interface/mainwindow.cpp index 7cc014b49..94a047e97 100644 --- a/Desktop_Interface/mainwindow.cpp +++ b/Desktop_Interface/mainwindow.cpp @@ -1575,7 +1575,13 @@ void MainWindow::reinitUsb(void){ ui->controller_iso->driver->saveState(&reinitdeviceMode, &reinitScopeGain, &reinitCurrentPsuVoltage, &reinitDigitalPinState); #ifdef PLATFORM_WINDOWS - reinitUsbStage2(); + if(!(ui->controller_iso->driver->connected)){ + reinitUsbStage2(); + } else{ + connect(ui->controller_iso->driver, SIGNAL(shutdownComplete()), + this, SLOT(reinitUsbStage2()), Qt::UniqueConnection); + ui->controller_iso->driver->shutdownProcedure(); + } #else if(!(ui->controller_iso->driver->connected)){ reinitUsbStage2(); diff --git a/Desktop_Interface/winusbdriver.cpp b/Desktop_Interface/winusbdriver.cpp index f4b1af334..1afbd4e92 100644 --- a/Desktop_Interface/winusbdriver.cpp +++ b/Desktop_Interface/winusbdriver.cpp @@ -1,5 +1,6 @@ #include "winusbdriver.h" #include +#include #include #include @@ -18,7 +19,7 @@ winUsbDriver::~winUsbDriver(void){ for(int n=0;nStartFrame; @@ -321,6 +331,64 @@ void winUsbDriver::recoveryTick(){ } void winUsbDriver::shutdownProcedure(){ + if(shutdownRequested){ + return; + } + shutdownRequested = true; + + // 1) Stop timers so no new work is scheduled. + // 2) Abort + flush pipes to force outstanding overlapped requests to complete. + // 3) Poll for completion with a timeout. + // 4) Emit shutdownComplete once it's safe for MainWindow to delete this driver. + qDebug() << "winUsbDriver::shutdownProcedure begin"; + + if(isoTimer){ + isoTimer->stop(); + } + if(recoveryTimer){ + recoveryTimer->stop(); + } + + if(handle){ + for (unsigned char k=0; k