Merge branch 'morecontrols' into rc28-shuttle

merge-requests/16/head
Phil Taylor 2023-01-29 16:30:59 +00:00
commit 5926c12a20
11 zmienionych plików z 893 dodań i 156 usunięć

Wyświetl plik

@ -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"/>

Wyświetl plik

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

Wyświetl plik

@ -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);
}
}

Wyświetl plik

@ -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;

Wyświetl plik

@ -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=&gt;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>

Wyświetl plik

@ -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.

Wyświetl plik

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

Wyświetl plik

@ -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;

Wyświetl plik

@ -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: ---------- //

Wyświetl plik

@ -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;

Wyświetl plik

@ -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
};