diff --git a/freqmemory.h b/freqmemory.h index 58f8c7e..e7ccf76 100644 --- a/freqmemory.h +++ b/freqmemory.h @@ -4,13 +4,6 @@ #include #include "wfviewtypes.h" -struct mode_info { - mode_kind mk; - unsigned char reg; - unsigned char filter; - QString name; -}; - struct preset_kind { // QString name; // QString comment; diff --git a/repeatersetup.cpp b/repeatersetup.cpp index 2e4c9e9..58c148d 100644 --- a/repeatersetup.cpp +++ b/repeatersetup.cpp @@ -16,9 +16,11 @@ repeaterSetup::repeaterSetup(QWidget *parent) : #ifdef QT_DEBUG ui->debugBtn->setVisible(true); ui->rptReadRigBtn->setVisible(true); + ui->rptOffsetBtn->setVisible(true); #else ui->debugBtn->setVisible(false); ui->rptReadRigBtn->setVisible(false); + ui->rptOffsetBtn->setVisible(false); #endif } @@ -235,21 +237,39 @@ void repeaterSetup::populateDTCS() void repeaterSetup::receiveDuplexMode(duplexMode dm) { currentdm = dm; + ui->splitEnableChk->blockSignals(true); switch(dm) { - case dmSimplex: case dmSplitOff: + ui->splitEnableChk->setChecked(false); + ui->autoTrackLiveBtn->setChecked(false); + break; + case dmSplitOn: + ui->splitEnableChk->setChecked(true); + ui->rptSimplexBtn->setChecked(false); + ui->rptDupPlusBtn->setChecked(false); + ui->rptDupMinusBtn->setChecked(false); + break; + case dmSimplex: ui->rptSimplexBtn->setChecked(true); + ui->splitEnableChk->setChecked(false); + ui->autoTrackLiveBtn->setChecked(false); break; case dmDupPlus: ui->rptDupPlusBtn->setChecked(true); + ui->splitEnableChk->setChecked(false); + ui->autoTrackLiveBtn->setChecked(false); break; case dmDupMinus: ui->rptDupMinusBtn->setChecked(true); + ui->splitEnableChk->setChecked(false); + ui->autoTrackLiveBtn->setChecked(false); break; default: + qDebug() << "Did not understand duplex/split/repeater value of " << (unsigned char)dm; break; } + ui->splitEnableChk->blockSignals(false); } void repeaterSetup::handleRptAccessMode(rptAccessTxRx tmode) @@ -298,12 +318,14 @@ void repeaterSetup::handleDTCS(quint16 dcode, bool tinv, bool rinv) void repeaterSetup::handleUpdateCurrentMainFrequency(freqt mainfreq) { + if(amTransmitting) + return; - this->currentMainFrequency = mainfreq; - if(ui->autoTrackLiveBtn->isChecked() && !ui->splitOffsetEdit->text.isEmpty()) + if(ui->autoTrackLiveBtn->isChecked() && !ui->splitOffsetEdit->text().isEmpty()) { if(currentMainFrequency.Hz != mainfreq.Hz) { + this->currentMainFrequency = mainfreq; if(usedPlusSplit) { on_splitPlusButton_clicked(); @@ -312,13 +334,26 @@ void repeaterSetup::handleUpdateCurrentMainFrequency(freqt mainfreq) } } } + this->currentMainFrequency = mainfreq; } void repeaterSetup::handleUpdateCurrentMainMode(mode_info m) { // Used to set the secondary VFO to the same mode // (generally FM) - this->currentMode = m; + // NB: We don't accept values during transmit as they + // may represent the inactive VFO + if(!amTransmitting) + { + this->currentModeMain = m; + this->modeTransmitVFO = m; + this->modeTransmitVFO.VFO = inactiveVFO; + } +} + +void repeaterSetup::handleTransmitStatus(bool amTransmitting) +{ + this->amTransmitting = amTransmitting; } void repeaterSetup::showEvent(QShowEvent *event) @@ -437,8 +472,16 @@ void repeaterSetup::on_splitOffsetSetBtn_clicked() void repeaterSetup::on_splitEnableChk_clicked(bool enabled) { - emit setSplitModeEnabled(enabled); - ui->autoTrackLiveBtn->setChecked(!enabled); + if(enabled) + { + emit setDuplexMode(dmSplitOn); + } else { + emit setDuplexMode(dmSplitOff); + } + if(ui->autoTrackLiveBtn->isChecked()) + { + ui->autoTrackLiveBtn->setChecked(false); + } } quint64 repeaterSetup::getFreqHzFromKHzString(QString khz) @@ -446,7 +489,6 @@ quint64 repeaterSetup::getFreqHzFromKHzString(QString khz) // This function takes a string containing a number in KHz, // and creates an accurate quint64 in Hz. quint64 fhz = 0; - bool hasDecimalPt = false; bool ok = true; if(khz.isEmpty()) { @@ -455,7 +497,6 @@ quint64 repeaterSetup::getFreqHzFromKHzString(QString khz) } if(khz.contains(".")) { - hasDecimalPt = true; // "600.245" becomes "600" khz.chop(khz.indexOf(".")); } @@ -472,7 +513,6 @@ quint64 repeaterSetup::getFreqHzFromMHzString(QString MHz) // This function takes a string containing a number in KHz, // and creates an accurate quint64 in Hz. quint64 fhz = 0; - bool hasDecimalPt = false; bool ok = true; if(MHz.isEmpty()) { @@ -481,14 +521,13 @@ quint64 repeaterSetup::getFreqHzFromMHzString(QString MHz) } if(MHz.contains(".")) { - hasDecimalPt = true; int decimalPtIndex = MHz.indexOf("."); // "29.623" // indexOf(".") = 2 // length = 6 // We want the right 4xx 3 characters. QString KHz = MHz.right(MHz.length() - decimalPtIndex - 1); - MHz.chop(decimalPtIndex); + MHz.chop(MHz.length() - decimalPtIndex); fhz = MHz.toUInt(&ok) * 1E6; if(!ok) goto handleError; fhz += KHz.toUInt(&ok) * 1E3; if(!ok) goto handleError; @@ -514,11 +553,12 @@ void repeaterSetup::on_splitPlusButton_clicked() { txfreqhz = currentMainFrequency.Hz + hzOffset; f.Hz = txfreqhz; - txString = QString::number(f.Hz / double(1E6), 'f', 3); + f.VFO = inactiveVFO; + txString = QString::number(f.Hz / double(1E6), 'f', 6); ui->splitTransmitFreqEdit->setText(txString); usedPlusSplit = true; emit setTransmitFrequency(f); - emit setTransmitMode(currentMode); + emit setTransmitMode(modeTransmitVFO); } } @@ -533,10 +573,12 @@ void repeaterSetup::on_splitMinusBtn_clicked() { txfreqhz = currentMainFrequency.Hz - hzOffset; f.Hz = txfreqhz; - txString = QString::number(f.Hz / double(1E6), 'f', 3); + f.VFO = inactiveVFO; + txString = QString::number(f.Hz / double(1E6), 'f', 6); + ui->splitTransmitFreqEdit->setText(txString); usedPlusSplit = false; emit setTransmitFrequency(f); - emit setTransmitMode(currentMode); + emit setTransmitMode(modeTransmitVFO); } } @@ -547,7 +589,8 @@ void repeaterSetup::on_splitTxFreqSetBtn_clicked() if(fHz) { f.Hz = fHz; + f.VFO = inactiveVFO; emit setTransmitFrequency(f); - emit setTransmitMode(currentMode); + emit setTransmitMode(modeTransmitVFO); } } diff --git a/repeatersetup.h b/repeatersetup.h index ce5b166..73c71c7 100644 --- a/repeatersetup.h +++ b/repeatersetup.h @@ -34,7 +34,8 @@ signals: // Split: void getSplitModeEnabled(); void getTransmitFrequency(); - void setSplitModeEnabled(bool splitEnabled); + // Use the duplexMode to communicate split. + // void setSplitModeEnabled(bool splitEnabled); void setTransmitFrequency(freqt transmitFreq); void setTransmitMode(mode_info m); @@ -44,10 +45,11 @@ public slots: void handleTone(quint16 tone); void handleTSQL(quint16 tsql); void handleDTCS(quint16 dcscode, bool tinv, bool rinv); - void handleSplitMode(bool splitEnabled); - void handleSplitFrequency(freqt transmitFreq); + // void handleSplitMode(bool splitEnabled); + // void handleSplitFrequency(freqt transmitFreq); void handleUpdateCurrentMainFrequency(freqt mainfreq); void handleUpdateCurrentMainMode(mode_info m); + void handleTransmitStatus(bool amTransmitting); private slots: void showEvent(QShowEvent *event); @@ -81,8 +83,10 @@ private: rigCapabilities rig; bool haveRig = false; duplexMode currentdm; - mode_info currentMode; + mode_info currentModeMain; + mode_info modeTransmitVFO; bool usedPlusSplit = false; + bool amTransmitting = false; }; #endif // REPEATERSETUP_H diff --git a/repeatersetup.ui b/repeatersetup.ui index c22b3a7..e49f2f2 100644 --- a/repeatersetup.ui +++ b/repeatersetup.ui @@ -171,14 +171,21 @@ - + + Split+ - - + Split- + + + + + + + RPT diff --git a/rigcommander.cpp b/rigcommander.cpp index 0f441e0..03ee556 100644 --- a/rigcommander.cpp +++ b/rigcommander.cpp @@ -772,8 +772,17 @@ void rigCommander::setMode(mode_info m) m.filter = '\x01'; } - payload.setRawData("\x06", 1); + if(m.VFO==inactiveVFO) + { + payload.setRawData("\x26\x01", 2); + } else { + payload.setRawData("\x06", 1); + } + payload.append(m.reg); + if(m.VFO==inactiveVFO) + payload.append("\x00", 1); + payload.append(m.filter); prepDataAndSend(payload); @@ -846,6 +855,19 @@ void rigCommander::getDataMode() prepDataAndSend(payload); } +void rigCommander::getSplit() +{ + QByteArray payload("\x0F"); + prepDataAndSend(payload); +} + +void rigCommander::setSplit(bool splitEnabled) +{ + QByteArray payload("\x0F"); + payload.append((unsigned char)splitEnabled); + prepDataAndSend(payload); +} + void rigCommander::setDuplexMode(duplexMode dm) { QByteArray payload; diff --git a/rigcommander.h b/rigcommander.h index 47d563a..df5cf0f 100644 --- a/rigcommander.h +++ b/rigcommander.h @@ -76,6 +76,8 @@ public slots: void getMode(); void setDataMode(bool dataOn, unsigned char filter); void getDataMode(); + void getSplit(); + void setSplit(bool splitEnabled); void getBandStackReg(char band, char regCode); void getRitEnabled(); void getRitValue(); @@ -362,7 +364,7 @@ private: void setup(); QByteArray stripData(const QByteArray &data, unsigned char cutPosition); void parseData(QByteArray data); // new data come here - void parseCommand(); + void parseCommand(); // Entry point for complete commands unsigned char bcdHexToUChar(unsigned char in); unsigned char bcdHexToUChar(unsigned char hundreds, unsigned char tensunits); unsigned int bcdHexToUInt(unsigned char hundreds, unsigned char tensunits); diff --git a/wfmain.cpp b/wfmain.cpp index a33f823..03c716f 100644 --- a/wfmain.cpp +++ b/wfmain.cpp @@ -388,6 +388,11 @@ void wfmain::rigConnections() connect(rig, SIGNAL(haveTSQL(quint16)), rpt, SLOT(handleTSQL(quint16))); connect(rig, SIGNAL(haveDTCS(quint16,bool,bool)), rpt, SLOT(handleDTCS(quint16,bool,bool))); connect(rig, SIGNAL(haveRptAccessMode(rptAccessTxRx)), rpt, SLOT(handleRptAccessMode(rptAccessTxRx))); + connect(this->rpt, &repeaterSetup::setTransmitFrequency, + [=](const freqt &transmitFreq) { issueCmd(cmdSetFreq, transmitFreq);}); + + connect(this->rpt, &repeaterSetup::setTransmitMode, + [=](const mode_info &transmitMode) { issueCmd(cmdSetMode, transmitMode);}); connect(this, SIGNAL(getDuplexMode()), rig, SLOT(getDuplexMode())); connect(this, SIGNAL(getPassband()), rig, SLOT(getPassband())); @@ -3589,7 +3594,7 @@ void wfmain::doCmd(commandtype cmddata) { lastFreqCmdTime_ms = QDateTime::currentMSecsSinceEpoch(); freqt f = (*std::static_pointer_cast(data)); - emit setFrequency(0,f); + emit setFrequency(f.VFO,f); break; } case cmdSetMode: @@ -4587,6 +4592,7 @@ void wfmain::receiveFreq(freqt freqStruct) { ui->freqLabel->setText(QString("%1").arg(freqStruct.MHzDouble, 0, 'f')); freq = freqStruct; + rpt->handleUpdateCurrentMainFrequency(freqStruct); } else { qDebug(logSystem()) << "Rejecting stale frequency: " << freqStruct.Hz << " Hz, delta time ms = " << tnow_ms - lastFreqCmdTime_ms\ << ", tnow_ms " << tnow_ms << ", last: " << lastFreqCmdTime_ms; @@ -4607,6 +4613,7 @@ void wfmain::receivePTTstatus(bool pttOn) pttLed->setState(QLedLabel::State::StateOk); } amTransmitting = pttOn; + rpt->handleTransmitStatus(pttOn); changeTxBtn(); } @@ -5301,6 +5308,8 @@ void wfmain::receiveMode(unsigned char mode, unsigned char filter) currentModeInfo.mk = (mode_kind)mode; currentMode = (mode_kind)mode; currentModeInfo.filter = filter; + currentModeInfo.reg = mode; + rpt->handleUpdateCurrentMainMode(currentModeInfo); if( (filter) && (filter < 4)){ ui->modeFilterCombo->blockSignals(true); diff --git a/wfviewtypes.h b/wfviewtypes.h index cdece4f..131989d 100644 --- a/wfviewtypes.h +++ b/wfviewtypes.h @@ -60,6 +60,19 @@ enum mode_kind { modeDCR }; +enum selVFO_t { + activeVFO = 0, + inactiveVFO = 1 +}; + +struct mode_info { + mode_kind mk; + unsigned char reg; + unsigned char filter; + selVFO_t VFO = activeVFO; + QString name; +}; + enum breakIn_t { brkinOff = 0x00, brkinSemi = 0x01, @@ -69,6 +82,7 @@ enum breakIn_t { struct freqt { quint64 Hz; double MHzDouble; + selVFO_t VFO = activeVFO; }; struct datekind {