kopia lustrzana https://gitlab.com/eliggett/wfview
Split mode is working, can also live-sync frequency and mode.
rodzic
4fea16c356
commit
be0aee6183
|
@ -4,13 +4,6 @@
|
|||
#include <QDebug>
|
||||
#include "wfviewtypes.h"
|
||||
|
||||
struct mode_info {
|
||||
mode_kind mk;
|
||||
unsigned char reg;
|
||||
unsigned char filter;
|
||||
QString name;
|
||||
};
|
||||
|
||||
struct preset_kind {
|
||||
// QString name;
|
||||
// QString comment;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -171,14 +171,21 @@
|
|||
<item>
|
||||
<widget class="QPushButton" name="splitPlusButton">
|
||||
<property name="text">
|
||||
<string>+</string>
|
||||
<string>Split+</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="splitMinusBtn">
|
||||
<property name="text">
|
||||
<string>-</string>
|
||||
<string>Split-</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="rptOffsetBtn">
|
||||
<property name="text">
|
||||
<string>RPT</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
11
wfmain.cpp
11
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<freqt>(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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
Ładowanie…
Reference in New Issue