Merge branch 'morecontrols' into band-switching

failbranch
Phil Taylor 2023-02-01 09:42:09 +00:00
commit 180b7b0095
11 zmienionych plików z 272 dodań i 66 usunięć

Wyświetl plik

@ -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)
{

Wyświetl plik

@ -45,7 +45,7 @@ private slots:
void on_stopBtn_clicked();
void on_textToSendEdit_returnPressed();
//void on_textToSendEdit_returnPressed();
void on_breakinCombo_activated(int index);

Wyświetl plik

@ -313,25 +313,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)
@ -480,11 +498,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 +607,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 +818,12 @@ void repeaterSetup::on_rptrOffsetEdit_returnPressed()
{
this->on_rptrOffsetSetBtn_clicked();
}
void repeaterSetup::on_setSplitRptrToneChk_clicked(bool checked)
{
if(checked)
{
on_setRptrSubVFOBtn_clicked();
on_setToneSubVFOBtn_clicked();
}
}

Wyświetl plik

@ -65,10 +65,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 +106,8 @@ private slots:
void on_splitTransmitFreqEdit_returnPressed();
void on_setSplitRptrToneChk_clicked(bool checked);
private:
Ui::repeaterSetup *ui;
freqt currentMainFrequency;

Wyświetl plik

@ -1206,10 +1206,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");
}
@ -2888,6 +2934,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 +2957,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);
@ -3531,6 +3592,7 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x27");
rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = true;
rigCaps.hasAdvancedRptrToneCmds = true;
break;
case model910h:
rigCaps.modelName = QString("IC-910H");
@ -4244,6 +4306,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 +4847,7 @@ void rigCommander::setToneSql(bool enabled)
prepDataAndSend(payload);
}
void rigCommander::getToneSql()
void rigCommander::getToneSqlEnabled()
{
QByteArray payload;
payload.setRawData("\x16\x43", 2);
@ -5152,7 +5225,7 @@ void rigCommander::stateUpdated()
if (i.value()._valid) {
setToneSql(state.getBool(TSQLFUNC));
}
getToneSql();
getToneSqlEnabled();
break;
case COMPFUNC:
if (i.value()._valid) {

Wyświetl plik

@ -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);
@ -291,6 +291,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 +458,7 @@ private:
quint16 spectAmpMax;
quint16 spectLenMax;
spectrumMode oldScopeMode;
bool wasOutOfRange = false;
bool usingNativeLAN; // indicates using OEM LAN connection (705,7610,9700,7850)
bool lookingForRig;

Wyświetl plik

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

Wyświetl plik

@ -389,6 +389,8 @@ void wfmain::rigConnections()
connect(rig, SIGNAL(haveDuplexMode(duplexMode)), rpt, SLOT(receiveDuplexMode(duplexMode)));
connect(this, SIGNAL(getRptDuplexOffset()), rig, SLOT(getRptDuplexOffset()));
connect(rig, SIGNAL(haveRptOffsetFrequency(freqt)), rpt, SLOT(handleRptOffsetFrequency(freqt)));
// These are the current tone frequency or DCS code selected:
connect(rpt, SIGNAL(getTone()), rig, SLOT(getTone()));
connect(rpt, SIGNAL(getTSQL()), rig, SLOT(getTSQL()));
connect(rpt, SIGNAL(getDTCS()), rig, SLOT(getDTCS()));
@ -399,13 +401,38 @@ void wfmain::rigConnections()
connect(this->rpt, &repeaterSetup::setTSQL,
[=](const rptrTone_t &t) { issueCmd(cmdSetTSQL, t);});
// TODO: struct with the DCS components and command queue entry
connect(rpt, SIGNAL(setDTCS(quint16,bool,bool)), rig, SLOT(setDTCS(quint16,bool,bool)));
connect(rpt, SIGNAL(getRptAccessMode()), rig, SLOT(getRptAccessMode()));
//connect(rpt, SIGNAL(getRptAccessMode()), rig, SLOT(getRptAccessMode()));
connect(this->rpt, &repeaterSetup::getRptAccessMode,
[=]() {
if(rigCaps.hasAdvancedRptrToneCmds) {
issueDelayedCommand(cmdGetRptAccessMode);
} else {
issueDelayedCommand(cmdGetToneEnabled);
issueDelayedCommand(cmdGetTSQLEnabled);
}
});
// 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(rpt, SIGNAL(setRptAccessMode(rptAccessTxRx)), rig, SLOT(setRptAccessMode(rptAccessTxRx)));
connect(this->rpt, &repeaterSetup::setRptAccessMode,
[=](const rptrAccessData_t &rd) { issueCmd(cmdSetRptAccessMode, rd);});
[=](const rptrAccessData_t &rd) {
issueCmd(cmdSetRptAccessMode, rd);
});
connect(this, SIGNAL(setRepeaterAccessMode(rptrAccessData_t)), rig, SLOT(setRptAccessMode(rptrAccessData_t)));
connect(this, SIGNAL(setTone(rptrTone_t)), rig, SLOT(setTone(rptrTone_t)));
@ -422,6 +449,9 @@ void wfmain::rigConnections()
this->splitModeEnabled = false;
});
connect(this, SIGNAL(getToneEnabled()), rig, SLOT(getToneEnabled()));
connect(this, SIGNAL(getTSQLEnabled()), rig, SLOT(getToneSqlEnabled()));
connect(this->rpt, &repeaterSetup::setTransmitFrequency,
[=](const freqt &transmitFreq) { issueCmd(cmdSetFreq, transmitFreq);});
connect(this->rpt, &repeaterSetup::setTransmitMode,
@ -457,6 +487,7 @@ void wfmain::rigConnections()
connect(rig, SIGNAL(haveSpectrumData(QByteArray, double, double)), this, SLOT(receiveSpectrumData(QByteArray, double, double)));
connect(rig, SIGNAL(haveSpectrumMode(spectrumMode)), this, SLOT(receiveSpectrumMode(spectrumMode)));
connect(rig, SIGNAL(haveScopeOutOfRange(bool)), this, SLOT(handleScopeOutOfRange(bool)));
connect(this, SIGNAL(setScopeMode(spectrumMode)), rig, SLOT(setSpectrumMode(spectrumMode)));
connect(this, SIGNAL(getScopeMode()), rig, SLOT(getScopeMode()));
@ -3445,7 +3476,11 @@ void wfmain:: getInitialRigState()
{
issueDelayedCommand(cmdGetDTCS);
}
issueDelayedCommand(cmdGetRptAccessMode);
if(rigCaps.hasCTCSS || rigCaps.hasDTCS)
{
issueDelayedCommand(cmdGetRptAccessMode);
}
if(rigCaps.hasAntennaSel)
{
@ -3745,7 +3780,43 @@ void wfmain::doCmd(commandtype cmddata)
case cmdSetRptAccessMode:
{
rptrAccessData_t rd = (*std::static_pointer_cast<rptrAccessData_t>(data));
if(rd.accessMode==ratrNN && !rigCaps.hasAdvancedRptrToneCmds)
{
rd.usingSequence = true;
switch(rd.sequence)
{
case 0:
rd.turnOffTone = true;
rd.turnOffTSQL = false;
break;
case 1:
rd.turnOffTSQL = true;
rd.turnOffTone = false;
break;
default:
break;
}
}
emit setRepeaterAccessMode(rd);
rd.sequence++;
if(rd.sequence == 1)
issueCmd(cmdSetRptAccessMode, rd);
break;
}
case cmdSetToneEnabled:
{
// This command is not aware of which VFO to use
bool toneEnabled = (*std::static_pointer_cast<bool>(data));
emit setToneEnabled(toneEnabled);
break;
}
case cmdSetTSQLEnabled:
{
// This command is not aware of which VFO to use
bool toneEnabled = (*std::static_pointer_cast<bool>(data));
emit setTSQLEnabled(toneEnabled);
break;
}
case cmdSetRptDuplexOffset:
@ -3950,7 +4021,19 @@ void wfmain::doCmd(cmds cmd)
emit getDTCS();
break;
case cmdGetRptAccessMode:
emit getRptAccessMode();
if(rigCaps.hasAdvancedRptrToneCmds) {
emit getRptAccessMode();
} else {
// Get both TONE and TSQL enabled status
emit getToneEnabled();
issueDelayedCommand(cmdGetTSQLEnabled);
}
break;
case cmdGetToneEnabled:
emit getToneEnabled();
break;
case cmdGetTSQLEnabled:
emit getTSQLEnabled();
break;
case cmdDispEnable:
emit scopeDisplayEnable();
@ -5087,6 +5170,17 @@ void wfmain::receiveSpectrumMode(spectrumMode spectMode)
setUISpectrumControlsToMode(spectMode);
}
void wfmain::handleScopeOutOfRange(bool outOfRange)
{
if(outOfRange)
{
ui->scopeOutOfRangeLabel->setText("OUT OF RANGE");
ui->scopeOutOfRangeLabel->setStyleSheet("QLabel { background-color : red; color : blue; }");
} else {
ui->scopeOutOfRangeLabel->setText("");
ui->scopeOutOfRangeLabel->setStyleSheet("");
}
}
void wfmain::handlePlotDoubleClick(QMouseEvent *me)
{
@ -7822,8 +7916,8 @@ void wfmain::on_underlayAverageBuffer_toggled(bool checked)
void wfmain::on_debugBtn_clicked()
{
qInfo(logSystem()) << "Debug button pressed.";
qDebug(logSystem()) << "Query for repeater duplex offset 0x0C headed out";
issueDelayedCommand(cmdGetRptDuplexOffset);
qDebug(logSystem()) << "Query for repeater access mode (tone, tsql, etc) sent.";
issueDelayedCommand(cmdGetRptAccessMode);
}
// ---------- color helper functions: ---------- //

Wyświetl plik

@ -118,6 +118,10 @@ signals:
void setRepeaterAccessMode(rptrAccessData_t rd);
void setTone(rptrTone_t t);
void setTSQL(rptrTone_t t);
void getToneEnabled();
void getTSQLEnabled();
void setToneEnabled(bool enabled);
void setTSQLEnabled(bool enabled);
void setRptDuplexOffset(freqt f);
void getRptDuplexOffset();
@ -281,6 +285,7 @@ private slots:
void receiveSpectrumData(QByteArray spectrum, double startFreq, double endFreq);
void receiveSpectrumMode(spectrumMode spectMode);
void receiveSpectrumSpan(freqt freqspan, bool isSub);
void handleScopeOutOfRange(bool outOfRange);
void receivePTTstatus(bool pttOn);
void receiveDataModeStatus(bool dataOn);
void receiveBandStackReg(freqt f, char mode, char filter, bool dataOn); // freq, mode, (filter,) datamode

Wyświetl plik

@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>1012</width>
<width>1042</width>
<height>660</height>
</rect>
</property>
@ -18,7 +18,7 @@
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>3</number>
<number>0</number>
</property>
<widget class="QWidget" name="mainTab">
<attribute name="title">
@ -117,6 +117,19 @@
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="scopeOutOfRangeLabel">
<property name="minimumSize">
<size>
<width>5</width>
<height>0</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="customEdgeBtn">
<property name="toolTip">
@ -1808,6 +1821,7 @@
<font>
<family>DejaVu Sans Mono</family>
<pointsize>14</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -3430,8 +3444,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>790</width>
<height>302</height>
<width>570</width>
<height>224</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_2">
@ -5441,6 +5455,7 @@
<widget class="QPushButton" name="exitBtn">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
@ -5459,8 +5474,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>1012</width>
<height>22</height>
<width>1042</width>
<height>21</height>
</rect>
</property>
</widget>
@ -5488,7 +5503,7 @@
<connections/>
<buttongroups>
<buttongroup name="buttonGroup"/>
<buttongroup name="pollingButtonGroup"/>
<buttongroup name="underlayButtonGroup"/>
<buttongroup name="pollingButtonGroup"/>
</buttongroups>
</ui>

Wyświetl plik

@ -98,12 +98,20 @@ enum rptAccessTxRx {
ratrDN=0x06, // "DTCS(T)"
ratrTD=0x07, // "TONE(T) / TSQL(R)"
ratrDT=0x08, // "DTCS(T) / TSQL(R)"
ratrTT=0x09 // "TONE(T) / TSQL(R)"
ratrTT=0x09, // "TONE(T) / TSQL(R)"
ratrTONEoff,
ratrTONEon,
ratrTSQLoff,
ratrTSQLon
};
struct rptrAccessData_t {
rptAccessTxRx accessMode = ratrNN;
bool useSecondaryVFO = false;
bool turnOffTone = false;
bool turnOffTSQL = false;
bool usingSequence = false;
int sequence = 0;
};
struct mode_info {
@ -153,7 +161,9 @@ enum cmds {
cmdGetCurrentModLevel, cmdStartRegularPolling, cmdStopRegularPolling, cmdQueNormalSpeed,
cmdGetVdMeter, cmdGetIdMeter, cmdGetSMeter, cmdGetCenterMeter, cmdGetPowerMeter,
cmdGetSWRMeter, cmdGetALCMeter, cmdGetCompMeter, cmdGetTxRxMeter,
cmdGetTone, cmdGetTSQL, cmdGetDTCS, cmdGetRptAccessMode, cmdSetTone, cmdSetTSQL, cmdSetRptAccessMode, cmdSetRptDuplexOffset, cmdGetRptDuplexOffset,
cmdGetTone, cmdGetTSQL, cmdGetToneEnabled, cmdGetTSQLEnabled, cmdGetDTCS,
cmdSetToneEnabled, cmdSetTSQLEnabled, cmdGetRptAccessMode, cmdSetTone, cmdSetTSQL,
cmdSetRptAccessMode, cmdSetRptDuplexOffset, cmdGetRptDuplexOffset,
cmdSelVFO, cmdVFOSwap, cmdVFOEqualAB, cmdVFOEqualMS,
cmdGetPreamp, cmdGetAttenuator, cmdGetAntenna,
cmdGetBandStackReg, cmdGetKeySpeed, cmdSetKeySpeed, cmdGetBreakMode, cmdSetBreakMode, cmdSendCW, cmdStopCW,