Merge branch 'rc28-shuttle'

merge-requests/16/head
Roeland Jansen 2023-01-30 18:53:13 +01:00
commit c89a7bde97
21 zmienionych plików z 1795 dodań i 634 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

@ -45,6 +45,7 @@ struct preferences {
bool enablePTT;
bool niceTS;
bool automaticSidebandSwitching = true;
bool enableUSBControllers;
// LAN:
bool enableLAN;

Wyświetl plik

@ -4,6 +4,7 @@
static const int SIZE = 16;
static const QString greenSS = QString("color: white;border-radius: %1;background-color: qlineargradient(spread:pad, x1:0.145, y1:0.16, x2:1, y2:1, stop:0 rgba(20, 252, 7, 255), stop:1 rgba(25, 134, 5, 255));").arg(SIZE / 2);
static const QString redSS = QString("color: white;border-radius: %1;background-color: qlineargradient(spread:pad, x1:0.145, y1:0.16, x2:0.92, y2:0.988636, stop:0 rgba(255, 12, 12, 255), stop:0.869347 rgba(103, 0, 0, 255));").arg(SIZE / 2);
static const QString rgSplitSS = QString("color: white;border-radius: %1;background-color: qlineargradient(spread:pad, x1:0.4, y1:0.5, x2:0.6, y2:0.5, stop:0 rgba(255, 0, 0, 255), stop:1.0 rgba(0, 255, 0, 255));").arg(SIZE / 2);
static const QString orangeSS = QString("color: white;border-radius: %1;background-color: qlineargradient(spread:pad, x1:0.232, y1:0.272, x2:0.98, y2:0.959773, stop:0 rgba(255, 113, 4, 255), stop:1 rgba(91, 41, 7, 255))").arg(SIZE / 2);
static const QString blueSS = QString("color: white;border-radius: %1;background-color: qlineargradient(spread:pad, x1:0.04, y1:0.0565909, x2:0.799, y2:0.795, stop:0 rgba(203, 220, 255, 255), stop:0.41206 rgba(0, 115, 255, 255), stop:1 rgba(0, 49, 109, 255));").arg(SIZE / 2);
static const QString blankSS = QString("color: white;border-radius: %1;background-color: qlineargradient(spread:pad, x1:0.04, y1:0.0565909, x2:0.799, y2:0.795, stop:0 rgba(203, 220, 255, 0), stop:0.41206 rgba(0, 115, 255, 0), stop:1 rgba(0, 49, 109, 0));").arg(SIZE / 2);
@ -36,6 +37,9 @@ void QLedLabel::setState(State state)
case StateBlank:
setStyleSheet(blankSS);
break;
case StateSplitErrorOk:
setStyleSheet(rgSplitSS);
break;
default:
setStyleSheet(blueSS);
break;

Wyświetl plik

@ -14,6 +14,7 @@ public:
StateOkBlue,
StateWarning,
StateError,
StateSplitErrorOk,
StateBlank
};

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

@ -7,22 +7,13 @@ repeaterSetup::repeaterSetup(QWidget *parent) :
{
ui->setupUi(this);
ui->autoTrackLiveBtn->setEnabled(false); // until we set split enabled.
// populate the CTCSS combo box:
populateTones();
// populate the DCS combo box:
populateDTCS();
#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
}
repeaterSetup::~repeaterSetup()
@ -50,7 +41,6 @@ void repeaterSetup::setRig(rigCapabilities inRig)
ui->toneTone->setDisabled(true);
ui->toneTSQL->setDisabled(true);
}
if(rig.hasDTCS)
{
ui->rptDTCSCombo->setDisabled(false);
@ -63,6 +53,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,29 +279,30 @@ void repeaterSetup::receiveDuplexMode(duplexMode dm)
switch(dm)
{
case dmSplitOff:
ui->splitEnableChk->setChecked(false);
ui->autoTrackLiveBtn->setChecked(false);
ui->splitOffBtn->setChecked(true);
ui->autoTrackLiveBtn->setDisabled(true);
break;
case dmSplitOn:
ui->splitEnableChk->setChecked(true);
ui->rptSimplexBtn->setChecked(false);
ui->rptDupPlusBtn->setChecked(false);
ui->autoTrackLiveBtn->setEnabled(true);
ui->rptDupMinusBtn->setChecked(false);
break;
case dmSimplex:
ui->rptSimplexBtn->setChecked(true);
ui->splitEnableChk->setChecked(false);
ui->autoTrackLiveBtn->setChecked(false);
//ui->splitEnableChk->setChecked(false);
ui->autoTrackLiveBtn->setDisabled(true);
break;
case dmDupPlus:
ui->rptDupPlusBtn->setChecked(true);
ui->splitEnableChk->setChecked(false);
ui->autoTrackLiveBtn->setChecked(false);
//ui->splitEnableChk->setChecked(false);
ui->autoTrackLiveBtn->setDisabled(true);
break;
case dmDupMinus:
ui->rptDupMinusBtn->setChecked(true);
ui->splitEnableChk->setChecked(false);
ui->autoTrackLiveBtn->setChecked(false);
//ui->splitEnableChk->setChecked(false);
ui->autoTrackLiveBtn->setDisabled(true);
break;
default:
qDebug() << "Did not understand duplex/split/repeater value of " << (unsigned char)dm;
@ -321,7 +360,8 @@ void repeaterSetup::handleUpdateCurrentMainFrequency(freqt mainfreq)
if(amTransmitting)
return;
if(ui->autoTrackLiveBtn->isChecked() && !ui->splitOffsetEdit->text().isEmpty())
// Track if autoTrack enabled, split enabled, and there's a split defined.
if(ui->autoTrackLiveBtn->isChecked() && (currentdm == dmSplitOn) && !ui->splitOffsetEdit->text().isEmpty())
{
if(currentMainFrequency.Hz != mainfreq.Hz)
{
@ -333,6 +373,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 +396,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 +409,45 @@ 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);
ui->autoTrackLiveBtn->setEnabled(true);
if(ui->autoTrackLiveBtn->isChecked() && !ui->splitOffsetEdit->text().isEmpty())
{
if(usedPlusSplit)
{
on_splitPlusButton_clicked();
} else {
on_splitMinusBtn_clicked();
}
}
}
void repeaterSetup::on_splitOffBtn_clicked()
{
emit setDuplexMode(dmSplitOff);
ui->autoTrackLiveBtn->setDisabled(true);
}
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 +480,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 +514,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 +594,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 +646,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;
@ -562,7 +686,6 @@ void repeaterSetup::on_splitPlusButton_clicked()
}
}
void repeaterSetup::on_splitMinusBtn_clicked()
{
quint64 hzOffset = getFreqHzFromKHzString(ui->splitOffsetEdit->text());
@ -594,3 +717,97 @@ void repeaterSetup::on_splitTxFreqSetBtn_clicked()
emit setTransmitMode(modeTransmitVFO);
}
}
void repeaterSetup::on_splitTransmitFreqEdit_returnPressed()
{
this->on_splitTxFreqSetBtn_clicked();
}
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);
}
}
void repeaterSetup::on_rptrOffsetEdit_returnPressed()
{
this->on_rptrOffsetSetBtn_clicked();
}

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,41 @@ 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();
void on_rptrOffsetEdit_returnPressed();
void on_splitTransmitFreqEdit_returnPressed();
private:
Ui::repeaterSetup *ui;
freqt currentMainFrequency;

Wyświetl plik

@ -6,62 +6,27 @@
<rect>
<x>0</x>
<y>0</y>
<width>922</width>
<height>217</height>
<width>1071</width>
<height>231</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>1071</width>
<height>230</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>1071</width>
<height>231</height>
</size>
</property>
<property name="windowTitle">
<string>Repeater Setup</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<property name="topMargin">
<number>0</number>
</property>
<item>
<widget class="QPushButton" name="rptReadRigBtn">
<property name="text">
<string>Read Current Settings</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="debugBtn">
<property name="text">
<string>Debug</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
@ -72,6 +37,12 @@
</property>
<item>
<widget class="QGroupBox" name="rptGrpbox">
<property name="maximumSize">
<size>
<width>180</width>
<height>16777215</height>
</size>
</property>
<property name="title">
<string>Repeater Duplex</string>
</property>
@ -116,11 +87,38 @@
</attribute>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_9">
<item>
<widget class="QPushButton" name="rptrOffsetSetBtn">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set the repeater offset for radios using Repeater modes. Only available on radios that have repeater modes. Radios using Split should instead use the provided Split Mode section with a custom Offset. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Set Offset (MHz):</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLineEdit" name="rptrOffsetEdit">
<property name="placeholderText">
<string>Rpt Offset (MHz)</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="splitModeGrpbox">
<property name="maximumSize">
<size>
<width>400</width>
<height>16777215</height>
</size>
</property>
<property name="title">
<string>Split Mode</string>
</property>
@ -128,16 +126,52 @@
<item>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<widget class="QCheckBox" name="splitEnableChk">
<widget class="QRadioButton" name="splitEnableChk">
<property name="toolTip">
<string>Turn on Split</string>
</property>
<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="toolTip">
<string>Turn off Split</string>
</property>
<property name="text">
<string>Split Off</string>
</property>
<attribute name="buttonGroup">
<string notr="true">rptDuplexBtns</string>
</attribute>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_10">
<item>
<widget class="QCheckBox" name="setSplitRptrToneChk">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Click here to automatically set the sub VFO (transmit VFO) tone. Only available on some radios. Other radios may take care of this for you.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Set Rpt Tone</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="autoTrackLiveBtn">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Click here to continually set the transmit VFO to match the receive VFO with the offset accounted for. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Auto Track Live</string>
<string>AutoTrack</string>
</property>
</widget>
</item>
@ -166,10 +200,22 @@
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Enter the desired split offset in KHz.</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="splitPlusButton">
<property name="maximumSize">
<size>
<width>55</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set the transmit frequency to the receive frequency PLUS the offset. Sets the radio sub VFO and also populates the wfview text box (as a convenience). &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Split+</string>
</property>
@ -177,18 +223,20 @@
</item>
<item>
<widget class="QPushButton" name="splitMinusBtn">
<property name="maximumSize">
<size>
<width>55</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set the transmit frequency to the receive frequency PLUS the offset. Sets the radio sub VFO and also populates the wfview text box (as a convenience). &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Split-</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="rptOffsetBtn">
<property name="text">
<string>RPT</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
@ -218,6 +266,15 @@
</item>
<item>
<widget class="QPushButton" name="splitTxFreqSetBtn">
<property name="maximumSize">
<size>
<width>116</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set the transmit frequency manually. Not needed if the Split+ or Split- button was used. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Set</string>
</property>
@ -228,8 +285,109 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="maximumSize">
<size>
<width>220</width>
<height>16777215</height>
</size>
</property>
<property name="title">
<string>VFO</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="1">
<widget class="QPushButton" name="swapABBtn">
<property name="toolTip">
<string>Swap VFO A with VFO B. Some radios do not support this.</string>
</property>
<property name="text">
<string>Swap AB</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="selSubBtn">
<property name="toolTip">
<string>Select the Sub VFO</string>
</property>
<property name="text">
<string>Sel Sub</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="selMainBtn">
<property name="toolTip">
<string>Select the Main VFO</string>
</property>
<property name="text">
<string>Sel Main</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="selBBtn">
<property name="toolTip">
<string>Select VFO B</string>
</property>
<property name="text">
<string>Sel B</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QPushButton" name="selABtn">
<property name="toolTip">
<string>Select VFO A</string>
</property>
<property name="text">
<string>Sel A</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="aEqBBtn">
<property name="toolTip">
<string>Set VFO B to VFO A</string>
</property>
<property name="text">
<string>A=B</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QPushButton" name="mEqSBtn">
<property name="toolTip">
<string>Set the SUB VFO to match the Main VFO</string>
</property>
<property name="text">
<string>M=&gt;S</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="swapMSBtn">
<property name="toolTip">
<string>Swap the Main VFO and Sub VFO</string>
</property>
<property name="text">
<string>Swap MS</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="maximumSize">
<size>
<width>200</width>
<height>16777215</height>
</size>
</property>
<property name="title">
<string>Repeater Tone Type</string>
</property>
@ -274,11 +432,27 @@
</attribute>
</widget>
</item>
<item>
<widget class="QPushButton" name="setRptrSubVFOBtn">
<property name="toolTip">
<string>Set the Tone Mode for the Sub VFO. Not available on all radios.</string>
</property>
<property name="text">
<string>Set Sub VFO</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="maximumSize">
<size>
<width>200</width>
<height>16777215</height>
</size>
</property>
<property name="title">
<string>Tone Selection</string>
</property>
@ -329,6 +503,16 @@
</item>
</layout>
</item>
<item>
<widget class="QPushButton" name="setToneSubVFOBtn">
<property name="toolTip">
<string>Set the Sub VFO to the selected Tone. Not available on all radios and not available for DTCS.</string>
</property>
<property name="text">
<string>Set Sub VFO</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@ -340,7 +524,7 @@
<resources/>
<connections/>
<buttongroups>
<buttongroup name="rptToneBtns"/>
<buttongroup name="rptDuplexBtns"/>
<buttongroup name="rptToneBtns"/>
</buttongroups>
</ui>

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 428 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 428 KiB

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

@ -35,6 +35,7 @@ struct udpPreferences {
QString password;
QString clientName;
quint8 waterfallFormat;
bool halfDuplex;
};
struct networkAudioLevels {

Wyświetl plik

@ -246,7 +246,7 @@ void usbController::run()
void usbController::runTimer()
{
int res=1;
int changeVFO=0;
while (res > 0) {
QByteArray data(HIDDATALENGTH, 0x0);
res = hid_read(handle, (unsigned char*)data.data(), HIDDATALENGTH);
@ -307,14 +307,12 @@ void usbController::runTimer()
{
// Step through all buttons and emit ones that have been pressed.
for (unsigned char i = 0; i < 16; i++)
{
for (BUTTON* but = buttonList->begin(); but != buttonList->end(); but++) {
if (but->dev == usbDevice && but->num == i) {
if ((tempButtons >> i & 1) && !(buttons >> i & 1) && but->onCommand->index > 0)
{
qInfo(logUsbControl()) << "On Button event:" << but->onCommand->text;
@ -343,9 +341,9 @@ void usbController::runTimer()
// Buttons
BUTTON* butptt;
BUTTON* butf1;
BUTTON* butf2;
BUTTON* butptt = Q_NULLPTR;
BUTTON* butf1 = Q_NULLPTR;
BUTTON* butf2 = Q_NULLPTR;;
for (BUTTON* but = buttonList->begin(); but != buttonList->end(); but++) {
if (but->dev == usbDevice) {
@ -370,7 +368,7 @@ void usbController::runTimer()
lastData = data;
}
if (((unsigned char)data[5] == 0x06) && ((unsigned char)lastData[5] != 0x06))
if (butptt != Q_NULLPTR && ((unsigned char)data[5] == 0x06) && ((unsigned char)lastData[5] != 0x06))
{
// TRANSMIT key down only (no other keys down)
qDebug(logUsbControl()) << "PTT key down";
@ -378,7 +376,7 @@ void usbController::runTimer()
emit button(butptt->onCommand);
}
else if (((unsigned char)data[5] != 0x06) && ((unsigned char)lastData[5] == 0x06))
else if (butptt != Q_NULLPTR && ((unsigned char)data[5] != 0x06) && ((unsigned char)lastData[5] == 0x06))
{
// TRANSMIT key up only (no other keys down)
//emit button(false, 6);
@ -386,7 +384,7 @@ void usbController::runTimer()
qInfo(logUsbControl()) << "Off Button event:" << butptt->offCommand->text;
emit button(butptt->offCommand);
}
else if (((unsigned char)data[5] == 0x03) && ((unsigned char)lastData[5] != 0x03))
else if (butf2 != Q_NULLPTR && ((unsigned char)data[5] == 0x03) && ((unsigned char)lastData[5] != 0x03))
{
// F-2 key up only (no other keys down)
//emit button(true, 7);
@ -394,7 +392,7 @@ void usbController::runTimer()
qInfo(logUsbControl()) << "On Button event:" << butf2->onCommand->text;
emit button(butf2->onCommand);
}
else if (((unsigned char)data[5] != 0x03) && ((unsigned char)lastData[5] == 0x03))
else if (butf2 != Q_NULLPTR && ((unsigned char)data[5] != 0x03) && ((unsigned char)lastData[5] == 0x03))
{
// F-2 key down only (no other keys down)
//emit button(false, 7);
@ -402,7 +400,7 @@ void usbController::runTimer()
qInfo(logUsbControl()) << "Off Button event:" << butf2->offCommand->text;
emit button(butf2->offCommand);
}
else if (((unsigned char)data[5] == 0x05) && ((unsigned char)lastData[5] != 0x05))
else if (butf1 != Q_NULLPTR && ((unsigned char)data[5] == 0x05) && ((unsigned char)lastData[5] != 0x05))
{
// F-1 key up only (no other keys down)
//emit button(true, 5);
@ -410,7 +408,7 @@ void usbController::runTimer()
qInfo(logUsbControl()) << "On Button event:" << butf1->onCommand->text;
emit button(butf1->onCommand);
}
else if (((unsigned char)data[5] != 0x05) && ((unsigned char)lastData[5] == 0x05))
else if (butf1 != Q_NULLPTR && ((unsigned char)data[5] != 0x05) && ((unsigned char)lastData[5] == 0x05))
{
// F-1 key down only (no other keys down)
//emit button(false, 5);
@ -421,33 +419,20 @@ void usbController::runTimer()
if ((unsigned char)data[5] == 0x07)
{
// TODO: change of frequency should be multiplied by data[1] or data[4]
// data[1] max value depend on rotation speed I was able to detect was 150 decimal
// data[4] can have 3 values 0 1 or 2 it depends on rotation speed
if ((unsigned char)data[4] > 0x00) {
changeVFO = data[4] * data[1];
} else {
changeVFO = data[1];
}
if ((unsigned char)data[3] == 0x01)
{
//qDebug(logUsbControl()) << "Frequency UP";
//emit jogPlus();
jogCounter = jogCounter + changeVFO;
jogCounter = jogCounter + data[1];
}
else if ((unsigned char)data[3] == 0x02)
{
//qDebug(logUsbControl()) << "Frequency DOWN";
//emit jogMinus();
jogCounter = jogCounter - changeVFO;
jogCounter--;
jogCounter = jogCounter - data[1];
}
}
lastData = data;
}
if (lastusbController.msecsTo(QTime::currentTime()) >= 200 || lastusbController > QTime::currentTime())
if (lastusbController.msecsTo(QTime::currentTime()) >= 100 || lastusbController > QTime::currentTime())
{
if (usbDevice == shuttleXpress || usbDevice == shuttlePro2)
{

Wyświetl plik

@ -37,25 +37,22 @@ using namespace std;
#define HIDDATALENGTH 64
#define MAX_STR 255
enum commandType {normalCommand,bandswitch,modeswitch};
struct COMMAND {
COMMAND() {}
COMMAND(int index, QString text, int command, char suffix) :
index(index), text(text), command(command), suffix(suffix), type(normalCommand){}
COMMAND(int index, QString text, int command, bandType band) :
index(index), text(text), command(command), band(band), type(bandswitch) {}
index(index), text(text), command(command), suffix(suffix) {}
COMMAND(int index, QString text, int command, availableBands band) :
index(index), text(text), command(command), band(band) {}
COMMAND(int index, QString text, int command, mode_kind mode) :
index(index), text(text), command(command), mode(mode), type(modeswitch) {}
index(index), text(text), command(command), mode(mode) {}
int index;
int index=0;
QString text;
int command;
unsigned char suffix;
bandType band;
mode_kind mode;
commandType type;
int command=0;
unsigned char suffix=0x0;
availableBands band=bandGen;
mode_kind mode=modeLSB;
};
struct BUTTON {

Plik diff jest za duży Load Diff

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
@ -383,6 +392,11 @@ private slots:
void on_fEnterBtn_clicked();
void on_usbControllerBtn_clicked();
void on_usbButtonsResetBtn_clicked();
void on_usbCommandsResetBtn_clicked();
void on_enableUsbChk_clicked(bool checked);
void on_scopeBWCombo_currentIndexChanged(int index);
void on_scopeEdgeCombo_currentIndexChanged(int index);
@ -451,6 +465,8 @@ private slots:
void on_passwordTxt_textChanged(QString text);
void on_audioDuplexCombo_currentIndexChanged(int value);
void on_audioOutputCombo_currentIndexChanged(int value);
void on_audioInputCombo_currentIndexChanged(int value);
@ -909,6 +925,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);
@ -1024,6 +1043,7 @@ private:
void insertSlowPeriodicCommand(cmds cmd, unsigned char priority);
void removeSlowPeriodicCommand(cmds cmd);
void calculateTimingParameters();
void changePollTiming(int timing_ms, bool setUI=false);
@ -1036,6 +1056,9 @@ private:
void updateUsbButtons();
void resetUsbButtons();
void resetUsbCommands();
int oldFreqDialVal;
rigCapabilities rigCaps;
@ -1045,7 +1068,8 @@ private:
mode_info currentModeInfo;
bool haveRigCaps;
bool amTransmitting;
bool amTransmitting = false;
bool splitModeEnabled = false;
bool usingDataMode = false;
unsigned char micGain=0;
@ -1101,6 +1125,8 @@ private:
double pbtDefault = 0.0;
quint16 cwPitch = 600;
availableBands lastRequestedBand=bandGen;
SERVERCONFIG serverConfig;
void serverAddUserLine(const QString& user, const QString& pass, const int& type);
@ -1139,6 +1165,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*)
@ -1148,6 +1175,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;

213
wfmain.ui
Wyświetl plik

@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>1082</width>
<width>1012</width>
<height>660</height>
</rect>
</property>
@ -18,7 +18,7 @@
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
<number>3</number>
</property>
<widget class="QWidget" name="mainTab">
<attribute name="title">
@ -1057,7 +1057,7 @@
<string>Show the repeater tone and offset window</string>
</property>
<property name="text">
<string>Repeater</string>
<string>Rpt/Split</string>
</property>
</widget>
</item>
@ -1808,7 +1808,6 @@
<font>
<family>DejaVu Sans Mono</family>
<pointsize>14</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -2233,7 +2232,7 @@
<item>
<widget class="QStackedWidget" name="settingsStack">
<property name="currentIndex">
<number>1</number>
<number>4</number>
</property>
<widget class="QWidget" name="radioAccess">
<layout class="QVBoxLayout" name="verticalLayout_21">
@ -2775,61 +2774,26 @@
</widget>
</item>
<item>
<widget class="QLabel" name="label_15">
<widget class="QLabel" name="label_51">
<property name="text">
<string>Audio Output </string>
<string>Duplex</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="audioOutputCombo">
<property name="maximumSize">
<size>
<width>120</width>
<height>16777215</height>
</size>
</property>
<property name="accessibleName">
<string>Audio Output Selector</string>
</property>
<widget class="QComboBox" name="audioDuplexCombo">
<item>
<property name="text">
<string>Full Duplex</string>
</property>
</item>
<item>
<property name="text">
<string>Half Duplex</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QLabel" name="label_18">
<property name="text">
<string>Audio Input</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="audioInputCombo">
<property name="maximumSize">
<size>
<width>120</width>
<height>16777215</height>
</size>
</property>
<property name="accessibleName">
<string>Audio Input Selector</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_8">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>15</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label_40">
<property name="text">
@ -2871,6 +2835,63 @@
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_47">
<item>
<widget class="QLabel" name="label_15">
<property name="text">
<string>Audio Output </string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="audioOutputCombo">
<property name="maximumSize">
<size>
<width>200</width>
<height>16777215</height>
</size>
</property>
<property name="accessibleName">
<string>Audio Output Selector</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_18">
<property name="text">
<string>Audio Input</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="audioInputCombo">
<property name="maximumSize">
<size>
<width>200</width>
<height>16777215</height>
</size>
</property>
<property name="accessibleName">
<string>Audio Input Selector</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_37">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
@ -3409,8 +3430,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>858</width>
<height>287</height>
<width>790</width>
<height>302</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_2">
@ -4929,6 +4950,74 @@
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_46">
<item>
<widget class="QCheckBox" name="enableUsbChk">
<property name="text">
<string>Enable USB Controllers</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="usbControllerBtn">
<property name="toolTip">
<string/>
</property>
<property name="text">
<string>Setup USB Controller</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_8">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="usbButtonsResetBtn">
<property name="text">
<string>Reset Buttons</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="usbCommandsResetBtn">
<property name="text">
<string>Reset Commands</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="usbResetLbl">
<property name="text">
<string>Only reset buttons/commands if you have issues. </string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_38">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_4">
<property name="orientation">
@ -5233,13 +5322,6 @@
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_45">
<item>
<widget class="QPushButton" name="usbControllerBtn">
<property name="text">
<string>Setup USB Controller</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_361">
<property name="orientation">
@ -5359,7 +5441,6 @@
<widget class="QPushButton" name="exitBtn">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
@ -5378,8 +5459,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>1082</width>
<height>21</height>
<width>1012</width>
<height>22</height>
</rect>
</property>
</widget>
@ -5406,8 +5487,8 @@
<resources/>
<connections/>
<buttongroups>
<buttongroup name="buttonGroup"/>
<buttongroup name="pollingButtonGroup"/>
<buttongroup name="underlayButtonGroup"/>
<buttongroup name="buttonGroup"/>
</buttongroups>
</ui>

Wyświetl plik

@ -10,7 +10,7 @@ QT += core gui serialport network multimedia xml
#DEFINES += USESQL
#Uncomment The following line to enable USB controllers (Shuttle/RC-28 etc.)
#DEFINES += USB_CONTROLLER
DEFINES += USB_CONTROLLER
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport
@ -175,16 +175,17 @@ CONFIG(debug, release|debug) {
}
}
!win32:LIBS += -L./ -l$$QCPLIB -lopus
win32:LIBS += -l$$QCPLIB -lopus
contains(DEFINES,USB_CONTROLLER){
linux:LIBS += -L./ -l$$QCPLIB -lhidapi-libusb
macx:LIBS += -lhidapi
macx:LIBS += -L../hidapi/windows/x64/release -lhidapi
win32:INCLUDEPATH += ../hidapi/hidapi
win32:SOURCES += ../hidapi/windows/hid.c
}
!win32:LIBS += -L./ -l$$QCPLIB -lopus
win32:LIBS += -l$$QCPLIB -lopus
#macx:SOURCES += ../qcustomplot/qcustomplot.cpp
#macx:HEADERS += ../qcustomplot/qcustomplot.h

Wyświetl plik

@ -45,10 +45,10 @@
<QtLastBackgroundBuild>2022-08-21T18:58:23.4329764Z</QtLastBackgroundBuild>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="QtSettings">
<QtLastBackgroundBuild>2023-01-12T19:02:11.7122024Z</QtLastBackgroundBuild>
<QtLastBackgroundBuild>2023-01-29T11:49:00.1257696Z</QtLastBackgroundBuild>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="QtSettings">
<QtLastBackgroundBuild>2023-01-12T19:02:11.0783744Z</QtLastBackgroundBuild>
<QtLastBackgroundBuild>2023-01-29T11:48:59.4191765Z</QtLastBackgroundBuild>
</PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<QtLastBackgroundBuild>2022-08-22T10:47:49.1255783Z</QtLastBackgroundBuild>
@ -60,9 +60,9 @@
<QtLastBackgroundBuild>2022-08-20T19:06:43.4553894Z</QtLastBackgroundBuild>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="QtSettings">
<QtLastBackgroundBuild>2023-01-12T19:02:13.6556090Z</QtLastBackgroundBuild>
<QtLastBackgroundBuild>2023-01-29T11:49:01.5629425Z</QtLastBackgroundBuild>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="QtSettings">
<QtLastBackgroundBuild>2023-01-12T19:02:12.4064183Z</QtLastBackgroundBuild>
<QtLastBackgroundBuild>2023-01-29T11:49:00.7644018Z</QtLastBackgroundBuild>
</PropertyGroup>
</Project>

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,18 +143,22 @@ 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
cmdSetTime, cmdSetDate, cmdSetUTCOffset,
cmdSetBandUp, cmdSetBandDown, cmdSetModeUp, cmdSetModeDown, cmdSetStepUp, cmdSetStepDown, cmdSetSpanUp, cmdSetSpanDown // Only used for USB Controller at the moment.
};
struct commandtype {