Merge branch 'morecontrols' into band-switching

failbranch
Phil Taylor 2023-02-02 23:12:43 +00:00
commit 4ea80af164
9 zmienionych plików z 96 dodań i 21 usunięć

Wyświetl plik

@ -8,7 +8,7 @@ repeaterSetup::repeaterSetup(QWidget *parent) :
ui->setupUi(this); ui->setupUi(this);
ui->autoTrackLiveBtn->setEnabled(false); // until we set split enabled. ui->autoTrackLiveBtn->setEnabled(false); // until we set split enabled.
ui->warningFMLabel->setVisible(false);
// populate the CTCSS combo box: // populate the CTCSS combo box:
populateTones(); populateTones();
@ -101,6 +101,7 @@ void repeaterSetup::setRig(rigCapabilities inRig)
ui->rptrOffsetSetBtn->setEnabled(rig.hasRepeaterModes); ui->rptrOffsetSetBtn->setEnabled(rig.hasRepeaterModes);
ui->setToneSubVFOBtn->setEnabled(rig.hasSpecifyMainSubCmd); ui->setToneSubVFOBtn->setEnabled(rig.hasSpecifyMainSubCmd);
ui->setRptrSubVFOBtn->setEnabled(rig.hasSpecifyMainSubCmd); ui->setRptrSubVFOBtn->setEnabled(rig.hasSpecifyMainSubCmd);
ui->quickSplitChk->setVisible(rig.hasQuickSplitCommand);
} }
void repeaterSetup::populateTones() void repeaterSetup::populateTones()
@ -414,6 +415,10 @@ void repeaterSetup::handleUpdateCurrentMainMode(mode_info m)
this->currentModeMain = m; this->currentModeMain = m;
this->modeTransmitVFO = m; this->modeTransmitVFO = m;
this->modeTransmitVFO.VFO = inactiveVFO; 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(); on_setToneSubVFOBtn_clicked();
} }
} }
void repeaterSetup::on_quickSplitChk_clicked(bool checked)
{
emit setQuickSplit(checked);
}

Wyświetl plik

@ -35,6 +35,7 @@ signals:
void getRptDuplexOffset(); void getRptDuplexOffset();
// Split: // Split:
void getSplitModeEnabled(); void getSplitModeEnabled();
void setQuickSplit(bool qsOn);
void getTransmitFrequency(); void getTransmitFrequency();
// Use the duplexMode to communicate split. // Use the duplexMode to communicate split.
// void setSplitModeEnabled(bool splitEnabled); // void setSplitModeEnabled(bool splitEnabled);
@ -108,6 +109,8 @@ private slots:
void on_setSplitRptrToneChk_clicked(bool checked); void on_setSplitRptrToneChk_clicked(bool checked);
void on_quickSplitChk_clicked(bool checked);
private: private:
Ui::repeaterSetup *ui; Ui::repeaterSetup *ui;
freqt currentMainFrequency; freqt currentMainFrequency;

Wyświetl plik

@ -151,6 +151,13 @@
</attribute> </attribute>
</widget> </widget>
</item> </item>
<item>
<widget class="QCheckBox" name="quickSplitChk">
<property name="text">
<string>QuickSplit</string>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>
@ -163,6 +170,9 @@
<property name="text"> <property name="text">
<string>Set Rpt Tone</string> <string>Set Rpt Tone</string>
</property> </property>
<property name="checked">
<bool>true</bool>
</property>
</widget> </widget>
</item> </item>
<item> <item>
@ -392,6 +402,13 @@
<string>Repeater Tone Type</string> <string>Repeater Tone Type</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLabel" name="warningFMLabel">
<property name="text">
<string>Only available in FM</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QRadioButton" name="toneNone"> <widget class="QRadioButton" name="toneNone">
<property name="text"> <property name="text">

Wyświetl plik

@ -935,6 +935,16 @@ void rigCommander::getDuplexMode()
prepDataAndSend(payload); 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) void rigCommander::setPassband(quint16 pass)
{ {
QByteArray payload; QByteArray payload;
@ -1062,7 +1072,7 @@ void rigCommander::setTone(rptrTone_t t)
{ {
qDebug(logRig()) << "Sending TONE to secondary VFO"; qDebug(logRig()) << "Sending TONE to secondary VFO";
payload.prepend("\x29\x01"); payload.prepend("\x29\x01");
printHex(payload); //printHex(payload);
} }
prepDataAndSend(payload); prepDataAndSend(payload);
@ -1089,7 +1099,7 @@ void rigCommander::setTSQL(rptrTone_t t)
{ {
qDebug(logRig()) << "Sending TSQL to secondary VFO"; qDebug(logRig()) << "Sending TSQL to secondary VFO";
payload.prepend("\x29\x01"); payload.prepend("\x29\x01");
printHex(payload); //printHex(payload);
} }
prepDataAndSend(payload); prepDataAndSend(payload);
@ -1105,7 +1115,7 @@ void rigCommander::setDTCS(quint16 dcscode, bool tinv, bool rinv)
payload.append(denc); payload.append(denc);
//qInfo() << __func__ << "DTCS encoded payload: "; //qInfo() << __func__ << "DTCS encoded payload: ";
printHex(payload); //printHex(payload);
prepDataAndSend(payload); prepDataAndSend(payload);
} }
@ -1270,8 +1280,8 @@ void rigCommander::setRptDuplexOffset(freqt f)
QByteArray freqPayload = makeFreqPayload(f); QByteArray freqPayload = makeFreqPayload(f);
payload.append(freqPayload.mid(1, 3)); payload.append(freqPayload.mid(1, 3));
//qInfo(logRig()) << "Here is potential repeater offset setting, not sending to radio:"; //qInfo(logRig()) << "Here is potential repeater offset setting, not sending to radio:";
printHexNow(payload, logRig()); //printHexNow(payload, logRig());
QString g = getHex(payload); //QString g = getHex(payload);
//qInfo(logRig()).noquote().nospace() << g; //qInfo(logRig()).noquote().nospace() << g;
prepDataAndSend(payload); prepDataAndSend(payload);
} }
@ -1365,6 +1375,7 @@ void rigCommander::sendCW(QString textToSend)
QByteArray textData = textToSend.toLocal8Bit(); QByteArray textData = textToSend.toLocal8Bit();
unsigned char p=0; unsigned char p=0;
bool printout=false;
for(int c=0; c < textData.length(); c++) for(int c=0; c < textData.length(); c++)
{ {
p = textData.at(c); p = textData.at(c);
@ -1380,10 +1391,12 @@ void rigCommander::sendCW(QString textToSend)
// Allowed character, continue // Allowed character, continue
} else { } else {
qWarning(logRig()) << "Invalid character detected in CW message at position " << c << ", the character is " << textToSend.at(c); qWarning(logRig()) << "Invalid character detected in CW message at position " << c << ", the character is " << textToSend.at(c);
printHex(textData); printout = true;
textData[c] = 0x3F; // "?" textData[c] = 0x3F; // "?"
} }
} }
if(printout)
printHex(textData);
if(pttAllowed) if(pttAllowed)
{ {
@ -3336,7 +3349,7 @@ void rigCommander::parseWFData()
// read edge mode center in edge mode // read edge mode center in edge mode
emit haveScopeEdge((char)payloadIn[2]); emit haveScopeEdge((char)payloadIn[2]);
//qInfo(logRig()) << "Received 0x16 edge in center mode:"; //qInfo(logRig()) << "Received 0x16 edge in center mode:";
printHex(payloadIn, false, true); //printHex(payloadIn, false, true);
// [1] 0x16 // [1] 0x16
// [2] 0x01, 0x02, 0x03: Edge 1,2,3 // [2] 0x01, 0x02, 0x03: Edge 1,2,3
break; break;
@ -3520,6 +3533,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x71"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x71");
rigCaps.hasVFOMS = false; rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x30");
break; break;
case modelR8600: case modelR8600:
rigCaps.modelName = QString("IC-R8600"); rigCaps.modelName = QString("IC-R8600");
@ -3593,6 +3608,8 @@ void rigCommander::determineRigCaps()
rigCaps.hasVFOMS = true; rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasAdvancedRptrToneCmds = true; rigCaps.hasAdvancedRptrToneCmds = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x43");
break; break;
case model910h: case model910h:
rigCaps.modelName = QString("IC-910H"); rigCaps.modelName = QString("IC-910H");
@ -3647,6 +3664,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x97"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x97");
rigCaps.hasVFOMS = true; rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = false; rigCaps.hasVFOAB = false;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x64");
break; break;
case model7610: case model7610:
rigCaps.modelName = QString("IC-7610"); rigCaps.modelName = QString("IC-7610");
@ -3681,6 +3700,8 @@ void rigCommander::determineRigCaps()
rigCaps.hasRXAntenna = true; rigCaps.hasRXAntenna = true;
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x12"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x12");
rigCaps.hasSpecifyMainSubCmd = true; rigCaps.hasSpecifyMainSubCmd = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x33");
rigCaps.hasVFOMS = true; rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = false; rigCaps.hasVFOAB = false;
break; break;
@ -3716,6 +3737,8 @@ void rigCommander::determineRigCaps()
rigCaps.hasRXAntenna = true; rigCaps.hasRXAntenna = true;
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x55"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x55");
rigCaps.hasSpecifyMainSubCmd = true; rigCaps.hasSpecifyMainSubCmd = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x01\x13");
rigCaps.hasVFOMS = true; rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = false; rigCaps.hasVFOAB = false;
break; break;
@ -3755,6 +3778,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x31"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x31");
rigCaps.hasVFOMS = false; rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x45");
break; break;
case model7000: case model7000:
rigCaps.modelName = QString("IC-7000"); rigCaps.modelName = QString("IC-7000");
@ -3781,6 +3806,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x92"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x92");
rigCaps.hasVFOMS = false; rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x52");
break; break;
case model7410: case model7410:
rigCaps.modelName = QString("IC-7410"); rigCaps.modelName = QString("IC-7410");
@ -3806,6 +3833,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x40"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x40");
rigCaps.hasVFOMS = false; rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x11");
break; break;
case model7100: case model7100:
rigCaps.modelName = QString("IC-7100"); rigCaps.modelName = QString("IC-7100");
@ -3837,6 +3866,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x95"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x95");
rigCaps.hasVFOMS = false; rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x15");
break; break;
case model7200: case model7200:
rigCaps.modelName = QString("IC-7200"); rigCaps.modelName = QString("IC-7200");
@ -3861,6 +3892,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x03\x48"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x03\x48");
rigCaps.hasVFOMS = false; rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x03\x18");
break; break;
case model7700: case model7700:
rigCaps.modelName = QString("IC-7700"); rigCaps.modelName = QString("IC-7700");
@ -3889,6 +3922,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x95"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x95");
rigCaps.hasVFOMS = false; rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x67");
break; break;
case model703: case model703:
rigCaps.modelName = QString("IC-703"); rigCaps.modelName = QString("IC-703");
@ -4129,6 +4164,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
rigCaps.hasVFOMS = true; rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = false; rigCaps.hasVFOAB = false;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x24");
break; break;
case model756proiii: case model756proiii:
rigCaps.modelName = QString("IC-756 Pro III"); rigCaps.modelName = QString("IC-756 Pro III");
@ -4152,6 +4189,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
rigCaps.hasVFOMS = true; rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = false; rigCaps.hasVFOAB = false;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x24");
break; break;
case model9100: case model9100:
rigCaps.modelName = QString("IC-9100"); rigCaps.modelName = QString("IC-9100");
@ -4183,6 +4222,8 @@ void rigCommander::determineRigCaps()
rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modeDV, 0x17, "DV")}); rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modeDV, 0x17, "DV")});
rigCaps.hasVFOMS = true; rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x14");
break; break;
default: default:
rigCaps.modelName = QString("IC-0x%1").arg(rigCaps.modelID, 2, 16); rigCaps.modelName = QString("IC-0x%1").arg(rigCaps.modelID, 2, 16);

Wyświetl plik

@ -137,6 +137,7 @@ public slots:
// Repeater: // Repeater:
void setDuplexMode(duplexMode dm); void setDuplexMode(duplexMode dm);
void getDuplexMode(); void getDuplexMode();
void setQuickSplit(bool qsOn);
void getTransmitFrequency(); void getTransmitFrequency();
void setTone(rptrTone_t t); void setTone(rptrTone_t t);
void setTSQL(rptrTone_t t); void setTSQL(rptrTone_t t);

Wyświetl plik

@ -153,6 +153,8 @@ struct rigCapabilities {
bool hasVFOAB = true; // 0x07 [00||01] bool hasVFOAB = true; // 0x07 [00||01]
bool hasAdvancedRptrToneCmds = false; bool hasAdvancedRptrToneCmds = false;
bool hasQuickSplitCommand = false;
QByteArray quickSplitCommand;
std::vector <unsigned char> attenuators; std::vector <unsigned char> attenuators;
std::vector <unsigned char> preamps; std::vector <unsigned char> preamps;

Wyświetl plik

@ -415,18 +415,12 @@ void wfmain::rigConnections()
} }
}); });
// How to understand the reply of getToneEnabled, getTSQLEnabled connect(this->rpt, &repeaterSetup::setQuickSplit,
// ...... [=](const bool &qsEnabled) {
// it's currently only read into rigState. issueCmd(cmdSetQuickSplit, qsEnabled);
// 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, SIGNAL(setQuickSplit(bool)), rig, SLOT(setQuickSplit(bool)));
//connect(rpt, SIGNAL(setRptAccessMode(rptAccessTxRx)), rig, SLOT(setRptAccessMode(rptAccessTxRx)));
connect(this->rpt, &repeaterSetup::setRptAccessMode, connect(this->rpt, &repeaterSetup::setRptAccessMode,
[=](const rptrAccessData_t &rd) { [=](const rptrAccessData_t &rd) {
@ -453,7 +447,7 @@ void wfmain::rigConnections()
connect(this, SIGNAL(getTSQLEnabled()), rig, SLOT(getToneSqlEnabled())); connect(this, SIGNAL(getTSQLEnabled()), rig, SLOT(getToneSqlEnabled()));
connect(this->rpt, &repeaterSetup::setTransmitFrequency, connect(this->rpt, &repeaterSetup::setTransmitFrequency,
[=](const freqt &transmitFreq) { issueCmd(cmdSetFreq, transmitFreq);}); [=](const freqt &transmitFreq) { issueCmdUniquePriority(cmdSetFreq, transmitFreq);});
connect(this->rpt, &repeaterSetup::setTransmitMode, connect(this->rpt, &repeaterSetup::setTransmitMode,
[=](const mode_info &transmitMode) { issueCmd(cmdSetMode, transmitMode);}); [=](const mode_info &transmitMode) { issueCmd(cmdSetMode, transmitMode);});
connect(this->rpt, &repeaterSetup::selectVFO, connect(this->rpt, &repeaterSetup::selectVFO,
@ -3823,6 +3817,12 @@ void wfmain::doCmd(commandtype cmddata)
emit setRptDuplexOffset(f); emit setRptDuplexOffset(f);
break; break;
} }
case cmdSetQuickSplit:
{
bool qsEnabled = (*std::static_pointer_cast<bool>(data));
emit setQuickSplit(qsEnabled);
break;
}
case cmdSetPTT: case cmdSetPTT:
{ {
bool pttrequest = (*std::static_pointer_cast<bool>(data)); bool pttrequest = (*std::static_pointer_cast<bool>(data));

Wyświetl plik

@ -111,6 +111,7 @@ signals:
// Repeater: // Repeater:
void getDuplexMode(); void getDuplexMode();
void setQuickSplit(bool qsOn);
void getTone(); void getTone();
void getTSQL(); void getTSQL();
void getDTCS(); void getDTCS();

Wyświetl plik

@ -164,7 +164,7 @@ enum cmds {
cmdGetTone, cmdGetTSQL, cmdGetToneEnabled, cmdGetTSQLEnabled, cmdGetDTCS, cmdGetTone, cmdGetTSQL, cmdGetToneEnabled, cmdGetTSQLEnabled, cmdGetDTCS,
cmdSetToneEnabled, cmdSetTSQLEnabled, cmdGetRptAccessMode, cmdSetTone, cmdSetTSQL, cmdSetToneEnabled, cmdSetTSQLEnabled, cmdGetRptAccessMode, cmdSetTone, cmdSetTSQL,
cmdSetRptAccessMode, cmdSetRptDuplexOffset, cmdGetRptDuplexOffset, cmdSetRptAccessMode, cmdSetRptDuplexOffset, cmdGetRptDuplexOffset,
cmdSelVFO, cmdVFOSwap, cmdVFOEqualAB, cmdVFOEqualMS, cmdSelVFO, cmdVFOSwap, cmdVFOEqualAB, cmdVFOEqualMS, cmdSetQuickSplit,
cmdGetPreamp, cmdGetAttenuator, cmdGetAntenna, cmdGetPreamp, cmdGetAttenuator, cmdGetAntenna,
cmdGetBandStackReg, cmdGetKeySpeed, cmdSetKeySpeed, cmdGetBreakMode, cmdSetBreakMode, cmdSendCW, cmdStopCW, cmdGetBandStackReg, cmdGetKeySpeed, cmdSetKeySpeed, cmdGetBreakMode, cmdSetBreakMode, cmdSendCW, cmdStopCW,
cmdSetTime, cmdSetDate, cmdSetUTCOffset, cmdSetTime, cmdSetDate, cmdSetUTCOffset,