Split mode is working, can also live-sync frequency and mode.

half-duplex
Elliott Liggett 2023-01-25 00:15:20 -08:00
rodzic 4fea16c356
commit be0aee6183
8 zmienionych plików z 126 dodań i 32 usunięć

Wyświetl plik

@ -4,13 +4,6 @@
#include <QDebug> #include <QDebug>
#include "wfviewtypes.h" #include "wfviewtypes.h"
struct mode_info {
mode_kind mk;
unsigned char reg;
unsigned char filter;
QString name;
};
struct preset_kind { struct preset_kind {
// QString name; // QString name;
// QString comment; // QString comment;

Wyświetl plik

@ -16,9 +16,11 @@ repeaterSetup::repeaterSetup(QWidget *parent) :
#ifdef QT_DEBUG #ifdef QT_DEBUG
ui->debugBtn->setVisible(true); ui->debugBtn->setVisible(true);
ui->rptReadRigBtn->setVisible(true); ui->rptReadRigBtn->setVisible(true);
ui->rptOffsetBtn->setVisible(true);
#else #else
ui->debugBtn->setVisible(false); ui->debugBtn->setVisible(false);
ui->rptReadRigBtn->setVisible(false); ui->rptReadRigBtn->setVisible(false);
ui->rptOffsetBtn->setVisible(false);
#endif #endif
} }
@ -235,21 +237,39 @@ void repeaterSetup::populateDTCS()
void repeaterSetup::receiveDuplexMode(duplexMode dm) void repeaterSetup::receiveDuplexMode(duplexMode dm)
{ {
currentdm = dm; currentdm = dm;
ui->splitEnableChk->blockSignals(true);
switch(dm) switch(dm)
{ {
case dmSimplex:
case dmSplitOff: 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->rptSimplexBtn->setChecked(true);
ui->splitEnableChk->setChecked(false);
ui->autoTrackLiveBtn->setChecked(false);
break; break;
case dmDupPlus: case dmDupPlus:
ui->rptDupPlusBtn->setChecked(true); ui->rptDupPlusBtn->setChecked(true);
ui->splitEnableChk->setChecked(false);
ui->autoTrackLiveBtn->setChecked(false);
break; break;
case dmDupMinus: case dmDupMinus:
ui->rptDupMinusBtn->setChecked(true); ui->rptDupMinusBtn->setChecked(true);
ui->splitEnableChk->setChecked(false);
ui->autoTrackLiveBtn->setChecked(false);
break; break;
default: default:
qDebug() << "Did not understand duplex/split/repeater value of " << (unsigned char)dm;
break; break;
} }
ui->splitEnableChk->blockSignals(false);
} }
void repeaterSetup::handleRptAccessMode(rptAccessTxRx tmode) void repeaterSetup::handleRptAccessMode(rptAccessTxRx tmode)
@ -298,12 +318,14 @@ void repeaterSetup::handleDTCS(quint16 dcode, bool tinv, bool rinv)
void repeaterSetup::handleUpdateCurrentMainFrequency(freqt mainfreq) 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) if(currentMainFrequency.Hz != mainfreq.Hz)
{ {
this->currentMainFrequency = mainfreq;
if(usedPlusSplit) if(usedPlusSplit)
{ {
on_splitPlusButton_clicked(); on_splitPlusButton_clicked();
@ -312,13 +334,26 @@ void repeaterSetup::handleUpdateCurrentMainFrequency(freqt mainfreq)
} }
} }
} }
this->currentMainFrequency = mainfreq;
} }
void repeaterSetup::handleUpdateCurrentMainMode(mode_info m) void repeaterSetup::handleUpdateCurrentMainMode(mode_info m)
{ {
// Used to set the secondary VFO to the same mode // Used to set the secondary VFO to the same mode
// (generally FM) // (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) void repeaterSetup::showEvent(QShowEvent *event)
@ -437,8 +472,16 @@ void repeaterSetup::on_splitOffsetSetBtn_clicked()
void repeaterSetup::on_splitEnableChk_clicked(bool enabled) void repeaterSetup::on_splitEnableChk_clicked(bool enabled)
{ {
emit setSplitModeEnabled(enabled); if(enabled)
ui->autoTrackLiveBtn->setChecked(!enabled); {
emit setDuplexMode(dmSplitOn);
} else {
emit setDuplexMode(dmSplitOff);
}
if(ui->autoTrackLiveBtn->isChecked())
{
ui->autoTrackLiveBtn->setChecked(false);
}
} }
quint64 repeaterSetup::getFreqHzFromKHzString(QString khz) quint64 repeaterSetup::getFreqHzFromKHzString(QString khz)
@ -446,7 +489,6 @@ quint64 repeaterSetup::getFreqHzFromKHzString(QString khz)
// This function takes a string containing a number in KHz, // This function takes a string containing a number in KHz,
// and creates an accurate quint64 in Hz. // and creates an accurate quint64 in Hz.
quint64 fhz = 0; quint64 fhz = 0;
bool hasDecimalPt = false;
bool ok = true; bool ok = true;
if(khz.isEmpty()) if(khz.isEmpty())
{ {
@ -455,7 +497,6 @@ quint64 repeaterSetup::getFreqHzFromKHzString(QString khz)
} }
if(khz.contains(".")) if(khz.contains("."))
{ {
hasDecimalPt = true;
// "600.245" becomes "600" // "600.245" becomes "600"
khz.chop(khz.indexOf(".")); khz.chop(khz.indexOf("."));
} }
@ -472,7 +513,6 @@ quint64 repeaterSetup::getFreqHzFromMHzString(QString MHz)
// This function takes a string containing a number in KHz, // This function takes a string containing a number in KHz,
// and creates an accurate quint64 in Hz. // and creates an accurate quint64 in Hz.
quint64 fhz = 0; quint64 fhz = 0;
bool hasDecimalPt = false;
bool ok = true; bool ok = true;
if(MHz.isEmpty()) if(MHz.isEmpty())
{ {
@ -481,14 +521,13 @@ quint64 repeaterSetup::getFreqHzFromMHzString(QString MHz)
} }
if(MHz.contains(".")) if(MHz.contains("."))
{ {
hasDecimalPt = true;
int decimalPtIndex = MHz.indexOf("."); int decimalPtIndex = MHz.indexOf(".");
// "29.623" // "29.623"
// indexOf(".") = 2 // indexOf(".") = 2
// length = 6 // length = 6
// We want the right 4xx 3 characters. // We want the right 4xx 3 characters.
QString KHz = MHz.right(MHz.length() - decimalPtIndex - 1); 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 = MHz.toUInt(&ok) * 1E6; if(!ok) goto handleError;
fhz += KHz.toUInt(&ok) * 1E3; 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; txfreqhz = currentMainFrequency.Hz + hzOffset;
f.Hz = txfreqhz; 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); ui->splitTransmitFreqEdit->setText(txString);
usedPlusSplit = true; usedPlusSplit = true;
emit setTransmitFrequency(f); emit setTransmitFrequency(f);
emit setTransmitMode(currentMode); emit setTransmitMode(modeTransmitVFO);
} }
} }
@ -533,10 +573,12 @@ void repeaterSetup::on_splitMinusBtn_clicked()
{ {
txfreqhz = currentMainFrequency.Hz - hzOffset; txfreqhz = currentMainFrequency.Hz - hzOffset;
f.Hz = txfreqhz; 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; usedPlusSplit = false;
emit setTransmitFrequency(f); emit setTransmitFrequency(f);
emit setTransmitMode(currentMode); emit setTransmitMode(modeTransmitVFO);
} }
} }
@ -547,7 +589,8 @@ void repeaterSetup::on_splitTxFreqSetBtn_clicked()
if(fHz) if(fHz)
{ {
f.Hz = fHz; f.Hz = fHz;
f.VFO = inactiveVFO;
emit setTransmitFrequency(f); emit setTransmitFrequency(f);
emit setTransmitMode(currentMode); emit setTransmitMode(modeTransmitVFO);
} }
} }

Wyświetl plik

@ -34,7 +34,8 @@ signals:
// Split: // Split:
void getSplitModeEnabled(); void getSplitModeEnabled();
void getTransmitFrequency(); void getTransmitFrequency();
void setSplitModeEnabled(bool splitEnabled); // Use the duplexMode to communicate split.
// void setSplitModeEnabled(bool splitEnabled);
void setTransmitFrequency(freqt transmitFreq); void setTransmitFrequency(freqt transmitFreq);
void setTransmitMode(mode_info m); void setTransmitMode(mode_info m);
@ -44,10 +45,11 @@ public slots:
void handleTone(quint16 tone); void handleTone(quint16 tone);
void handleTSQL(quint16 tsql); void handleTSQL(quint16 tsql);
void handleDTCS(quint16 dcscode, bool tinv, bool rinv); void handleDTCS(quint16 dcscode, bool tinv, bool rinv);
void handleSplitMode(bool splitEnabled); // void handleSplitMode(bool splitEnabled);
void handleSplitFrequency(freqt transmitFreq); // void handleSplitFrequency(freqt transmitFreq);
void handleUpdateCurrentMainFrequency(freqt mainfreq); void handleUpdateCurrentMainFrequency(freqt mainfreq);
void handleUpdateCurrentMainMode(mode_info m); void handleUpdateCurrentMainMode(mode_info m);
void handleTransmitStatus(bool amTransmitting);
private slots: private slots:
void showEvent(QShowEvent *event); void showEvent(QShowEvent *event);
@ -81,8 +83,10 @@ private:
rigCapabilities rig; rigCapabilities rig;
bool haveRig = false; bool haveRig = false;
duplexMode currentdm; duplexMode currentdm;
mode_info currentMode; mode_info currentModeMain;
mode_info modeTransmitVFO;
bool usedPlusSplit = false; bool usedPlusSplit = false;
bool amTransmitting = false;
}; };
#endif // REPEATERSETUP_H #endif // REPEATERSETUP_H

Wyświetl plik

@ -171,14 +171,21 @@
<item> <item>
<widget class="QPushButton" name="splitPlusButton"> <widget class="QPushButton" name="splitPlusButton">
<property name="text"> <property name="text">
<string>+</string> <string>Split+</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="splitMinusBtn"> <widget class="QPushButton" name="splitMinusBtn">
<property name="text"> <property name="text">
<string>-</string> <string>Split-</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="rptOffsetBtn">
<property name="text">
<string>RPT</string>
</property> </property>
</widget> </widget>
</item> </item>

Wyświetl plik

@ -772,8 +772,17 @@ void rigCommander::setMode(mode_info m)
m.filter = '\x01'; 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); payload.append(m.reg);
if(m.VFO==inactiveVFO)
payload.append("\x00", 1);
payload.append(m.filter); payload.append(m.filter);
prepDataAndSend(payload); prepDataAndSend(payload);
@ -846,6 +855,19 @@ void rigCommander::getDataMode()
prepDataAndSend(payload); 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) void rigCommander::setDuplexMode(duplexMode dm)
{ {
QByteArray payload; QByteArray payload;

Wyświetl plik

@ -76,6 +76,8 @@ public slots:
void getMode(); void getMode();
void setDataMode(bool dataOn, unsigned char filter); void setDataMode(bool dataOn, unsigned char filter);
void getDataMode(); void getDataMode();
void getSplit();
void setSplit(bool splitEnabled);
void getBandStackReg(char band, char regCode); void getBandStackReg(char band, char regCode);
void getRitEnabled(); void getRitEnabled();
void getRitValue(); void getRitValue();
@ -362,7 +364,7 @@ private:
void setup(); void setup();
QByteArray stripData(const QByteArray &data, unsigned char cutPosition); QByteArray stripData(const QByteArray &data, unsigned char cutPosition);
void parseData(QByteArray data); // new data come here 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 in);
unsigned char bcdHexToUChar(unsigned char hundreds, unsigned char tensunits); unsigned char bcdHexToUChar(unsigned char hundreds, unsigned char tensunits);
unsigned int bcdHexToUInt(unsigned char hundreds, unsigned char tensunits); unsigned int bcdHexToUInt(unsigned char hundreds, unsigned char tensunits);

Wyświetl plik

@ -388,6 +388,11 @@ void wfmain::rigConnections()
connect(rig, SIGNAL(haveTSQL(quint16)), rpt, SLOT(handleTSQL(quint16))); 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(haveDTCS(quint16,bool,bool)), rpt, SLOT(handleDTCS(quint16,bool,bool)));
connect(rig, SIGNAL(haveRptAccessMode(rptAccessTxRx)), rpt, SLOT(handleRptAccessMode(rptAccessTxRx))); 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(getDuplexMode()), rig, SLOT(getDuplexMode()));
connect(this, SIGNAL(getPassband()), rig, SLOT(getPassband())); connect(this, SIGNAL(getPassband()), rig, SLOT(getPassband()));
@ -3589,7 +3594,7 @@ void wfmain::doCmd(commandtype cmddata)
{ {
lastFreqCmdTime_ms = QDateTime::currentMSecsSinceEpoch(); lastFreqCmdTime_ms = QDateTime::currentMSecsSinceEpoch();
freqt f = (*std::static_pointer_cast<freqt>(data)); freqt f = (*std::static_pointer_cast<freqt>(data));
emit setFrequency(0,f); emit setFrequency(f.VFO,f);
break; break;
} }
case cmdSetMode: case cmdSetMode:
@ -4587,6 +4592,7 @@ void wfmain::receiveFreq(freqt freqStruct)
{ {
ui->freqLabel->setText(QString("%1").arg(freqStruct.MHzDouble, 0, 'f')); ui->freqLabel->setText(QString("%1").arg(freqStruct.MHzDouble, 0, 'f'));
freq = freqStruct; freq = freqStruct;
rpt->handleUpdateCurrentMainFrequency(freqStruct);
} else { } else {
qDebug(logSystem()) << "Rejecting stale frequency: " << freqStruct.Hz << " Hz, delta time ms = " << tnow_ms - lastFreqCmdTime_ms\ qDebug(logSystem()) << "Rejecting stale frequency: " << freqStruct.Hz << " Hz, delta time ms = " << tnow_ms - lastFreqCmdTime_ms\
<< ", tnow_ms " << tnow_ms << ", last: " << lastFreqCmdTime_ms; << ", tnow_ms " << tnow_ms << ", last: " << lastFreqCmdTime_ms;
@ -4607,6 +4613,7 @@ void wfmain::receivePTTstatus(bool pttOn)
pttLed->setState(QLedLabel::State::StateOk); pttLed->setState(QLedLabel::State::StateOk);
} }
amTransmitting = pttOn; amTransmitting = pttOn;
rpt->handleTransmitStatus(pttOn);
changeTxBtn(); changeTxBtn();
} }
@ -5301,6 +5308,8 @@ void wfmain::receiveMode(unsigned char mode, unsigned char filter)
currentModeInfo.mk = (mode_kind)mode; currentModeInfo.mk = (mode_kind)mode;
currentMode = (mode_kind)mode; currentMode = (mode_kind)mode;
currentModeInfo.filter = filter; currentModeInfo.filter = filter;
currentModeInfo.reg = mode;
rpt->handleUpdateCurrentMainMode(currentModeInfo);
if( (filter) && (filter < 4)){ if( (filter) && (filter < 4)){
ui->modeFilterCombo->blockSignals(true); ui->modeFilterCombo->blockSignals(true);

Wyświetl plik

@ -60,6 +60,19 @@ enum mode_kind {
modeDCR 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 { enum breakIn_t {
brkinOff = 0x00, brkinOff = 0x00,
brkinSemi = 0x01, brkinSemi = 0x01,
@ -69,6 +82,7 @@ enum breakIn_t {
struct freqt { struct freqt {
quint64 Hz; quint64 Hz;
double MHzDouble; double MHzDouble;
selVFO_t VFO = activeVFO;
}; };
struct datekind { struct datekind {