diff --git a/repeatersetup.cpp b/repeatersetup.cpp index 43e052b..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() @@ -414,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); } } @@ -827,3 +832,8 @@ void repeaterSetup::on_setSplitRptrToneChk_clicked(bool checked) on_setToneSubVFOBtn_clicked(); } } + +void repeaterSetup::on_quickSplitChk_clicked(bool checked) +{ + emit setQuickSplit(checked); +} diff --git a/repeatersetup.h b/repeatersetup.h index c9e2f47..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); @@ -108,6 +109,8 @@ private slots: 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 d4571eb..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); } @@ -1270,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); } @@ -1365,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); @@ -1380,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) { @@ -3336,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; @@ -3520,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"); @@ -3593,6 +3608,8 @@ void rigCommander::determineRigCaps() 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"); @@ -3647,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"); @@ -3681,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; @@ -3716,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; @@ -3755,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"); @@ -3781,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"); @@ -3806,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"); @@ -3837,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"); @@ -3861,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"); @@ -3889,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"); @@ -4129,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"); @@ -4152,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"); @@ -4183,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); diff --git a/rigcommander.h b/rigcommander.h index b55c7ae..740fda3 100644 --- a/rigcommander.h +++ b/rigcommander.h @@ -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); diff --git a/rigidentities.h b/rigidentities.h index 3a985fe..8202506 100644 --- a/rigidentities.h +++ b/rigidentities.h @@ -153,6 +153,8 @@ struct rigCapabilities { bool hasVFOAB = true; // 0x07 [00||01] bool hasAdvancedRptrToneCmds = false; + bool hasQuickSplitCommand = false; + QByteArray quickSplitCommand; std::vector attenuators; std::vector preamps; diff --git a/wfmain.cpp b/wfmain.cpp index adef2d4..b8e657f 100644 --- a/wfmain.cpp +++ b/wfmain.cpp @@ -415,18 +415,12 @@ void wfmain::rigConnections() } }); - // How to understand the reply of getToneEnabled, getTSQLEnabled - // ...... - // it's currently only read into rigState. - // We could emit a signal from rigCommander, turn it into - // a rptrAccess data type and feed that to rptr. - // But there will be two replies, and we need to somehow - // understand both before forming a sensible reply to - // the rptr setup. - // If we don't care, then it just works but we don't know the current state. + connect(this->rpt, &repeaterSetup::setQuickSplit, + [=](const bool &qsEnabled) { + issueCmd(cmdSetQuickSplit, qsEnabled); + }); - - //connect(rpt, SIGNAL(setRptAccessMode(rptAccessTxRx)), rig, SLOT(setRptAccessMode(rptAccessTxRx))); + connect(this, SIGNAL(setQuickSplit(bool)), rig, SLOT(setQuickSplit(bool))); connect(this->rpt, &repeaterSetup::setRptAccessMode, [=](const rptrAccessData_t &rd) { @@ -453,7 +447,7 @@ void wfmain::rigConnections() connect(this, SIGNAL(getTSQLEnabled()), rig, SLOT(getToneSqlEnabled())); connect(this->rpt, &repeaterSetup::setTransmitFrequency, - [=](const freqt &transmitFreq) { issueCmd(cmdSetFreq, transmitFreq);}); + [=](const freqt &transmitFreq) { issueCmdUniquePriority(cmdSetFreq, transmitFreq);}); connect(this->rpt, &repeaterSetup::setTransmitMode, [=](const mode_info &transmitMode) { issueCmd(cmdSetMode, transmitMode);}); connect(this->rpt, &repeaterSetup::selectVFO, @@ -3823,6 +3817,12 @@ void wfmain::doCmd(commandtype cmddata) emit setRptDuplexOffset(f); break; } + case cmdSetQuickSplit: + { + bool qsEnabled = (*std::static_pointer_cast(data)); + emit setQuickSplit(qsEnabled); + break; + } case cmdSetPTT: { bool pttrequest = (*std::static_pointer_cast(data)); diff --git a/wfmain.h b/wfmain.h index a646680..300a7ab 100644 --- a/wfmain.h +++ b/wfmain.h @@ -111,6 +111,7 @@ signals: // Repeater: void getDuplexMode(); + void setQuickSplit(bool qsOn); void getTone(); void getTSQL(); void getDTCS(); diff --git a/wfviewtypes.h b/wfviewtypes.h index bd8c3e1..b86e131 100644 --- a/wfviewtypes.h +++ b/wfviewtypes.h @@ -164,7 +164,7 @@ enum cmds { cmdGetTone, cmdGetTSQL, cmdGetToneEnabled, cmdGetTSQLEnabled, cmdGetDTCS, cmdSetToneEnabled, cmdSetTSQLEnabled, cmdGetRptAccessMode, cmdSetTone, cmdSetTSQL, cmdSetRptAccessMode, cmdSetRptDuplexOffset, cmdGetRptDuplexOffset, - cmdSelVFO, cmdVFOSwap, cmdVFOEqualAB, cmdVFOEqualMS, + cmdSelVFO, cmdVFOSwap, cmdVFOEqualAB, cmdVFOEqualMS, cmdSetQuickSplit, cmdGetPreamp, cmdGetAttenuator, cmdGetAntenna, cmdGetBandStackReg, cmdGetKeySpeed, cmdSetKeySpeed, cmdGetBreakMode, cmdSetBreakMode, cmdSendCW, cmdStopCW, cmdSetTime, cmdSetDate, cmdSetUTCOffset,