diff --git a/controllersetup.h b/controllersetup.h index 62c81cd..1be254b 100644 --- a/controllersetup.h +++ b/controllersetup.h @@ -44,8 +44,8 @@ public slots: void offEventIndexChanged(int index); private: - enum { NONE=0, shuttleXpress, shuttlePro2, RC28, xBoxGamepad, unknownGamepad } usbDevice; + usbDeviceType usbDevice = usbNone; Ui::controllerSetup* ui; QGraphicsScene* scene; QGraphicsTextItem* textItem; diff --git a/cwsender.cpp b/cwsender.cpp index 60fd89b..3c66e83 100644 --- a/cwsender.cpp +++ b/cwsender.cpp @@ -97,10 +97,10 @@ void cwSender::on_stopBtn_clicked() ui->statusbar->showMessage("Stopping CW transmission.", 3000); } -void cwSender::on_textToSendEdit_returnPressed() -{ - on_sendBtn_clicked(); -} +//void cwSender::on_textToSendEdit_returnPressed() +//{ +// on_sendBtn_clicked(); +//} void cwSender::on_breakinCombo_activated(int brkmode) { diff --git a/cwsender.h b/cwsender.h index e35875f..e07ccf7 100644 --- a/cwsender.h +++ b/cwsender.h @@ -45,7 +45,7 @@ private slots: void on_stopBtn_clicked(); - void on_textToSendEdit_returnPressed(); + //void on_textToSendEdit_returnPressed(); void on_breakinCombo_activated(int index); diff --git a/cwsender.ui b/cwsender.ui index f328e0f..3a9e358 100644 --- a/cwsender.ui +++ b/cwsender.ui @@ -269,9 +269,6 @@ 5 - - QAbstractSpinBox::DefaultStepType - 600 diff --git a/repeatersetup.cpp b/repeatersetup.cpp index 33db475..6af089f 100644 --- a/repeatersetup.cpp +++ b/repeatersetup.cpp @@ -8,7 +8,7 @@ repeaterSetup::repeaterSetup(QWidget *parent) : ui->setupUi(this); ui->autoTrackLiveBtn->setEnabled(false); // until we set split enabled. - + ui->warningFMLabel->setVisible(false); // populate the CTCSS combo box: populateTones(); @@ -101,6 +101,7 @@ void repeaterSetup::setRig(rigCapabilities inRig) ui->rptrOffsetSetBtn->setEnabled(rig.hasRepeaterModes); ui->setToneSubVFOBtn->setEnabled(rig.hasSpecifyMainSubCmd); ui->setRptrSubVFOBtn->setEnabled(rig.hasSpecifyMainSubCmd); + ui->quickSplitChk->setVisible(rig.hasQuickSplitCommand); } void repeaterSetup::populateTones() @@ -313,25 +314,43 @@ void repeaterSetup::receiveDuplexMode(duplexMode dm) void repeaterSetup::handleRptAccessMode(rptAccessTxRx tmode) { + // ratrXY + // X = Transmit (T)one or (N)one or (D)CS + // Y = Receive (T)sql or (N)one or (D)CS switch(tmode) { - case ratrNN: - ui->toneNone->setChecked(true); - break; - case ratrTT: - ui->toneTSQL->setChecked(true); - break; - case ratrTN: - ui->toneTone->setChecked(true); - break; - case ratrDD: - ui->toneDTCS->setChecked(true); - break; - default: - break; + case ratrNN: + ui->toneNone->setChecked(true); + break; + case ratrTT: + case ratrNT: + ui->toneTSQL->setChecked(true); + break; + case ratrTN: + ui->toneTone->setChecked(true); + break; + case ratrDD: + ui->toneDTCS->setChecked(true); + break; + case ratrTONEoff: + ui->toneTone->setChecked(false); + break; + case ratrTONEon: + ui->toneTone->setChecked(true); + break; + case ratrTSQLoff: + ui->toneTSQL->setChecked(false); + break; + case ratrTSQLon: + ui->toneTSQL->setChecked(true); + break; + default: + break; + } + if( !ui->toneTSQL->isChecked() && !ui->toneTone->isChecked() && !ui->toneDTCS->isChecked()) + { + ui->toneNone->setChecked(true); } - - (void)tmode; } void repeaterSetup::handleTone(quint16 tone) @@ -396,6 +415,10 @@ void repeaterSetup::handleUpdateCurrentMainMode(mode_info m) this->currentModeMain = m; this->modeTransmitVFO = m; this->modeTransmitVFO.VFO = inactiveVFO; + if(m.mk == modeFM) + ui->warningFMLabel->setVisible(false); + else + ui->warningFMLabel->setVisible(true); } } @@ -480,11 +503,6 @@ void repeaterSetup::on_rptAutoBtn_clicked() emit setDuplexMode(dmDupAutoOn); } -void repeaterSetup::on_rptReadRigBtn_clicked() -{ - emit getDuplexMode(); -} - void repeaterSetup::on_rptToneCombo_activated(int tindex) { quint16 tone=0; @@ -594,23 +612,6 @@ void repeaterSetup::on_toneDTCS_clicked() // TODO: DTCS with subband } -void repeaterSetup::on_debugBtn_clicked() -{ - // TODO: Move these four commands to wfview's startup command list (place at the end) - //emit getTone(); - //emit getTSQL(); - //emit getDTCS(); - emit getRptAccessMode(); -} - -//void repeaterSetup::on_splitOffsetSetBtn_clicked() -//{ -// freqt txFreq; -// bool ok = true; -// txFreq.Hz = ui->splitTransmitFreqEdit->text().toDouble(&ok) * 1E6; -// emit setTransmitFrequency(txFreq); -//} - quint64 repeaterSetup::getFreqHzFromKHzString(QString khz) { // This function takes a string containing a number in KHz, @@ -822,3 +823,17 @@ void repeaterSetup::on_rptrOffsetEdit_returnPressed() { this->on_rptrOffsetSetBtn_clicked(); } + +void repeaterSetup::on_setSplitRptrToneChk_clicked(bool checked) +{ + if(checked) + { + on_setRptrSubVFOBtn_clicked(); + on_setToneSubVFOBtn_clicked(); + } +} + +void repeaterSetup::on_quickSplitChk_clicked(bool checked) +{ + emit setQuickSplit(checked); +} diff --git a/repeatersetup.h b/repeatersetup.h index 6ad367e..52650e3 100644 --- a/repeatersetup.h +++ b/repeatersetup.h @@ -35,6 +35,7 @@ signals: void getRptDuplexOffset(); // Split: void getSplitModeEnabled(); + void setQuickSplit(bool qsOn); void getTransmitFrequency(); // Use the duplexMode to communicate split. // void setSplitModeEnabled(bool splitEnabled); @@ -65,10 +66,8 @@ private slots: void on_rptDupPlusBtn_clicked(); void on_rptDupMinusBtn_clicked(); void on_rptAutoBtn_clicked(); - void on_rptReadRigBtn_clicked(); void on_rptToneCombo_activated(int index); void on_rptDTCSCombo_activated(int index); - void on_debugBtn_clicked(); void on_toneNone_clicked(); void on_toneTone_clicked(); void on_toneTSQL_clicked(); @@ -108,6 +107,10 @@ private slots: void on_splitTransmitFreqEdit_returnPressed(); + void on_setSplitRptrToneChk_clicked(bool checked); + + void on_quickSplitChk_clicked(bool checked); + private: Ui::repeaterSetup *ui; freqt currentMainFrequency; diff --git a/repeatersetup.ui b/repeatersetup.ui index da02a26..fd73983 100644 --- a/repeatersetup.ui +++ b/repeatersetup.ui @@ -151,6 +151,13 @@ + + + + QuickSplit + + + @@ -163,6 +170,9 @@ Set Rpt Tone + + true + @@ -392,6 +402,13 @@ Repeater Tone Type + + + + Only available in FM + + + diff --git a/rigcommander.cpp b/rigcommander.cpp index d2aa849..c1ca364 100644 --- a/rigcommander.cpp +++ b/rigcommander.cpp @@ -935,6 +935,16 @@ void rigCommander::getDuplexMode() prepDataAndSend(payload); } +void rigCommander::setQuickSplit(bool qsOn) +{ + if(rigCaps.hasQuickSplitCommand) + { + QByteArray payload = rigCaps.quickSplitCommand; + payload.append((unsigned char)qsOn); + prepDataAndSend(payload); + } +} + void rigCommander::setPassband(quint16 pass) { QByteArray payload; @@ -1062,7 +1072,7 @@ void rigCommander::setTone(rptrTone_t t) { qDebug(logRig()) << "Sending TONE to secondary VFO"; payload.prepend("\x29\x01"); - printHex(payload); + //printHex(payload); } prepDataAndSend(payload); @@ -1089,7 +1099,7 @@ void rigCommander::setTSQL(rptrTone_t t) { qDebug(logRig()) << "Sending TSQL to secondary VFO"; payload.prepend("\x29\x01"); - printHex(payload); + //printHex(payload); } prepDataAndSend(payload); @@ -1105,7 +1115,7 @@ void rigCommander::setDTCS(quint16 dcscode, bool tinv, bool rinv) payload.append(denc); //qInfo() << __func__ << "DTCS encoded payload: "; - printHex(payload); + //printHex(payload); prepDataAndSend(payload); } @@ -1206,10 +1216,56 @@ void rigCommander::setRptAccessMode(rptAccessTxRx ratr) void rigCommander::setRptAccessMode(rptrAccessData_t rd) { + // NB: This function is the only recommended + // function to be used for toggling tone and tone squelch. + QByteArray payload; - payload.setRawData("\x16\x5D", 2); - payload.append((unsigned char)rd.accessMode); - if(rd.useSecondaryVFO) + if(rigCaps.hasAdvancedRptrToneCmds) + { + // IC-9700 basically + payload.setRawData("\x16\x5D", 2); + payload.append((unsigned char)rd.accessMode); + } else { + // These radios either don't support DCS or + // we just haven't added DCS yet. + + // 16 42 00 = TONE off + // 16 42 01 = TONE on + // 16 43 00 = TSQL off + // 16 43 01 = TSQL on + + switch(rd.accessMode) + { + case ratrNN: + // No tone at all + if(rd.turnOffTone) + { + payload.append("\x16\x42\x00", 3); // TONE off + } else if (rd.turnOffTSQL) + { + payload.append("\x16\x43\x00", 3); // TSQL off + } + break; + case ratrTN: + // TONE on transmit only + payload.append("\x16\x42\x01", 3); // TONE on + break; + case ratrTT: + // Tone on transmit and TSQL + payload.append("\x16\x43\x01", 3); // TSQL on + break; + case ratrNT: + // Tone squelch and no tone transmit: + payload.append("\x16\x43\x01", 3); // TSQL on, close enough here. + // payload.append("\x16\x42\x00", 3); // TONE off + break; + default: + qWarning(logRig()) << "Cannot set tone mode" << (unsigned char)rd.accessMode << "on rig model" << rigCaps.modelName; + return; + } + } + + if(rd.useSecondaryVFO && rigCaps.hasSpecifyMainSubCmd) { payload.prepend("\x29\x01"); } @@ -1224,8 +1280,8 @@ void rigCommander::setRptDuplexOffset(freqt f) QByteArray freqPayload = makeFreqPayload(f); payload.append(freqPayload.mid(1, 3)); //qInfo(logRig()) << "Here is potential repeater offset setting, not sending to radio:"; - printHexNow(payload, logRig()); - QString g = getHex(payload); + //printHexNow(payload, logRig()); + //QString g = getHex(payload); //qInfo(logRig()).noquote().nospace() << g; prepDataAndSend(payload); } @@ -1319,6 +1375,7 @@ void rigCommander::sendCW(QString textToSend) QByteArray textData = textToSend.toLocal8Bit(); unsigned char p=0; + bool printout=false; for(int c=0; c < textData.length(); c++) { p = textData.at(c); @@ -1334,10 +1391,12 @@ void rigCommander::sendCW(QString textToSend) // Allowed character, continue } else { qWarning(logRig()) << "Invalid character detected in CW message at position " << c << ", the character is " << textToSend.at(c); - printHex(textData); + printout = true; textData[c] = 0x3F; // "?" } } + if(printout) + printHex(textData); if(pttAllowed) { @@ -2888,6 +2947,7 @@ void rigCommander::parseRegister16() //"INDEX: 00 01 02 03 " //"DATA: 16 5d 00 fd " // ^-- mode info here + rptAccessTxRx ra; switch(payloadIn.at(1)) { @@ -2910,9 +2970,23 @@ void rigCommander::parseRegister16() break; case '\x42': state.set(TONEFUNC, payloadIn.at(2) != 0, false); + if(payloadIn.at(2)==1) + { + ra = ratrTONEon; + } else { + ra = ratrTONEoff; + } + emit haveRptAccessMode(ra); break; case '\x43': state.set(TSQLFUNC, payloadIn.at(2) != 0, false); + if(payloadIn.at(2)==1) + { + ra = ratrTSQLon; + } else { + ra = ratrTSQLoff; + } + emit haveRptAccessMode(ra); break; case '\x44': state.set(COMPFUNC, payloadIn.at(2) != 0, false); @@ -3275,7 +3349,7 @@ void rigCommander::parseWFData() // read edge mode center in edge mode emit haveScopeEdge((char)payloadIn[2]); //qInfo(logRig()) << "Received 0x16 edge in center mode:"; - printHex(payloadIn, false, true); + //printHex(payloadIn, false, true); // [1] 0x16 // [2] 0x01, 0x02, 0x03: Edge 1,2,3 break; @@ -3348,8 +3422,8 @@ void rigCommander::determineRigCaps() bandType bandDefGen(bandGen, 10000, 30000000, modeAM); - standardHF = { bandDef6m, bandDef10m, bandDef12m, bandDef15m, bandDef17m, - bandDef20m, bandDef30m, bandDef40m, bandDef60m, bandDef80m, bandDef160m}; + standardHF = { bandDef160m, bandDef80m, bandDef60m, bandDef40m, bandDef30m, + bandDef20m, bandDef17m, bandDef15m, bandDef12m, bandDef10m, bandDef6m }; standardVU = { bandDef2m, bandDef70cm }; @@ -3459,6 +3533,8 @@ void rigCommander::determineRigCaps() rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x71"); rigCaps.hasVFOMS = false; rigCaps.hasVFOAB = true; + rigCaps.hasQuickSplitCommand = true; + rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x30"); break; case modelR8600: rigCaps.modelName = QString("IC-R8600"); @@ -3531,6 +3607,9 @@ void rigCommander::determineRigCaps() rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x27"); rigCaps.hasVFOMS = true; rigCaps.hasVFOAB = true; + rigCaps.hasAdvancedRptrToneCmds = true; + rigCaps.hasQuickSplitCommand = true; + rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x43"); break; case model910h: rigCaps.modelName = QString("IC-910H"); @@ -3585,6 +3664,8 @@ void rigCommander::determineRigCaps() rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x97"); rigCaps.hasVFOMS = true; rigCaps.hasVFOAB = false; + rigCaps.hasQuickSplitCommand = true; + rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x64"); break; case model7610: rigCaps.modelName = QString("IC-7610"); @@ -3619,6 +3700,8 @@ void rigCommander::determineRigCaps() rigCaps.hasRXAntenna = true; rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x12"); rigCaps.hasSpecifyMainSubCmd = true; + rigCaps.hasQuickSplitCommand = true; + rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x33"); rigCaps.hasVFOMS = true; rigCaps.hasVFOAB = false; break; @@ -3654,6 +3737,8 @@ void rigCommander::determineRigCaps() rigCaps.hasRXAntenna = true; rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x55"); rigCaps.hasSpecifyMainSubCmd = true; + rigCaps.hasQuickSplitCommand = true; + rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x01\x13"); rigCaps.hasVFOMS = true; rigCaps.hasVFOAB = false; break; @@ -3693,6 +3778,8 @@ void rigCommander::determineRigCaps() rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x31"); rigCaps.hasVFOMS = false; rigCaps.hasVFOAB = true; + rigCaps.hasQuickSplitCommand = true; + rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x45"); break; case model7000: rigCaps.modelName = QString("IC-7000"); @@ -3719,6 +3806,8 @@ void rigCommander::determineRigCaps() rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x92"); rigCaps.hasVFOMS = false; rigCaps.hasVFOAB = true; + rigCaps.hasQuickSplitCommand = true; + rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x52"); break; case model7410: rigCaps.modelName = QString("IC-7410"); @@ -3744,6 +3833,8 @@ void rigCommander::determineRigCaps() rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x40"); rigCaps.hasVFOMS = false; rigCaps.hasVFOAB = true; + rigCaps.hasQuickSplitCommand = true; + rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x11"); break; case model7100: rigCaps.modelName = QString("IC-7100"); @@ -3775,6 +3866,8 @@ void rigCommander::determineRigCaps() rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x95"); rigCaps.hasVFOMS = false; rigCaps.hasVFOAB = true; + rigCaps.hasQuickSplitCommand = true; + rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x15"); break; case model7200: rigCaps.modelName = QString("IC-7200"); @@ -3799,6 +3892,8 @@ void rigCommander::determineRigCaps() rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x03\x48"); rigCaps.hasVFOMS = false; rigCaps.hasVFOAB = true; + rigCaps.hasQuickSplitCommand = true; + rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x03\x18"); break; case model7700: rigCaps.modelName = QString("IC-7700"); @@ -3827,6 +3922,8 @@ void rigCommander::determineRigCaps() rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x95"); rigCaps.hasVFOMS = false; rigCaps.hasVFOAB = true; + rigCaps.hasQuickSplitCommand = true; + rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x67"); break; case model703: rigCaps.modelName = QString("IC-703"); @@ -4067,6 +4164,8 @@ void rigCommander::determineRigCaps() rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00"); rigCaps.hasVFOMS = true; rigCaps.hasVFOAB = false; + rigCaps.hasQuickSplitCommand = true; + rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x24"); break; case model756proiii: rigCaps.modelName = QString("IC-756 Pro III"); @@ -4090,6 +4189,8 @@ void rigCommander::determineRigCaps() rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00"); rigCaps.hasVFOMS = true; rigCaps.hasVFOAB = false; + rigCaps.hasQuickSplitCommand = true; + rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x24"); break; case model9100: rigCaps.modelName = QString("IC-9100"); @@ -4121,6 +4222,8 @@ void rigCommander::determineRigCaps() rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modeDV, 0x17, "DV")}); rigCaps.hasVFOMS = true; rigCaps.hasVFOAB = true; + rigCaps.hasQuickSplitCommand = true; + rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x14"); break; default: rigCaps.modelName = QString("IC-0x%1").arg(rigCaps.modelID, 2, 16); @@ -4244,6 +4347,17 @@ void rigCommander::parseSpectrum() return; } + if(payloadIn.length() >= 15) + { + bool outOfRange = (bool)payloadIn[16]; + if(outOfRange != wasOutOfRange) + { + emit haveScopeOutOfRange(outOfRange); + wasOutOfRange = outOfRange; + return; + } + } + // unsigned char waveInfo = payloadIn[06]; // really just one byte? //qInfo(logRig()) << "Spectrum Data received: " << sequence << "/" << sequenceMax << " mode: " << scopeMode << " waveInfo: " << waveInfo << " length: " << payloadIn.length(); @@ -4774,7 +4888,7 @@ void rigCommander::setToneSql(bool enabled) prepDataAndSend(payload); } -void rigCommander::getToneSql() +void rigCommander::getToneSqlEnabled() { QByteArray payload; payload.setRawData("\x16\x43", 2); @@ -5152,7 +5266,7 @@ void rigCommander::stateUpdated() if (i.value()._valid) { setToneSql(state.getBool(TSQLFUNC)); } - getToneSql(); + getToneSqlEnabled(); break; case COMPFUNC: if (i.value()._valid) { diff --git a/rigcommander.h b/rigcommander.h index bf07110..740fda3 100644 --- a/rigcommander.h +++ b/rigcommander.h @@ -112,7 +112,7 @@ public slots: void setToneEnabled(bool enabled); void getToneEnabled(); void setToneSql(bool enabled); - void getToneSql(); + void getToneSqlEnabled(); void setCompressor(bool enabled); void getCompressor(); void setMonitor(bool enabled); @@ -137,6 +137,7 @@ public slots: // Repeater: void setDuplexMode(duplexMode dm); void getDuplexMode(); + void setQuickSplit(bool qsOn); void getTransmitFrequency(); void setTone(rptrTone_t t); void setTSQL(rptrTone_t t); @@ -291,6 +292,7 @@ signals: void haveSpectrumMode(spectrumMode spectmode); void haveScopeEdge(char edge); void haveSpectrumRefLevel(int level); + void haveScopeOutOfRange(bool outOfRange); // Rig ID: void haveRigID(rigCapabilities rigCaps); @@ -457,6 +459,7 @@ private: quint16 spectAmpMax; quint16 spectLenMax; spectrumMode oldScopeMode; + bool wasOutOfRange = false; bool usingNativeLAN; // indicates using OEM LAN connection (705,7610,9700,7850) bool lookingForRig; diff --git a/rigidentities.h b/rigidentities.h index dbd6e3f..8202506 100644 --- a/rigidentities.h +++ b/rigidentities.h @@ -152,6 +152,10 @@ struct rigCapabilities { bool hasVFOMS = false; bool hasVFOAB = true; // 0x07 [00||01] + bool hasAdvancedRptrToneCmds = false; + bool hasQuickSplitCommand = false; + QByteArray quickSplitCommand; + std::vector attenuators; std::vector preamps; std::vector antennas; diff --git a/udpbase.cpp b/udpbase.cpp index 73bf91b..719848a 100644 --- a/udpbase.cpp +++ b/udpbase.cpp @@ -429,11 +429,12 @@ void udpBase::sendTrackedPacket(QByteArray d) udpMutex.lock(); udp->writeDatagram(d, radioIP, port); - if (congestion > 10) { // Poor quality connection? + + /*if (congestion > 10) { // Poor quality connection? udp->writeDatagram(d, radioIP, port); if (congestion > 20) // Even worse so send again. udp->writeDatagram(d, radioIP, port); - } + } */ if (idleTimer != Q_NULLPTR && idleTimer->isActive()) { idleTimer->start(IDLE_PERIOD); // Reset idle counter if it's running } diff --git a/usbcontroller.cpp b/usbcontroller.cpp index 8a9dcff..93adf56 100644 --- a/usbcontroller.cpp +++ b/usbcontroller.cpp @@ -18,6 +18,7 @@ usbController::usbController() usbController::~usbController() { qInfo(logUsbControl) << "Ending usbController()"; + ledControl(false, 3); hid_close(handle); hid_exit(); #if (QT_VERSION < QT_VERSION_CHECK(6,0,0)) @@ -45,32 +46,6 @@ void usbController::receiveButtons(QVector