kopia lustrzana https://gitlab.com/eliggett/wfview
Merge branch 'morecontrols' into rc28-shuttle
commit
5926c12a20
135
cwsender.ui
135
cwsender.ui
|
@ -6,7 +6,7 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>636</width>
|
||||
<width>886</width>
|
||||
<height>451</height>
|
||||
</rect>
|
||||
</property>
|
||||
|
@ -18,7 +18,7 @@
|
|||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="3" column="0" colspan="12">
|
||||
<item row="4" column="0" colspan="12">
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>Macros</string>
|
||||
|
@ -161,41 +161,6 @@
|
|||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QComboBox" name="textToSendEdit">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Type here to send text as CW</string>
|
||||
</property>
|
||||
<property name="editable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="currentText">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="insertPolicy">
|
||||
<enum>QComboBox::InsertAtTop</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QPushButton" name="sendBtn">
|
||||
<property name="text">
|
||||
<string>Send</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Return</string>
|
||||
</property>
|
||||
<property name="default">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="12">
|
||||
<widget class="QPlainTextEdit" name="transcriptText">
|
||||
<property name="focusPolicy">
|
||||
|
@ -212,17 +177,7 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QPushButton" name="stopBtn">
|
||||
<property name="toolTip">
|
||||
<string>Stop sending CW</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Stop</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3" colspan="2">
|
||||
<item row="1" column="3">
|
||||
<layout class="QGridLayout" name="gridLayout_3">
|
||||
<property name="sizeConstraint">
|
||||
<enum>QLayout::SetMinimumSize</enum>
|
||||
|
@ -334,6 +289,90 @@
|
|||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="spacerLabel">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QPushButton" name="sendBtn">
|
||||
<property name="text">
|
||||
<string>Send</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Return</string>
|
||||
</property>
|
||||
<property name="default">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="stopBtn">
|
||||
<property name="toolTip">
|
||||
<string>Stop sending CW</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Stop</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="textToSendEdit">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Type here to send text as CW</string>
|
||||
</property>
|
||||
<property name="editable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="currentText">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="insertPolicy">
|
||||
<enum>QComboBox::InsertAtTop</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusbar"/>
|
||||
|
|
|
@ -2,31 +2,7 @@
|
|||
#define REPEATERATTRIBUTES_H
|
||||
#include <QMetaType>
|
||||
|
||||
enum duplexMode {
|
||||
dmSplitOff=0x00,
|
||||
dmSplitOn=0x01,
|
||||
dmSimplex=0x10,
|
||||
dmDupMinus=0x11,
|
||||
dmDupPlus=0x12,
|
||||
dmDupRPS=0x13,
|
||||
dmDupAutoOn=0x26,
|
||||
dmDupAutoOff=0x36
|
||||
};
|
||||
// TODO: Remove this file as it does nothing.
|
||||
|
||||
// Here, T=tone, D=DCS, N=none
|
||||
// And the naming convention order is Transmit Receive
|
||||
enum rptAccessTxRx {
|
||||
ratrNN=0x00,
|
||||
ratrTN=0x01, // "TONE" (T only)
|
||||
ratrNT=0x02, // "TSQL" (R only)
|
||||
ratrDD=0x03, // "DTCS" (TR)
|
||||
ratrDN=0x06, // "DTCS(T)"
|
||||
ratrTD=0x07, // "TONE(T) / TSQL(R)"
|
||||
ratrDT=0x08, // "DTCS(T) / TSQL(R)"
|
||||
ratrTT=0x09 // "TONE(T) / TSQL(R)"
|
||||
};
|
||||
|
||||
Q_DECLARE_METATYPE(enum duplexMode)
|
||||
Q_DECLARE_METATYPE(enum rptAccessTxRx)
|
||||
|
||||
#endif // REPEATERATTRIBUTES_H
|
||||
|
|
|
@ -16,11 +16,9 @@ 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
|
||||
|
||||
}
|
||||
|
@ -50,7 +48,6 @@ void repeaterSetup::setRig(rigCapabilities inRig)
|
|||
ui->toneTone->setDisabled(true);
|
||||
ui->toneTSQL->setDisabled(true);
|
||||
}
|
||||
|
||||
if(rig.hasDTCS)
|
||||
{
|
||||
ui->rptDTCSCombo->setDisabled(false);
|
||||
|
@ -63,6 +60,54 @@ void repeaterSetup::setRig(rigCapabilities inRig)
|
|||
ui->rptDTCSInvertRx->setDisabled(true);
|
||||
ui->rptDTCSInvertTx->setDisabled(true);
|
||||
}
|
||||
if(rig.hasVFOAB)
|
||||
{
|
||||
ui->selABtn->setDisabled(false);
|
||||
ui->selBBtn->setDisabled(false);
|
||||
ui->aEqBBtn->setDisabled(false);
|
||||
ui->swapABBtn->setDisabled(false);
|
||||
} else {
|
||||
ui->selABtn->setDisabled(true);
|
||||
ui->selBBtn->setDisabled(true);
|
||||
ui->aEqBBtn->setDisabled(true);
|
||||
ui->swapABBtn->setDisabled(true);
|
||||
}
|
||||
if(rig.hasVFOMS)
|
||||
{
|
||||
ui->selMainBtn->setDisabled(false);
|
||||
ui->selSubBtn->setDisabled(false);
|
||||
ui->mEqSBtn->setDisabled(false);
|
||||
ui->swapMSBtn->setDisabled(false);
|
||||
} else {
|
||||
ui->selMainBtn->setDisabled(true);
|
||||
ui->selSubBtn->setDisabled(true);
|
||||
ui->mEqSBtn->setDisabled(true);
|
||||
ui->swapMSBtn->setDisabled(true);
|
||||
}
|
||||
if(rig.hasVFOMS && rig.hasVFOAB)
|
||||
{
|
||||
// Rigs that have both AB and MS
|
||||
// do not have a swap AB command.
|
||||
ui->swapABBtn->setDisabled(true);
|
||||
}
|
||||
if(rig.hasSpecifyMainSubCmd)
|
||||
{
|
||||
ui->setRptrSubVFOBtn->setEnabled(true);
|
||||
ui->setToneSubVFOBtn->setEnabled(true);
|
||||
ui->setSplitRptrToneChk->setEnabled(true);
|
||||
} else {
|
||||
ui->setRptrSubVFOBtn->setDisabled(true);
|
||||
ui->setToneSubVFOBtn->setDisabled(true);
|
||||
ui->setSplitRptrToneChk->setDisabled(true);
|
||||
}
|
||||
ui->rptAutoBtn->setEnabled(rig.hasRepeaterModes);
|
||||
ui->rptDupMinusBtn->setEnabled(rig.hasRepeaterModes);
|
||||
ui->rptDupPlusBtn->setEnabled(rig.hasRepeaterModes);
|
||||
ui->rptSimplexBtn->setEnabled(rig.hasRepeaterModes);
|
||||
ui->rptrOffsetEdit->setEnabled(rig.hasRepeaterModes);
|
||||
ui->rptrOffsetSetBtn->setEnabled(rig.hasRepeaterModes);
|
||||
ui->setToneSubVFOBtn->setEnabled(rig.hasSpecifyMainSubCmd);
|
||||
ui->setRptrSubVFOBtn->setEnabled(rig.hasSpecifyMainSubCmd);
|
||||
}
|
||||
|
||||
void repeaterSetup::populateTones()
|
||||
|
@ -241,7 +286,7 @@ void repeaterSetup::receiveDuplexMode(duplexMode dm)
|
|||
switch(dm)
|
||||
{
|
||||
case dmSplitOff:
|
||||
ui->splitEnableChk->setChecked(false);
|
||||
ui->splitOffBtn->setChecked(true);
|
||||
ui->autoTrackLiveBtn->setChecked(false);
|
||||
break;
|
||||
case dmSplitOn:
|
||||
|
@ -252,17 +297,17 @@ void repeaterSetup::receiveDuplexMode(duplexMode dm)
|
|||
break;
|
||||
case dmSimplex:
|
||||
ui->rptSimplexBtn->setChecked(true);
|
||||
ui->splitEnableChk->setChecked(false);
|
||||
//ui->splitEnableChk->setChecked(false);
|
||||
ui->autoTrackLiveBtn->setChecked(false);
|
||||
break;
|
||||
case dmDupPlus:
|
||||
ui->rptDupPlusBtn->setChecked(true);
|
||||
ui->splitEnableChk->setChecked(false);
|
||||
//ui->splitEnableChk->setChecked(false);
|
||||
ui->autoTrackLiveBtn->setChecked(false);
|
||||
break;
|
||||
case dmDupMinus:
|
||||
ui->rptDupMinusBtn->setChecked(true);
|
||||
ui->splitEnableChk->setChecked(false);
|
||||
//ui->splitEnableChk->setChecked(false);
|
||||
ui->autoTrackLiveBtn->setChecked(false);
|
||||
break;
|
||||
default:
|
||||
|
@ -333,6 +378,11 @@ void repeaterSetup::handleUpdateCurrentMainFrequency(freqt mainfreq)
|
|||
on_splitMinusBtn_clicked();
|
||||
}
|
||||
}
|
||||
if(ui->setSplitRptrToneChk->isChecked())
|
||||
{
|
||||
// TODO, not really needed if the op
|
||||
// just sets the tone when needed, as it will do both bands.
|
||||
}
|
||||
}
|
||||
this->currentMainFrequency = mainfreq;
|
||||
}
|
||||
|
@ -351,6 +401,12 @@ void repeaterSetup::handleUpdateCurrentMainMode(mode_info m)
|
|||
}
|
||||
}
|
||||
|
||||
void repeaterSetup::handleRptOffsetFrequency(freqt f)
|
||||
{
|
||||
QString offsetstr = QString::number(f.Hz / double(1E6), 'f', 4);
|
||||
ui->rptrOffsetEdit->setText(offsetstr);
|
||||
}
|
||||
|
||||
void repeaterSetup::handleTransmitStatus(bool amTransmitting)
|
||||
{
|
||||
this->amTransmitting = amTransmitting;
|
||||
|
@ -358,15 +414,38 @@ void repeaterSetup::handleTransmitStatus(bool amTransmitting)
|
|||
|
||||
void repeaterSetup::showEvent(QShowEvent *event)
|
||||
{
|
||||
emit getDuplexMode();
|
||||
emit getSplitModeEnabled();
|
||||
if(rig.hasRepeaterModes)
|
||||
emit getRptDuplexOffset();
|
||||
|
||||
(void)event;
|
||||
}
|
||||
|
||||
void repeaterSetup::on_splitEnableChk_clicked()
|
||||
{
|
||||
emit setDuplexMode(dmSplitOn);
|
||||
|
||||
if(ui->autoTrackLiveBtn->isChecked())
|
||||
{
|
||||
ui->autoTrackLiveBtn->setChecked(false);
|
||||
}
|
||||
}
|
||||
|
||||
void repeaterSetup::on_splitOffBtn_clicked()
|
||||
{
|
||||
emit setDuplexMode(dmSplitOff);
|
||||
}
|
||||
|
||||
void repeaterSetup::on_rptSimplexBtn_clicked()
|
||||
{
|
||||
// Simplex
|
||||
emit setDuplexMode(dmDupAutoOff);
|
||||
emit setDuplexMode(dmSimplex);
|
||||
emit setDuplexMode(dmSplitOff);
|
||||
if(rig.hasRepeaterModes)
|
||||
{
|
||||
emit setDuplexMode(dmDupAutoOff);
|
||||
emit setDuplexMode(dmSimplex);
|
||||
}
|
||||
}
|
||||
|
||||
void repeaterSetup::on_rptDupPlusBtn_clicked()
|
||||
|
@ -399,11 +478,25 @@ void repeaterSetup::on_rptToneCombo_activated(int tindex)
|
|||
{
|
||||
quint16 tone=0;
|
||||
tone = (quint16)ui->rptToneCombo->itemData(tindex).toUInt();
|
||||
rptrTone_t rt;
|
||||
rt.tone = tone;
|
||||
bool updateSub = ui->setSplitRptrToneChk->isEnabled() && ui->setSplitRptrToneChk->isChecked();
|
||||
if(ui->toneTone->isChecked())
|
||||
{
|
||||
emit setTone(tone);
|
||||
emit setTone(rt);
|
||||
if(updateSub)
|
||||
{
|
||||
rt.useSecondaryVFO = true;
|
||||
emit setTone(rt);
|
||||
}
|
||||
|
||||
} else if (ui->toneTSQL->isChecked()) {
|
||||
emit setTSQL(tone);
|
||||
emit setTSQL(rt);
|
||||
if(updateSub)
|
||||
{
|
||||
rt.useSecondaryVFO = true;
|
||||
emit setTone(rt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -419,38 +512,75 @@ void repeaterSetup::on_rptDTCSCombo_activated(int index)
|
|||
void repeaterSetup::on_toneNone_clicked()
|
||||
{
|
||||
rptAccessTxRx rm;
|
||||
rptrAccessData_t rd;
|
||||
rm = ratrNN;
|
||||
emit setRptAccessMode(rm);
|
||||
rd.accessMode = rm;
|
||||
emit setRptAccessMode(rd);
|
||||
bool updateSub = ui->setSplitRptrToneChk->isEnabled() && ui->setSplitRptrToneChk->isChecked();
|
||||
|
||||
if(updateSub)
|
||||
{
|
||||
rd.useSecondaryVFO = true;
|
||||
emit setRptAccessMode(rd);
|
||||
}
|
||||
}
|
||||
|
||||
void repeaterSetup::on_toneTone_clicked()
|
||||
{
|
||||
rptAccessTxRx rm;
|
||||
rptrAccessData_t rd;
|
||||
rm = ratrTN;
|
||||
emit setRptAccessMode(rm);
|
||||
emit setTone((quint16)ui->rptToneCombo->currentData().toUInt());
|
||||
rd.accessMode = rm;
|
||||
rptrTone_t rt;
|
||||
rt.tone = (quint16)ui->rptToneCombo->currentData().toUInt();
|
||||
emit setRptAccessMode(rd);
|
||||
emit setTone(rt);
|
||||
|
||||
bool updateSub = ui->setSplitRptrToneChk->isEnabled() && ui->setSplitRptrToneChk->isChecked();
|
||||
|
||||
if(updateSub)
|
||||
{
|
||||
rd.useSecondaryVFO = true;
|
||||
rt.useSecondaryVFO = true;
|
||||
emit setRptAccessMode(rd);
|
||||
emit setTone(rt);
|
||||
}
|
||||
}
|
||||
|
||||
void repeaterSetup::on_toneTSQL_clicked()
|
||||
{
|
||||
rptAccessTxRx rm;
|
||||
rptrAccessData_t rd;
|
||||
rm = ratrTT;
|
||||
emit setRptAccessMode(rm);
|
||||
emit setTSQL((quint16)ui->rptToneCombo->currentData().toUInt());
|
||||
rptrTone_t rt;
|
||||
rt.tone = (quint16)ui->rptToneCombo->currentData().toUInt();
|
||||
rd.accessMode = rm;
|
||||
emit setRptAccessMode(rd);
|
||||
emit setTSQL(rt);
|
||||
bool updateSub = ui->setSplitRptrToneChk->isEnabled() && ui->setSplitRptrToneChk->isChecked();
|
||||
|
||||
if(updateSub)
|
||||
{
|
||||
rd.useSecondaryVFO = true;
|
||||
rt.useSecondaryVFO = true;
|
||||
emit setRptAccessMode(rd);
|
||||
emit setTone(rt);
|
||||
}
|
||||
}
|
||||
|
||||
void repeaterSetup::on_toneDTCS_clicked()
|
||||
{
|
||||
rptAccessTxRx rm;
|
||||
rptrAccessData_t rd;
|
||||
quint16 dcode=0;
|
||||
|
||||
rm = ratrDD;
|
||||
emit setRptAccessMode(rm);
|
||||
rd.accessMode = ratrDD;
|
||||
emit setRptAccessMode(rd);
|
||||
|
||||
bool tinv = ui->rptDTCSInvertTx->isChecked();
|
||||
bool rinv = ui->rptDTCSInvertRx->isChecked();
|
||||
dcode = (quint16)ui->rptDTCSCombo->currentData().toUInt();
|
||||
emit setDTCS(dcode, tinv, rinv);
|
||||
// TODO: DTCS with subband
|
||||
}
|
||||
|
||||
void repeaterSetup::on_debugBtn_clicked()
|
||||
|
@ -462,27 +592,13 @@ void repeaterSetup::on_debugBtn_clicked()
|
|||
emit getRptAccessMode();
|
||||
}
|
||||
|
||||
void repeaterSetup::on_splitOffsetSetBtn_clicked()
|
||||
{
|
||||
freqt txFreq;
|
||||
bool ok = true;
|
||||
txFreq.Hz = ui->splitTransmitFreqEdit->text().toDouble(&ok) * 1E6;
|
||||
emit setTransmitFrequency(txFreq);
|
||||
}
|
||||
|
||||
void repeaterSetup::on_splitEnableChk_clicked(bool enabled)
|
||||
{
|
||||
if(enabled)
|
||||
{
|
||||
emit setDuplexMode(dmSplitOn);
|
||||
} else {
|
||||
emit setDuplexMode(dmSplitOff);
|
||||
}
|
||||
if(ui->autoTrackLiveBtn->isChecked())
|
||||
{
|
||||
ui->autoTrackLiveBtn->setChecked(false);
|
||||
}
|
||||
}
|
||||
//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)
|
||||
{
|
||||
|
@ -528,10 +644,16 @@ quint64 repeaterSetup::getFreqHzFromMHzString(QString MHz)
|
|||
// We want the right 4xx 3 characters.
|
||||
QString KHz = MHz.right(MHz.length() - decimalPtIndex - 1);
|
||||
MHz.chop(MHz.length() - decimalPtIndex);
|
||||
|
||||
if(KHz.length() != 6)
|
||||
{
|
||||
QString zeros = QString("000000");
|
||||
zeros.chop(KHz.length());
|
||||
KHz.append(zeros);
|
||||
}
|
||||
//qInfo() << "KHz string: " << KHz;
|
||||
fhz = MHz.toUInt(&ok) * 1E6; if(!ok) goto handleError;
|
||||
fhz += KHz.toUInt(&ok) * 1E3; if(!ok) goto handleError;
|
||||
|
||||
fhz += KHz.toUInt(&ok) * 1; if(!ok) goto handleError;
|
||||
//qInfo() << "Fhz: " << fhz;
|
||||
} else {
|
||||
// Frequency was already MHz (unlikely but what can we do?)
|
||||
fhz = MHz.toUInt(&ok) * 1E6; if(!ok) goto handleError;
|
||||
|
@ -594,3 +716,87 @@ void repeaterSetup::on_splitTxFreqSetBtn_clicked()
|
|||
emit setTransmitMode(modeTransmitVFO);
|
||||
}
|
||||
}
|
||||
|
||||
void repeaterSetup::on_selABtn_clicked()
|
||||
{
|
||||
vfo_t v = vfoA;
|
||||
emit selectVFO(v);
|
||||
}
|
||||
|
||||
void repeaterSetup::on_selBBtn_clicked()
|
||||
{
|
||||
vfo_t v = vfoB;
|
||||
emit selectVFO(v);
|
||||
}
|
||||
|
||||
void repeaterSetup::on_aEqBBtn_clicked()
|
||||
{
|
||||
emit equalizeVFOsAB();
|
||||
}
|
||||
|
||||
void repeaterSetup::on_swapABBtn_clicked()
|
||||
{
|
||||
emit swapVFOs();
|
||||
}
|
||||
|
||||
void repeaterSetup::on_selMainBtn_clicked()
|
||||
{
|
||||
vfo_t v = vfoMain;
|
||||
emit selectVFO(v);
|
||||
}
|
||||
|
||||
void repeaterSetup::on_selSubBtn_clicked()
|
||||
{
|
||||
vfo_t v = vfoSub;
|
||||
emit selectVFO(v);
|
||||
}
|
||||
|
||||
void repeaterSetup::on_mEqSBtn_clicked()
|
||||
{
|
||||
emit equalizeVFOsMS();
|
||||
}
|
||||
|
||||
void repeaterSetup::on_swapMSBtn_clicked()
|
||||
{
|
||||
emit swapVFOs();
|
||||
}
|
||||
|
||||
void repeaterSetup::on_setToneSubVFOBtn_clicked()
|
||||
{
|
||||
// Perhaps not needed
|
||||
// Set the secondary VFO to the selected tone
|
||||
// TODO: DTCS
|
||||
rptrTone_t rt;
|
||||
rt.tone = (quint16)ui->rptToneCombo->currentData().toUInt();
|
||||
rt.useSecondaryVFO = true;
|
||||
emit setTone(rt);
|
||||
}
|
||||
|
||||
void repeaterSetup::on_setRptrSubVFOBtn_clicked()
|
||||
{
|
||||
// Perhaps not needed
|
||||
// Set the secondary VFO to the selected repeater mode
|
||||
rptrAccessData_t rd;
|
||||
rd.useSecondaryVFO = true;
|
||||
|
||||
if(ui->toneTone->isChecked())
|
||||
rd.accessMode=ratrTN;
|
||||
if(ui->toneNone->isChecked())
|
||||
rd.accessMode=ratrNN;
|
||||
if(ui->toneTSQL->isChecked())
|
||||
rd.accessMode=ratrTT;
|
||||
if(ui->toneDTCS->isChecked())
|
||||
rd.accessMode=ratrDD;
|
||||
|
||||
emit setRptAccessMode(rd);
|
||||
}
|
||||
|
||||
void repeaterSetup::on_rptrOffsetSetBtn_clicked()
|
||||
{
|
||||
freqt f;
|
||||
f.Hz = getFreqHzFromMHzString(ui->rptrOffsetEdit->text());
|
||||
if(f.Hz != 0)
|
||||
{
|
||||
emit setRptDuplexOffset(f);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,14 +23,16 @@ public:
|
|||
signals:
|
||||
void getDuplexMode();
|
||||
void setDuplexMode(duplexMode dm);
|
||||
void setTone(quint16 tone);
|
||||
void setTSQL(quint16 tsql);
|
||||
void setTone(rptrTone_t tone);
|
||||
void setTSQL(rptrTone_t tsql);
|
||||
void setDTCS(quint16 dcode, bool tinv, bool rinv);
|
||||
void getTone();
|
||||
void getTSQL();
|
||||
void getDTCS();
|
||||
void setRptAccessMode(rptAccessTxRx tmode);
|
||||
void setRptAccessMode(rptrAccessData_t rd);
|
||||
void getRptAccessMode();
|
||||
void setRptDuplexOffset(freqt f);
|
||||
void getRptDuplexOffset();
|
||||
// Split:
|
||||
void getSplitModeEnabled();
|
||||
void getTransmitFrequency();
|
||||
|
@ -38,6 +40,11 @@ signals:
|
|||
// void setSplitModeEnabled(bool splitEnabled);
|
||||
void setTransmitFrequency(freqt transmitFreq);
|
||||
void setTransmitMode(mode_info m);
|
||||
// VFO:
|
||||
void selectVFO(vfo_t v); // A,B,M,S
|
||||
void equalizeVFOsAB();
|
||||
void equalizeVFOsMS();
|
||||
void swapVFOs();
|
||||
|
||||
public slots:
|
||||
void receiveDuplexMode(duplexMode dm);
|
||||
|
@ -50,6 +57,7 @@ public slots:
|
|||
void handleUpdateCurrentMainFrequency(freqt mainfreq);
|
||||
void handleUpdateCurrentMainMode(mode_info m);
|
||||
void handleTransmitStatus(bool amTransmitting);
|
||||
void handleRptOffsetFrequency(freqt f);
|
||||
|
||||
private slots:
|
||||
void showEvent(QShowEvent *event);
|
||||
|
@ -65,13 +73,37 @@ private slots:
|
|||
void on_toneTone_clicked();
|
||||
void on_toneTSQL_clicked();
|
||||
void on_toneDTCS_clicked();
|
||||
void on_splitOffsetSetBtn_clicked();
|
||||
void on_splitEnableChk_clicked(bool enabled);
|
||||
void on_splitPlusButton_clicked();
|
||||
void on_splitMinusBtn_clicked();
|
||||
|
||||
void on_splitTxFreqSetBtn_clicked();
|
||||
|
||||
void on_selABtn_clicked();
|
||||
|
||||
void on_selBBtn_clicked();
|
||||
|
||||
void on_aEqBBtn_clicked();
|
||||
|
||||
void on_swapABBtn_clicked();
|
||||
|
||||
void on_selMainBtn_clicked();
|
||||
|
||||
void on_selSubBtn_clicked();
|
||||
|
||||
void on_mEqSBtn_clicked();
|
||||
|
||||
void on_swapMSBtn_clicked();
|
||||
|
||||
void on_setToneSubVFOBtn_clicked();
|
||||
|
||||
void on_setRptrSubVFOBtn_clicked();
|
||||
|
||||
void on_rptrOffsetSetBtn_clicked();
|
||||
|
||||
void on_splitOffBtn_clicked();
|
||||
|
||||
void on_splitEnableChk_clicked();
|
||||
|
||||
private:
|
||||
Ui::repeaterSetup *ui;
|
||||
freqt currentMainFrequency;
|
||||
|
|
137
repeatersetup.ui
137
repeatersetup.ui
|
@ -6,8 +6,8 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>922</width>
|
||||
<height>217</height>
|
||||
<width>1230</width>
|
||||
<height>267</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
|
@ -116,6 +116,27 @@
|
|||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_9">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string>Offset (MHz):</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="rptrOffsetEdit"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="rptrOffsetSetBtn">
|
||||
<property name="text">
|
||||
<string>Set</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -128,16 +149,36 @@
|
|||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_8">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="splitEnableChk">
|
||||
<widget class="QRadioButton" name="splitEnableChk">
|
||||
<property name="text">
|
||||
<string>Split Enable</string>
|
||||
<string>Split On</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">rptDuplexBtns</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="splitOffBtn">
|
||||
<property name="text">
|
||||
<string>Split Off</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">rptDuplexBtns</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="autoTrackLiveBtn">
|
||||
<property name="text">
|
||||
<string>Auto Track Live</string>
|
||||
<string>AutoTrack</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="setSplitRptrToneChk">
|
||||
<property name="text">
|
||||
<string>Set Rpt Tone</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -182,13 +223,6 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="rptOffsetBtn">
|
||||
<property name="text">
|
||||
<string>RPT</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
|
@ -228,6 +262,71 @@
|
|||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>VFO</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="1">
|
||||
<widget class="QPushButton" name="swapABBtn">
|
||||
<property name="text">
|
||||
<string>Swap AB</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QPushButton" name="selSubBtn">
|
||||
<property name="text">
|
||||
<string>Sel Sub</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QPushButton" name="selMainBtn">
|
||||
<property name="text">
|
||||
<string>Sel Main</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QPushButton" name="selBBtn">
|
||||
<property name="text">
|
||||
<string>Sel B</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QPushButton" name="selABtn">
|
||||
<property name="text">
|
||||
<string>Sel A</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QPushButton" name="aEqBBtn">
|
||||
<property name="text">
|
||||
<string>A=B</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QPushButton" name="mEqSBtn">
|
||||
<property name="text">
|
||||
<string>M=>S</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QPushButton" name="swapMSBtn">
|
||||
<property name="text">
|
||||
<string>Swap MS</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
|
@ -274,6 +373,13 @@
|
|||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="setRptrSubVFOBtn">
|
||||
<property name="text">
|
||||
<string>Set Sub VFO</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -329,6 +435,13 @@
|
|||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="setToneSubVFOBtn">
|
||||
<property name="text">
|
||||
<string>Set Sub VFO</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
|
196
rigcommander.cpp
196
rigcommander.cpp
|
@ -657,6 +657,44 @@ void rigCommander::setFrequency(unsigned char vfo, freqt freq)
|
|||
prepDataAndSend(cmdPayload);
|
||||
}
|
||||
|
||||
void rigCommander::selectVFO(vfo_t vfo)
|
||||
{
|
||||
// Note, some radios use main/sub,
|
||||
// some use A/B,
|
||||
// and some appear to use both...
|
||||
QByteArray payload;
|
||||
|
||||
char vfoBytes[1];
|
||||
vfoBytes[0] = (unsigned char)vfo;
|
||||
|
||||
payload.setRawData("\x07", 1);
|
||||
payload.append(vfoBytes, 1);
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::equalizeVFOsAB()
|
||||
{
|
||||
QByteArray payload;
|
||||
payload.setRawData("\x07\xA0", 2);
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::equalizeVFOsMS()
|
||||
{
|
||||
QByteArray payload;
|
||||
payload.setRawData("\x07\xB1", 2);
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::exchangeVFOs()
|
||||
{
|
||||
// NB: This command exchanges A-B or M-S
|
||||
// depending upon the radio.
|
||||
QByteArray payload;
|
||||
payload.setRawData("\x07\xB0", 2);
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
QByteArray rigCommander::makeFreqPayload(freqt freq)
|
||||
{
|
||||
QByteArray result;
|
||||
|
@ -1005,28 +1043,54 @@ void rigCommander::getTransmitFrequency()
|
|||
|
||||
void rigCommander::setTone(quint16 tone)
|
||||
{
|
||||
rptrTone_t t;
|
||||
t.tone = tone;
|
||||
setTone(t);
|
||||
}
|
||||
|
||||
void rigCommander::setTone(rptrTone_t t)
|
||||
{
|
||||
quint16 tone = t.tone;
|
||||
|
||||
QByteArray fenc = encodeTone(tone);
|
||||
|
||||
QByteArray payload;
|
||||
payload.setRawData("\x1B\x00", 2);
|
||||
payload.append(fenc);
|
||||
|
||||
//qInfo() << __func__ << "TONE encoded payload: ";
|
||||
printHex(payload);
|
||||
if(t.useSecondaryVFO)
|
||||
{
|
||||
qDebug(logRig()) << "Sending TONE to secondary VFO";
|
||||
payload.prepend("\x29\x01");
|
||||
printHex(payload);
|
||||
}
|
||||
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::setTSQL(quint16 tsql)
|
||||
void rigCommander::setTSQL(quint16 t)
|
||||
{
|
||||
rptrTone_t tn;
|
||||
tn.tone = t;
|
||||
setTSQL(tn);
|
||||
}
|
||||
|
||||
void rigCommander::setTSQL(rptrTone_t t)
|
||||
{
|
||||
quint16 tsql = t.tone;
|
||||
|
||||
QByteArray fenc = encodeTone(tsql);
|
||||
|
||||
QByteArray payload;
|
||||
payload.setRawData("\x1B\x01", 2);
|
||||
payload.append(fenc);
|
||||
|
||||
//qInfo() << __func__ << "TSQL encoded payload: ";
|
||||
printHex(payload);
|
||||
if(t.useSecondaryVFO)
|
||||
{
|
||||
qDebug(logRig()) << "Sending TSQL to secondary VFO";
|
||||
payload.prepend("\x29\x01");
|
||||
printHex(payload);
|
||||
}
|
||||
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
|
@ -1134,10 +1198,42 @@ void rigCommander::getRptAccessMode()
|
|||
}
|
||||
|
||||
void rigCommander::setRptAccessMode(rptAccessTxRx ratr)
|
||||
{
|
||||
rptrAccessData_t rd;
|
||||
rd.accessMode = ratr;
|
||||
setRptAccessMode(rd);
|
||||
}
|
||||
|
||||
void rigCommander::setRptAccessMode(rptrAccessData_t rd)
|
||||
{
|
||||
QByteArray payload;
|
||||
payload.setRawData("\x16\x5D", 2);
|
||||
payload.append((unsigned char)ratr);
|
||||
payload.append((unsigned char)rd.accessMode);
|
||||
if(rd.useSecondaryVFO)
|
||||
{
|
||||
payload.prepend("\x29\x01");
|
||||
}
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::setRptDuplexOffset(freqt f)
|
||||
{
|
||||
QByteArray payload;
|
||||
payload.setRawData("\x0D", 1);
|
||||
// get f, chop to 10 MHz
|
||||
QByteArray freqPayload = makeFreqPayload(f);
|
||||
payload.append(freqPayload.mid(1, 3));
|
||||
//qInfo(logRig()) << "Here is potential repeater offset setting, not sending to radio:";
|
||||
printHexNow(payload, logRig());
|
||||
QString g = getHex(payload);
|
||||
//qInfo(logRig()).noquote().nospace() << g;
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
void rigCommander::getRptDuplexOffset()
|
||||
{
|
||||
QByteArray payload;
|
||||
payload.setRawData("\x0C", 1);
|
||||
prepDataAndSend(payload);
|
||||
}
|
||||
|
||||
|
@ -1475,6 +1571,10 @@ void rigCommander::parseCommand()
|
|||
//qInfo(logRig()) << "Have mode data";
|
||||
this->parseMode();
|
||||
break;
|
||||
case '\x0C':
|
||||
//qDebug(logRig) << "Have 0x0C reply";
|
||||
emit haveRptOffsetFrequency(parseFrequencyRptOffset(payloadIn));
|
||||
break;
|
||||
case '\x0F':
|
||||
emit haveDuplexMode((duplexMode)(unsigned char)payloadIn[1]);
|
||||
state.set(DUPLEX, (duplexMode)(unsigned char)payloadIn[1], false);
|
||||
|
@ -3357,7 +3457,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.bands.insert(rigCaps.bands.end(), { bandDef4m, bandDef630m, bandDef2200m, bandDefGen });
|
||||
rigCaps.modes = commonModes;
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x71");
|
||||
|
||||
rigCaps.hasVFOMS = false;
|
||||
rigCaps.hasVFOAB = true;
|
||||
break;
|
||||
case modelR8600:
|
||||
rigCaps.modelName = QString("IC-R8600");
|
||||
|
@ -3395,6 +3496,8 @@ void rigCommander::determineRigCaps()
|
|||
createMode(modeDCR, 0x21, "DCR")});
|
||||
rigCaps.scopeCenterSpans.insert(rigCaps.scopeCenterSpans.end(), {createScopeCenter(cs1M, "±1M"), createScopeCenter(cs2p5M, "±2.5M")});
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x92");
|
||||
rigCaps.hasVFOMS = true; // not documented very well
|
||||
rigCaps.hasVFOAB = true; // so we just do both...
|
||||
break;
|
||||
case model9700:
|
||||
rigCaps.modelName = QString("IC-9700");
|
||||
|
@ -3413,6 +3516,7 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.hasDV = true;
|
||||
rigCaps.hasCTCSS = true;
|
||||
rigCaps.hasDTCS = true;
|
||||
rigCaps.hasRepeaterModes = true;
|
||||
rigCaps.hasTBPF = true;
|
||||
rigCaps.attenuators.push_back('\x10');
|
||||
rigCaps.preamps.push_back('\x01');
|
||||
|
@ -3425,6 +3529,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modeDV, 0x17, "DV"),
|
||||
createMode(modeDD, 0x22, "DD")});
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x27");
|
||||
rigCaps.hasVFOMS = true;
|
||||
rigCaps.hasVFOAB = true;
|
||||
break;
|
||||
case model910h:
|
||||
rigCaps.modelName = QString("IC-910H");
|
||||
|
@ -3438,6 +3544,7 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.hasDV = false;
|
||||
rigCaps.hasCTCSS = true;
|
||||
rigCaps.hasDTCS = true;
|
||||
rigCaps.hasRepeaterModes = true;
|
||||
rigCaps.hasATU = false;
|
||||
rigCaps.attenuators.insert(rigCaps.attenuators.end(),{ '\x10' , '\x20', '\x30'});
|
||||
rigCaps.preamps.push_back('\x01');
|
||||
|
@ -3448,6 +3555,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.bsr[band2m] = 0x01;
|
||||
rigCaps.modes = commonModes;
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x58");
|
||||
rigCaps.hasVFOMS = false;
|
||||
rigCaps.hasVFOAB = true;
|
||||
break;
|
||||
case model7600:
|
||||
rigCaps.modelName = QString("IC-7600");
|
||||
|
@ -3474,6 +3583,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.modes.insert(rigCaps.modes.end(), { createMode(modePSK, 0x12, "PSK"),
|
||||
createMode(modePSK_R, 0x13, "PSK-R") });
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x97");
|
||||
rigCaps.hasVFOMS = true;
|
||||
rigCaps.hasVFOAB = false;
|
||||
break;
|
||||
case model7610:
|
||||
rigCaps.modelName = QString("IC-7610");
|
||||
|
@ -3507,6 +3618,9 @@ void rigCommander::determineRigCaps()
|
|||
createMode(modePSK_R, 0x13, "PSK-R") });
|
||||
rigCaps.hasRXAntenna = true;
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x12");
|
||||
rigCaps.hasSpecifyMainSubCmd = true;
|
||||
rigCaps.hasVFOMS = true;
|
||||
rigCaps.hasVFOAB = false;
|
||||
break;
|
||||
case model7850:
|
||||
rigCaps.modelName = QString("IC-785x");
|
||||
|
@ -3539,6 +3653,9 @@ void rigCommander::determineRigCaps()
|
|||
createMode(modePSK_R, 0x13, "PSK-R")});
|
||||
rigCaps.hasRXAntenna = true;
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x55");
|
||||
rigCaps.hasSpecifyMainSubCmd = true;
|
||||
rigCaps.hasVFOMS = true;
|
||||
rigCaps.hasVFOAB = false;
|
||||
break;
|
||||
case model705:
|
||||
rigCaps.modelName = QString("IC-705");
|
||||
|
@ -3557,6 +3674,7 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.hasATU = true;
|
||||
rigCaps.hasCTCSS = true;
|
||||
rigCaps.hasDTCS = true;
|
||||
rigCaps.hasRepeaterModes = true;
|
||||
rigCaps.hasTBPF = true;
|
||||
rigCaps.attenuators.insert(rigCaps.attenuators.end(),{ '\x10' , '\x20'});
|
||||
rigCaps.preamps.push_back('\x01');
|
||||
|
@ -3573,6 +3691,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modeWFM, 0x06, "WFM"),
|
||||
createMode(modeDV, 0x17, "DV")});
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x31");
|
||||
rigCaps.hasVFOMS = false;
|
||||
rigCaps.hasVFOAB = true;
|
||||
break;
|
||||
case model7000:
|
||||
rigCaps.modelName = QString("IC-7000");
|
||||
|
@ -3597,6 +3717,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.bsr[bandGen] = 0x13;
|
||||
rigCaps.modes = commonModes;
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x92");
|
||||
rigCaps.hasVFOMS = false;
|
||||
rigCaps.hasVFOAB = true;
|
||||
break;
|
||||
case model7410:
|
||||
rigCaps.modelName = QString("IC-7410");
|
||||
|
@ -3620,6 +3742,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.bsr[bandGen] = 0x11;
|
||||
rigCaps.modes = commonModes;
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x40");
|
||||
rigCaps.hasVFOMS = false;
|
||||
rigCaps.hasVFOAB = true;
|
||||
break;
|
||||
case model7100:
|
||||
rigCaps.modelName = QString("IC-7100");
|
||||
|
@ -3634,6 +3758,7 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.hasATU = true;
|
||||
rigCaps.hasCTCSS = true;
|
||||
rigCaps.hasDTCS = true;
|
||||
rigCaps.hasRepeaterModes = true;
|
||||
rigCaps.hasTBPF = true;
|
||||
rigCaps.attenuators.push_back('\x12');
|
||||
rigCaps.preamps.push_back('\x01');
|
||||
|
@ -3648,6 +3773,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modeWFM, 0x06, "WFM"),
|
||||
createMode(modeDV, 0x17, "DV")});
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x95");
|
||||
rigCaps.hasVFOMS = false;
|
||||
rigCaps.hasVFOAB = true;
|
||||
break;
|
||||
case model7200:
|
||||
rigCaps.modelName = QString("IC-7200");
|
||||
|
@ -3670,6 +3797,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.bsr[bandGen] = 0x11;
|
||||
rigCaps.modes = commonModes;
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x03\x48");
|
||||
rigCaps.hasVFOMS = false;
|
||||
rigCaps.hasVFOAB = true;
|
||||
break;
|
||||
case model7700:
|
||||
rigCaps.modelName = QString("IC-7700");
|
||||
|
@ -3696,6 +3825,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modePSK, 0x12, "PSK"),
|
||||
createMode(modePSK_R, 0x13, "PSK-R")});
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x95");
|
||||
rigCaps.hasVFOMS = false;
|
||||
rigCaps.hasVFOAB = true;
|
||||
break;
|
||||
case model703:
|
||||
rigCaps.modelName = QString("IC-703");
|
||||
|
@ -3738,6 +3869,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.modes = commonModes;
|
||||
rigCaps.modes.insert(rigCaps.modes.end(), createMode(modeWFM, 0x06, "WFM"));
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
|
||||
rigCaps.hasVFOMS = false;
|
||||
rigCaps.hasVFOAB = true;
|
||||
break;
|
||||
case model718:
|
||||
rigCaps.modelName = QString("IC-718");
|
||||
|
@ -3764,7 +3897,9 @@ void rigCommander::determineRigCaps()
|
|||
createMode(modeRTTY, 0x04, "RTTY"), createMode(modeRTTY_R, 0x08, "RTTY-R")
|
||||
};
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
|
||||
break;
|
||||
rigCaps.hasVFOMS = false;
|
||||
rigCaps.hasVFOAB = true;
|
||||
break;
|
||||
case model736:
|
||||
rigCaps.modelName = QString("IC-736");
|
||||
rigCaps.rigctlModel = 3020;
|
||||
|
@ -3785,6 +3920,8 @@ void rigCommander::determineRigCaps()
|
|||
createMode(modeAM, 0x02, "AM"), createMode(modeFM, 0x05, "FM"),
|
||||
createMode(modeCW, 0x03, "CW"), createMode(modeCW_R, 0x07, "CW-R"),
|
||||
};
|
||||
rigCaps.hasVFOMS = false;
|
||||
rigCaps.hasVFOAB = true;
|
||||
break;
|
||||
case model737:
|
||||
rigCaps.modelName = QString("IC-737");
|
||||
|
@ -3806,6 +3943,8 @@ void rigCommander::determineRigCaps()
|
|||
createMode(modeAM, 0x02, "AM"), createMode(modeFM, 0x05, "FM"),
|
||||
createMode(modeCW, 0x03, "CW"), createMode(modeCW_R, 0x07, "CW-R"),
|
||||
};
|
||||
rigCaps.hasVFOMS = false;
|
||||
rigCaps.hasVFOAB = true;
|
||||
break;
|
||||
case model738:
|
||||
rigCaps.modelName = QString("IC-738");
|
||||
|
@ -3827,6 +3966,8 @@ void rigCommander::determineRigCaps()
|
|||
createMode(modeAM, 0x02, "AM"), createMode(modeFM, 0x05, "FM"),
|
||||
createMode(modeCW, 0x03, "CW"), createMode(modeCW_R, 0x07, "CW-R"),
|
||||
};
|
||||
rigCaps.hasVFOMS = false;
|
||||
rigCaps.hasVFOAB = true;
|
||||
break;
|
||||
case model746:
|
||||
rigCaps.modelName = QString("IC-746");
|
||||
|
@ -3842,6 +3983,7 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.hasIFShift = true;
|
||||
rigCaps.hasCTCSS = true;
|
||||
rigCaps.hasDTCS = true;
|
||||
rigCaps.hasRepeaterModes = true;
|
||||
rigCaps.hasAntennaSel = true;
|
||||
rigCaps.preamps.push_back('\x01');
|
||||
rigCaps.preamps.push_back('\x02');
|
||||
|
@ -3854,6 +3996,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.bands.push_back(bandDefGen);
|
||||
rigCaps.modes = commonModes;
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
|
||||
rigCaps.hasVFOMS = true;
|
||||
rigCaps.hasVFOAB = true;
|
||||
break;
|
||||
case model756:
|
||||
rigCaps.modelName = QString("IC-756");
|
||||
|
@ -3875,6 +4019,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.bsr[bandGen] = 0x11;
|
||||
rigCaps.modes = commonModes;
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
|
||||
rigCaps.hasVFOMS = true;
|
||||
rigCaps.hasVFOAB = false;
|
||||
break;
|
||||
case model756pro:
|
||||
rigCaps.modelName = QString("IC-756 Pro");
|
||||
|
@ -3896,6 +4042,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.bsr[bandGen] = 0x11;
|
||||
rigCaps.modes = commonModes;
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
|
||||
rigCaps.hasVFOMS = true;
|
||||
rigCaps.hasVFOAB = false;
|
||||
break;
|
||||
case model756proii:
|
||||
rigCaps.modelName = QString("IC-756 Pro II");
|
||||
|
@ -3917,6 +4065,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.bsr[bandGen] = 0x11;
|
||||
rigCaps.modes = commonModes;
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
|
||||
rigCaps.hasVFOMS = true;
|
||||
rigCaps.hasVFOAB = false;
|
||||
break;
|
||||
case model756proiii:
|
||||
rigCaps.modelName = QString("IC-756 Pro III");
|
||||
|
@ -3938,6 +4088,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.bsr[bandGen] = 0x11;
|
||||
rigCaps.modes = commonModes;
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
|
||||
rigCaps.hasVFOMS = true;
|
||||
rigCaps.hasVFOAB = false;
|
||||
break;
|
||||
case model9100:
|
||||
rigCaps.modelName = QString("IC-9100");
|
||||
|
@ -3952,6 +4104,7 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.hasATU = true;
|
||||
rigCaps.hasDV = true;
|
||||
rigCaps.hasTBPF = true;
|
||||
rigCaps.hasRepeaterModes = true;
|
||||
rigCaps.preamps.push_back('\x01');
|
||||
rigCaps.preamps.push_back('\x02');
|
||||
rigCaps.attenuators.insert(rigCaps.attenuators.end(),{ '\x20' });
|
||||
|
@ -3966,6 +4119,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.bsr[bandGen] = 0x14;
|
||||
rigCaps.modes = commonModes;
|
||||
rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modeDV, 0x17, "DV")});
|
||||
rigCaps.hasVFOMS = true;
|
||||
rigCaps.hasVFOAB = true;
|
||||
break;
|
||||
default:
|
||||
rigCaps.modelName = QString("IC-0x%1").arg(rigCaps.modelID, 2, 16);
|
||||
|
@ -3988,6 +4143,8 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.bands.insert(rigCaps.bands.end(), {bandDef23cm, bandDef4m, bandDef630m, bandDef2200m, bandDefGen});
|
||||
rigCaps.modes = commonModes;
|
||||
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
|
||||
rigCaps.hasVFOMS = true;
|
||||
rigCaps.hasVFOAB = true;
|
||||
qInfo(logRig()) << "Found unknown rig: 0x" << QString("%1").arg(rigCaps.modelID, 2, 16);
|
||||
break;
|
||||
}
|
||||
|
@ -4303,6 +4460,29 @@ void rigCommander::parseFrequency()
|
|||
emit haveFrequency(freq);
|
||||
}
|
||||
|
||||
freqt rigCommander::parseFrequencyRptOffset(QByteArray data)
|
||||
{
|
||||
// VHF 600 KHz:
|
||||
// DATA: 0c 00 60 00 fd
|
||||
// INDEX: 00 01 02 03 04
|
||||
|
||||
// UHF 5 MHz:
|
||||
// DATA: 0c 00 00 05 fd
|
||||
// INDEX: 00 01 02 03 04
|
||||
|
||||
freqt f;
|
||||
f.Hz = 0;
|
||||
|
||||
f.Hz += (data[3] & 0x0f) * 1E6; // 1 MHz
|
||||
f.Hz += ((data[3] & 0xf0) >> 4) * 1E6 * 10; // 10 MHz
|
||||
f.Hz += (data[2] & 0x0f) * 10E3; // 10 KHz
|
||||
f.Hz += ((data[2] & 0xf0) >> 4) * 100E3; // 100 KHz
|
||||
f.Hz += (data[1] & 0x0f) * 100; // 100 Hz
|
||||
f.Hz += ((data[1] & 0xf0) >> 4) * 1000; // 1 KHz
|
||||
|
||||
return f;
|
||||
}
|
||||
|
||||
freqt rigCommander::parseFrequency(QByteArray data, unsigned char lastPosition)
|
||||
{
|
||||
// process payloadIn, which is stripped.
|
||||
|
|
|
@ -71,6 +71,10 @@ public slots:
|
|||
// Frequency, Mode, BSR:
|
||||
void setFrequency(unsigned char vfo, freqt freq);
|
||||
void getFrequency();
|
||||
void selectVFO(vfo_t vfo);
|
||||
void equalizeVFOsAB();
|
||||
void equalizeVFOsMS();
|
||||
void exchangeVFOs();
|
||||
void setMode(unsigned char mode, unsigned char modeFilter);
|
||||
void setMode(mode_info);
|
||||
void getMode();
|
||||
|
@ -134,14 +138,19 @@ public slots:
|
|||
void setDuplexMode(duplexMode dm);
|
||||
void getDuplexMode();
|
||||
void getTransmitFrequency();
|
||||
void setTone(quint16 tone);
|
||||
void setTSQL(quint16 tsql);
|
||||
void setTone(rptrTone_t t);
|
||||
void setTSQL(rptrTone_t t);
|
||||
void setTone(quint16 t);
|
||||
void setTSQL(quint16 t);
|
||||
void getTSQL();
|
||||
void getTone();
|
||||
void setDTCS(quint16 dcscode, bool tinv, bool rinv);
|
||||
void getDTCS();
|
||||
void setRptAccessMode(rptAccessTxRx ratr);
|
||||
void setRptAccessMode(rptrAccessData_t ratr);
|
||||
void getRptAccessMode();
|
||||
void setRptDuplexOffset(freqt f);
|
||||
void getRptDuplexOffset();
|
||||
|
||||
// Get Levels:
|
||||
void getLevels(); // all supported levels
|
||||
|
@ -305,6 +314,7 @@ signals:
|
|||
void haveTone(quint16 tone);
|
||||
void haveTSQL(quint16 tsql);
|
||||
void haveDTCS(quint16 dcscode, bool tinv, bool rinv);
|
||||
void haveRptOffsetFrequency(freqt f);
|
||||
|
||||
// Levels:
|
||||
void haveRfGain(unsigned char level);
|
||||
|
@ -374,6 +384,8 @@ private:
|
|||
QByteArray bcdEncodeInt(unsigned int);
|
||||
void parseFrequency();
|
||||
freqt parseFrequency(QByteArray data, unsigned char lastPosition); // supply index where Mhz is found
|
||||
freqt parseFrequencyRptOffset(QByteArray data);
|
||||
QByteArray makeFreqPayloadRptOffset(freqt freq);
|
||||
QByteArray makeFreqPayload(double frequency);
|
||||
QByteArray makeFreqPayload(freqt freq);
|
||||
QByteArray encodeTone(quint16 tone, bool tinv, bool rinv);
|
||||
|
|
|
@ -134,6 +134,7 @@ struct rigCapabilities {
|
|||
|
||||
bool hasCTCSS;
|
||||
bool hasDTCS;
|
||||
bool hasRepeaterModes = false;
|
||||
|
||||
bool hasTransmit;
|
||||
bool hasPTTCommand;
|
||||
|
@ -147,6 +148,10 @@ struct rigCapabilities {
|
|||
|
||||
bool hasRXAntenna;
|
||||
|
||||
bool hasSpecifyMainSubCmd = false; // 0x29
|
||||
bool hasVFOMS = false;
|
||||
bool hasVFOAB = true; // 0x07 [00||01]
|
||||
|
||||
std::vector <unsigned char> attenuators;
|
||||
std::vector <unsigned char> preamps;
|
||||
std::vector <unsigned char> antennas;
|
||||
|
|
131
wfmain.cpp
131
wfmain.cpp
|
@ -57,10 +57,13 @@ wfmain::wfmain(const QString settingsFile, const QString logFile, bool debugMode
|
|||
qRegisterMetaType<rigCapabilities>();
|
||||
qRegisterMetaType<duplexMode>();
|
||||
qRegisterMetaType<rptAccessTxRx>();
|
||||
qRegisterMetaType<rptrAccessData_t>();
|
||||
qRegisterMetaType<rigInput>();
|
||||
qRegisterMetaType<meterKind>();
|
||||
qRegisterMetaType<spectrumMode>();
|
||||
qRegisterMetaType<freqt>();
|
||||
qRegisterMetaType<vfo_t>();
|
||||
qRegisterMetaType<rptrTone_t>();
|
||||
qRegisterMetaType<mode_info>();
|
||||
qRegisterMetaType<mode_kind>();
|
||||
qRegisterMetaType<audioPacket>();
|
||||
|
@ -343,6 +346,11 @@ void wfmain::rigConnections()
|
|||
connect(this, SIGNAL(setPTT(bool)), rig, SLOT(setPTT(bool)));
|
||||
connect(this, SIGNAL(getPTT()), rig, SLOT(getPTT()));
|
||||
|
||||
connect(this, SIGNAL(selectVFO(vfo_t)), rig, SLOT(selectVFO(vfo_t)));
|
||||
connect(this, SIGNAL(sendVFOSwap()), rig, SLOT(exchangeVFOs()));
|
||||
connect(this, SIGNAL(sendVFOEqualAB()), rig, SLOT(equalizeVFOsAB()));
|
||||
connect(this, SIGNAL(sendVFOEqualMS()), rig, SLOT(equalizeVFOsMS()));
|
||||
|
||||
connect(this, SIGNAL(sendCW(QString)), rig, SLOT(sendCW(QString)));
|
||||
connect(this, SIGNAL(stopCW()), rig, SLOT(sendStopCW()));
|
||||
connect(this, SIGNAL(setKeySpeed(unsigned char)), rig, SLOT(setKeySpeed(unsigned char)));
|
||||
|
@ -376,28 +384,56 @@ void wfmain::rigConnections()
|
|||
connect(rig, SIGNAL(havePassband(quint16)), this, SLOT(receivePassband(quint16)));
|
||||
connect(rig, SIGNAL(haveCwPitch(unsigned char)), this, SLOT(receiveCwPitch(unsigned char)));
|
||||
|
||||
// Repeater, duplex, and split:
|
||||
connect(rpt, SIGNAL(getDuplexMode()), rig, SLOT(getDuplexMode()));
|
||||
connect(rpt, SIGNAL(setDuplexMode(duplexMode)), rig, SLOT(setDuplexMode(duplexMode)));
|
||||
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)));
|
||||
connect(rpt, SIGNAL(getTone()), rig, SLOT(getTone()));
|
||||
connect(rpt, SIGNAL(getTSQL()), rig, SLOT(getTSQL()));
|
||||
connect(rpt, SIGNAL(getDTCS()), rig, SLOT(getDTCS()));
|
||||
connect(rpt, SIGNAL(setTone(quint16)), rig, SLOT(setTone(quint16)));
|
||||
connect(rpt, SIGNAL(setTSQL(quint16)), rig, SLOT(setTSQL(quint16)));
|
||||
|
||||
connect(this->rpt, &repeaterSetup::setTone,
|
||||
[=](const rptrTone_t &t) { issueCmd(cmdSetTone, t);});
|
||||
|
||||
connect(this->rpt, &repeaterSetup::setTSQL,
|
||||
[=](const rptrTone_t &t) { issueCmd(cmdSetTSQL, t);});
|
||||
|
||||
connect(rpt, SIGNAL(setDTCS(quint16,bool,bool)), rig, SLOT(setDTCS(quint16,bool,bool)));
|
||||
connect(rpt, SIGNAL(getRptAccessMode()), rig, SLOT(getRptAccessMode()));
|
||||
connect(rpt, SIGNAL(setRptAccessMode(rptAccessTxRx)), rig, SLOT(setRptAccessMode(rptAccessTxRx)));
|
||||
|
||||
//connect(rpt, SIGNAL(setRptAccessMode(rptAccessTxRx)), rig, SLOT(setRptAccessMode(rptAccessTxRx)));
|
||||
|
||||
connect(this->rpt, &repeaterSetup::setRptAccessMode,
|
||||
[=](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)));
|
||||
|
||||
connect(rig, SIGNAL(haveTone(quint16)), rpt, SLOT(handleTone(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(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->rpt, &repeaterSetup::selectVFO,
|
||||
[=](const vfo_t &v) { issueCmd(cmdSelVFO, v);});
|
||||
connect(this->rpt, &repeaterSetup::equalizeVFOsAB,
|
||||
[=]() { issueDelayedCommand(cmdVFOEqualAB);});
|
||||
connect(this->rpt, &repeaterSetup::equalizeVFOsMS,
|
||||
[=]() { issueDelayedCommand(cmdVFOEqualMS);});
|
||||
connect(this->rpt, &repeaterSetup::swapVFOs,
|
||||
[=]() { issueDelayedCommand(cmdVFOSwap);});
|
||||
connect(this->rpt, &repeaterSetup::setRptDuplexOffset,
|
||||
[=](const freqt &fOffset) { issueCmd(cmdSetRptDuplexOffset, fOffset);});
|
||||
connect(this->rpt, &repeaterSetup::getRptDuplexOffset,
|
||||
[=]() { issueDelayedCommand(cmdGetRptDuplexOffset);});
|
||||
|
||||
connect(this, SIGNAL(setRptDuplexOffset(freqt)), rig, SLOT(setRptDuplexOffset(freqt)));
|
||||
connect(this, SIGNAL(getDuplexMode()), rig, SLOT(getDuplexMode()));
|
||||
|
||||
connect(this, SIGNAL(getPassband()), rig, SLOT(getPassband()));
|
||||
connect(this, SIGNAL(setPassband(quint16)), rig, SLOT(setPassband(quint16)));
|
||||
connect(this, SIGNAL(getCwPitch()), rig, SLOT(getCwPitch()));
|
||||
|
@ -406,8 +442,6 @@ void wfmain::rigConnections()
|
|||
connect(this, SIGNAL(getTone()), rig, SLOT(getTone()));
|
||||
connect(this, SIGNAL(getTSQL()), rig, SLOT(getTSQL()));
|
||||
connect(this, SIGNAL(getRptAccessMode()), rig, SLOT(getRptAccessMode()));
|
||||
//connect(this, SIGNAL(setDuplexMode(duplexMode)), rig, SLOT(setDuplexMode(duplexMode)));
|
||||
//connect(rig, SIGNAL(haveDuplexMode(duplexMode)), this, SLOT(receiveDuplexMode(duplexMode)));
|
||||
|
||||
connect(this, SIGNAL(getModInput(bool)), rig, SLOT(getModInput(bool)));
|
||||
connect(rig, SIGNAL(haveModInput(rigInput,bool)), this, SLOT(receiveModInput(rigInput, bool)));
|
||||
|
@ -3611,6 +3645,12 @@ void wfmain::doCmd(commandtype cmddata)
|
|||
emit setMode(m);
|
||||
break;
|
||||
}
|
||||
case cmdSelVFO:
|
||||
{
|
||||
vfo_t v = (*std::static_pointer_cast<vfo_t>(data));
|
||||
emit selectVFO(v);
|
||||
break;
|
||||
}
|
||||
case cmdSetTxPower:
|
||||
{
|
||||
unsigned char txpower = (*std::static_pointer_cast<unsigned char>(data));
|
||||
|
@ -3672,6 +3712,30 @@ void wfmain::doCmd(commandtype cmddata)
|
|||
emit setTPBFOuter(outerLevel);
|
||||
break;
|
||||
}
|
||||
case cmdSetTone:
|
||||
{
|
||||
rptrTone_t t = (*std::static_pointer_cast<rptrTone_t>(data));
|
||||
emit setTone(t);
|
||||
break;
|
||||
}
|
||||
case cmdSetTSQL:
|
||||
{
|
||||
rptrTone_t t = (*std::static_pointer_cast<rptrTone_t>(data));
|
||||
emit setTSQL(t);
|
||||
break;
|
||||
}
|
||||
case cmdSetRptAccessMode:
|
||||
{
|
||||
rptrAccessData_t rd = (*std::static_pointer_cast<rptrAccessData_t>(data));
|
||||
emit setRepeaterAccessMode(rd);
|
||||
break;
|
||||
}
|
||||
case cmdSetRptDuplexOffset:
|
||||
{
|
||||
freqt f = (*std::static_pointer_cast<freqt>(data));
|
||||
emit setRptDuplexOffset(f);
|
||||
break;
|
||||
}
|
||||
case cmdSetPTT:
|
||||
{
|
||||
bool pttrequest = (*std::static_pointer_cast<bool>(data));
|
||||
|
@ -3800,6 +3864,15 @@ void wfmain::doCmd(cmds cmd)
|
|||
case cmdGetMode:
|
||||
emit getMode();
|
||||
break;
|
||||
case cmdVFOSwap:
|
||||
emit sendVFOSwap();
|
||||
break;
|
||||
case cmdVFOEqualAB:
|
||||
emit sendVFOEqualAB();
|
||||
break;
|
||||
case cmdVFOEqualMS:
|
||||
emit sendVFOEqualMS();
|
||||
break;
|
||||
case cmdGetDataMode:
|
||||
if(rigCaps.hasDataModes)
|
||||
emit getDataMode();
|
||||
|
@ -3833,6 +3906,9 @@ void wfmain::doCmd(cmds cmd)
|
|||
case cmdGetDuplexMode:
|
||||
emit getDuplexMode();
|
||||
break;
|
||||
case cmdGetRptDuplexOffset:
|
||||
emit getRptDuplexOffset();
|
||||
break;
|
||||
case cmdGetPassband:
|
||||
emit getPassband();
|
||||
break;
|
||||
|
@ -4111,6 +4187,30 @@ void wfmain::issueCmd(cmds cmd, freqt f)
|
|||
delayedCmdQue.push_back(cmddata);
|
||||
}
|
||||
|
||||
void wfmain::issueCmd(cmds cmd, vfo_t v)
|
||||
{
|
||||
commandtype cmddata;
|
||||
cmddata.cmd = cmd;
|
||||
cmddata.data = std::shared_ptr<vfo_t>(new vfo_t(v));
|
||||
delayedCmdQue.push_back(cmddata);
|
||||
}
|
||||
|
||||
void wfmain::issueCmd(cmds cmd, rptrTone_t v)
|
||||
{
|
||||
commandtype cmddata;
|
||||
cmddata.cmd = cmd;
|
||||
cmddata.data = std::shared_ptr<rptrTone_t>(new rptrTone_t(v));
|
||||
delayedCmdQue.push_back(cmddata);
|
||||
}
|
||||
|
||||
void wfmain::issueCmd(cmds cmd, rptrAccessData_t rd)
|
||||
{
|
||||
commandtype cmddata;
|
||||
cmddata.cmd = cmd;
|
||||
cmddata.data = std::shared_ptr<rptrAccessData_t>(new rptrAccessData_t(rd));
|
||||
delayedCmdQue.push_back(cmddata);
|
||||
}
|
||||
|
||||
void wfmain::issueCmd(cmds cmd, timekind t)
|
||||
{
|
||||
qDebug(logSystem()) << "Issuing timekind command with data: " << t.hours << " hours, " << t.minutes << " minutes, " << t.isMinus << " isMinus";
|
||||
|
@ -4525,7 +4625,11 @@ void wfmain::initPeriodicCommands()
|
|||
if (rigCaps.hasRXAntenna) {
|
||||
insertSlowPeriodicCommand(cmdGetAntenna, 128);
|
||||
}
|
||||
insertSlowPeriodicCommand(cmdGetDuplexMode, 128);
|
||||
insertSlowPeriodicCommand(cmdGetDuplexMode, 128); // split and repeater
|
||||
if(rigCaps.hasRepeaterModes)
|
||||
{
|
||||
insertSlowPeriodicCommand(cmdGetRptDuplexOffset, 128);
|
||||
}
|
||||
|
||||
rapidPollCmdQueueEnabled = false;
|
||||
rapidPollCmdQueue.clear();
|
||||
|
@ -5393,7 +5497,7 @@ void wfmain::receiveMode(unsigned char mode, unsigned char filter)
|
|||
currentModeInfo.filter = filter;
|
||||
currentModeInfo.reg = mode;
|
||||
rpt->handleUpdateCurrentMainMode(currentModeInfo);
|
||||
|
||||
cw->handleCurrentModeUpdate(currentMode);
|
||||
if (!found)
|
||||
{
|
||||
qWarning(logSystem()) << __func__ << "Received mode " << mode << " but could not match to any index within the modeSelectCombo. ";
|
||||
|
@ -6914,7 +7018,15 @@ void wfmain::on_serialDeviceListCombo_textActivated(const QString &arg1)
|
|||
|
||||
void wfmain::on_rptSetupBtn_clicked()
|
||||
{
|
||||
if(rpt->isMinimized())
|
||||
{
|
||||
rpt->raise();
|
||||
rpt->activateWindow();
|
||||
return;
|
||||
}
|
||||
rpt->show();
|
||||
rpt->raise();
|
||||
rpt->activateWindow();
|
||||
}
|
||||
|
||||
void wfmain::on_attSelCombo_activated(int index)
|
||||
|
@ -7686,7 +7798,8 @@ void wfmain::on_underlayAverageBuffer_toggled(bool checked)
|
|||
void wfmain::on_debugBtn_clicked()
|
||||
{
|
||||
qInfo(logSystem()) << "Debug button pressed.";
|
||||
cw->show();
|
||||
qDebug(logSystem()) << "Query for repeater duplex offset 0x0C headed out";
|
||||
issueDelayedCommand(cmdGetRptDuplexOffset);
|
||||
}
|
||||
|
||||
// ---------- color helper functions: ---------- //
|
||||
|
|
17
wfmain.h
17
wfmain.h
|
@ -94,6 +94,10 @@ signals:
|
|||
void getMode();
|
||||
void setMode(unsigned char modeIndex, unsigned char modeFilter);
|
||||
void setMode(mode_info);
|
||||
void selectVFO(vfo_t vfo);
|
||||
void sendVFOSwap();
|
||||
void sendVFOEqualAB();
|
||||
void sendVFOEqualMS();
|
||||
void setDataMode(bool dataOn, unsigned char filter);
|
||||
void getDataMode();
|
||||
void getModInput(bool dataOn);
|
||||
|
@ -111,6 +115,11 @@ signals:
|
|||
void getTSQL();
|
||||
void getDTCS();
|
||||
void getRptAccessMode();
|
||||
void setRepeaterAccessMode(rptrAccessData_t rd);
|
||||
void setTone(rptrTone_t t);
|
||||
void setTSQL(rptrTone_t t);
|
||||
void setRptDuplexOffset(freqt f);
|
||||
void getRptDuplexOffset();
|
||||
|
||||
// Level get:
|
||||
void getLevels(); // get all levels
|
||||
|
@ -911,6 +920,9 @@ private:
|
|||
|
||||
void issueCmd(cmds cmd, freqt f);
|
||||
void issueCmd(cmds cmd, mode_info m);
|
||||
void issueCmd(cmds cmd, vfo_t v);
|
||||
void issueCmd(cmds cmd, rptrTone_t t);
|
||||
void issueCmd(cmds cmd, rptrAccessData_t rd);
|
||||
void issueCmd(cmds cmd, timekind t);
|
||||
void issueCmd(cmds cmd, datekind d);
|
||||
void issueCmd(cmds cmd, int i);
|
||||
|
@ -1142,6 +1154,7 @@ Q_DECLARE_METATYPE(enum rigInput)
|
|||
Q_DECLARE_METATYPE(enum meterKind)
|
||||
Q_DECLARE_METATYPE(enum spectrumMode)
|
||||
Q_DECLARE_METATYPE(enum mode_kind)
|
||||
Q_DECLARE_METATYPE(enum vfo_t)
|
||||
Q_DECLARE_METATYPE(QList<radio_cap_packet>)
|
||||
Q_DECLARE_METATYPE(QList<spotData>)
|
||||
Q_DECLARE_METATYPE(rigstate*)
|
||||
|
@ -1151,6 +1164,10 @@ Q_DECLARE_METATYPE(QVector <COMMAND>*)
|
|||
Q_DECLARE_METATYPE(const COMMAND*)
|
||||
Q_DECLARE_METATYPE(codecType)
|
||||
Q_DECLARE_METATYPE(errorType)
|
||||
Q_DECLARE_METATYPE(enum duplexMode)
|
||||
Q_DECLARE_METATYPE(enum rptAccessTxRx)
|
||||
Q_DECLARE_METATYPE(struct rptrTone_t)
|
||||
Q_DECLARE_METATYPE(struct rptrAccessData_t)
|
||||
|
||||
//void (*wfmain::logthistext)(QString text) = NULL;
|
||||
|
||||
|
|
|
@ -65,6 +65,47 @@ enum selVFO_t {
|
|||
inactiveVFO = 1
|
||||
};
|
||||
|
||||
enum vfo_t {
|
||||
vfoA=0,
|
||||
vfoB=1,
|
||||
vfoMain = 0xD0,
|
||||
vfoSub = 0xD1
|
||||
};
|
||||
|
||||
struct rptrTone_t {
|
||||
quint16 tone = 0;
|
||||
bool useSecondaryVFO = false;
|
||||
};
|
||||
|
||||
enum duplexMode {
|
||||
dmSplitOff=0x00,
|
||||
dmSplitOn=0x01,
|
||||
dmSimplex=0x10,
|
||||
dmDupMinus=0x11,
|
||||
dmDupPlus=0x12,
|
||||
dmDupRPS=0x13,
|
||||
dmDupAutoOn=0x26,
|
||||
dmDupAutoOff=0x36
|
||||
};
|
||||
|
||||
// Here, T=tone, D=DCS, N=none
|
||||
// And the naming convention order is Transmit Receive
|
||||
enum rptAccessTxRx {
|
||||
ratrNN=0x00,
|
||||
ratrTN=0x01, // "TONE" (T only)
|
||||
ratrNT=0x02, // "TSQL" (R only)
|
||||
ratrDD=0x03, // "DTCS" (TR)
|
||||
ratrDN=0x06, // "DTCS(T)"
|
||||
ratrTD=0x07, // "TONE(T) / TSQL(R)"
|
||||
ratrDT=0x08, // "DTCS(T) / TSQL(R)"
|
||||
ratrTT=0x09 // "TONE(T) / TSQL(R)"
|
||||
};
|
||||
|
||||
struct rptrAccessData_t {
|
||||
rptAccessTxRx accessMode = ratrNN;
|
||||
bool useSecondaryVFO = false;
|
||||
};
|
||||
|
||||
struct mode_info {
|
||||
mode_kind mk;
|
||||
unsigned char reg;
|
||||
|
@ -102,16 +143,19 @@ enum cmds {
|
|||
cmdGetDataMode, cmdSetModeFilter, cmdSetDataModeOn, cmdSetDataModeOff, cmdGetRitEnabled, cmdGetRitValue,
|
||||
cmdSpecOn, cmdSpecOff, cmdDispEnable, cmdDispDisable, cmdGetRxGain, cmdSetRxRfGain, cmdGetAfGain, cmdSetAfGain,
|
||||
cmdGetSql, cmdSetSql, cmdGetIFShift, cmdSetIFShift, cmdGetTPBFInner, cmdSetTPBFInner,
|
||||
cmdGetTPBFOuter, cmdSetTPBFOuter, cmdGetATUStatus, cmdGetPassband, cmdSetPassband,
|
||||
cmdGetTPBFOuter, cmdSetTPBFOuter, cmdGetPassband, cmdSetPassband,
|
||||
cmdGetCwPitch, cmdGetPskTone, cmdGetRttyMark, cmdSetCwPitch, cmdSetPskTone, cmdSetRttyMark,
|
||||
cmdSetATU, cmdStartATU, cmdGetSpectrumMode,
|
||||
cmdGetSpectrumSpan, cmdScopeCenterMode, cmdScopeFixedMode, cmdGetPTT, cmdSetPTT,cmdPTTToggle,
|
||||
cmdSetATU, cmdStartATU, cmdGetATUStatus,
|
||||
cmdGetSpectrumMode, cmdGetSpectrumSpan, cmdScopeCenterMode, cmdScopeFixedMode,
|
||||
cmdGetPTT, cmdSetPTT,cmdPTTToggle,
|
||||
cmdGetTxPower, cmdSetTxPower, cmdGetMicGain, cmdSetMicGain, cmdSetModLevel,
|
||||
cmdGetSpectrumRefLevel, cmdGetDuplexMode, cmdGetModInput, cmdGetModDataInput,
|
||||
cmdGetCurrentModLevel, cmdStartRegularPolling, cmdStopRegularPolling, cmdQueNormalSpeed,
|
||||
cmdGetVdMeter, cmdGetIdMeter, cmdGetSMeter, cmdGetCenterMeter, cmdGetPowerMeter,
|
||||
cmdGetSWRMeter, cmdGetALCMeter, cmdGetCompMeter, cmdGetTxRxMeter,
|
||||
cmdGetTone, cmdGetTSQL, cmdGetDTCS, cmdGetRptAccessMode, cmdGetPreamp, cmdGetAttenuator, cmdGetAntenna,
|
||||
cmdGetTone, cmdGetTSQL, cmdGetDTCS, cmdGetRptAccessMode, cmdSetTone, cmdSetTSQL, cmdSetRptAccessMode, cmdSetRptDuplexOffset, cmdGetRptDuplexOffset,
|
||||
cmdSelVFO, cmdVFOSwap, cmdVFOEqualAB, cmdVFOEqualMS,
|
||||
cmdGetPreamp, cmdGetAttenuator, cmdGetAntenna,
|
||||
cmdGetBandStackReg, cmdGetKeySpeed, cmdSetKeySpeed, cmdGetBreakMode, cmdSetBreakMode, cmdSendCW, cmdStopCW,
|
||||
cmdSetTime, cmdSetDate, cmdSetUTCOffset
|
||||
};
|
||||
|
|
Ładowanie…
Reference in New Issue