Merge branch 'band-switching'

failbranch
Roeland Jansen 2023-02-03 18:32:57 +01:00
commit 072ab1967f
18 zmienionych plików z 594 dodań i 291 usunięć

Wyświetl plik

@ -44,8 +44,8 @@ public slots:
void offEventIndexChanged(int index); void offEventIndexChanged(int index);
private: private:
enum { NONE=0, shuttleXpress, shuttlePro2, RC28, xBoxGamepad, unknownGamepad } usbDevice;
usbDeviceType usbDevice = usbNone;
Ui::controllerSetup* ui; Ui::controllerSetup* ui;
QGraphicsScene* scene; QGraphicsScene* scene;
QGraphicsTextItem* textItem; QGraphicsTextItem* textItem;

Wyświetl plik

@ -97,10 +97,10 @@ void cwSender::on_stopBtn_clicked()
ui->statusbar->showMessage("Stopping CW transmission.", 3000); ui->statusbar->showMessage("Stopping CW transmission.", 3000);
} }
void cwSender::on_textToSendEdit_returnPressed() //void cwSender::on_textToSendEdit_returnPressed()
{ //{
on_sendBtn_clicked(); // on_sendBtn_clicked();
} //}
void cwSender::on_breakinCombo_activated(int brkmode) void cwSender::on_breakinCombo_activated(int brkmode)
{ {

Wyświetl plik

@ -45,7 +45,7 @@ private slots:
void on_stopBtn_clicked(); void on_stopBtn_clicked();
void on_textToSendEdit_returnPressed(); //void on_textToSendEdit_returnPressed();
void on_breakinCombo_activated(int index); void on_breakinCombo_activated(int index);

Wyświetl plik

@ -269,9 +269,6 @@
<property name="singleStep"> <property name="singleStep">
<number>5</number> <number>5</number>
</property> </property>
<property name="stepType">
<enum>QAbstractSpinBox::DefaultStepType</enum>
</property>
<property name="value"> <property name="value">
<number>600</number> <number>600</number>
</property> </property>

Wyświetl plik

@ -8,7 +8,7 @@ repeaterSetup::repeaterSetup(QWidget *parent) :
ui->setupUi(this); ui->setupUi(this);
ui->autoTrackLiveBtn->setEnabled(false); // until we set split enabled. ui->autoTrackLiveBtn->setEnabled(false); // until we set split enabled.
ui->warningFMLabel->setVisible(false);
// populate the CTCSS combo box: // populate the CTCSS combo box:
populateTones(); populateTones();
@ -101,6 +101,7 @@ void repeaterSetup::setRig(rigCapabilities inRig)
ui->rptrOffsetSetBtn->setEnabled(rig.hasRepeaterModes); ui->rptrOffsetSetBtn->setEnabled(rig.hasRepeaterModes);
ui->setToneSubVFOBtn->setEnabled(rig.hasSpecifyMainSubCmd); ui->setToneSubVFOBtn->setEnabled(rig.hasSpecifyMainSubCmd);
ui->setRptrSubVFOBtn->setEnabled(rig.hasSpecifyMainSubCmd); ui->setRptrSubVFOBtn->setEnabled(rig.hasSpecifyMainSubCmd);
ui->quickSplitChk->setVisible(rig.hasQuickSplitCommand);
} }
void repeaterSetup::populateTones() void repeaterSetup::populateTones()
@ -313,25 +314,43 @@ void repeaterSetup::receiveDuplexMode(duplexMode dm)
void repeaterSetup::handleRptAccessMode(rptAccessTxRx tmode) void repeaterSetup::handleRptAccessMode(rptAccessTxRx tmode)
{ {
// ratrXY
// X = Transmit (T)one or (N)one or (D)CS
// Y = Receive (T)sql or (N)one or (D)CS
switch(tmode) switch(tmode)
{ {
case ratrNN: case ratrNN:
ui->toneNone->setChecked(true); ui->toneNone->setChecked(true);
break; break;
case ratrTT: case ratrTT:
ui->toneTSQL->setChecked(true); case ratrNT:
break; ui->toneTSQL->setChecked(true);
case ratrTN: break;
ui->toneTone->setChecked(true); case ratrTN:
break; ui->toneTone->setChecked(true);
case ratrDD: break;
ui->toneDTCS->setChecked(true); case ratrDD:
break; ui->toneDTCS->setChecked(true);
default: break;
break; case ratrTONEoff:
ui->toneTone->setChecked(false);
break;
case ratrTONEon:
ui->toneTone->setChecked(true);
break;
case ratrTSQLoff:
ui->toneTSQL->setChecked(false);
break;
case ratrTSQLon:
ui->toneTSQL->setChecked(true);
break;
default:
break;
}
if( !ui->toneTSQL->isChecked() && !ui->toneTone->isChecked() && !ui->toneDTCS->isChecked())
{
ui->toneNone->setChecked(true);
} }
(void)tmode;
} }
void repeaterSetup::handleTone(quint16 tone) void repeaterSetup::handleTone(quint16 tone)
@ -396,6 +415,10 @@ void repeaterSetup::handleUpdateCurrentMainMode(mode_info m)
this->currentModeMain = m; this->currentModeMain = m;
this->modeTransmitVFO = m; this->modeTransmitVFO = m;
this->modeTransmitVFO.VFO = inactiveVFO; this->modeTransmitVFO.VFO = inactiveVFO;
if(m.mk == modeFM)
ui->warningFMLabel->setVisible(false);
else
ui->warningFMLabel->setVisible(true);
} }
} }
@ -480,11 +503,6 @@ void repeaterSetup::on_rptAutoBtn_clicked()
emit setDuplexMode(dmDupAutoOn); emit setDuplexMode(dmDupAutoOn);
} }
void repeaterSetup::on_rptReadRigBtn_clicked()
{
emit getDuplexMode();
}
void repeaterSetup::on_rptToneCombo_activated(int tindex) void repeaterSetup::on_rptToneCombo_activated(int tindex)
{ {
quint16 tone=0; quint16 tone=0;
@ -594,23 +612,6 @@ void repeaterSetup::on_toneDTCS_clicked()
// TODO: DTCS with subband // TODO: DTCS with subband
} }
void repeaterSetup::on_debugBtn_clicked()
{
// TODO: Move these four commands to wfview's startup command list (place at the end)
//emit getTone();
//emit getTSQL();
//emit getDTCS();
emit getRptAccessMode();
}
//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) quint64 repeaterSetup::getFreqHzFromKHzString(QString khz)
{ {
// This function takes a string containing a number in KHz, // This function takes a string containing a number in KHz,
@ -822,3 +823,17 @@ void repeaterSetup::on_rptrOffsetEdit_returnPressed()
{ {
this->on_rptrOffsetSetBtn_clicked(); this->on_rptrOffsetSetBtn_clicked();
} }
void repeaterSetup::on_setSplitRptrToneChk_clicked(bool checked)
{
if(checked)
{
on_setRptrSubVFOBtn_clicked();
on_setToneSubVFOBtn_clicked();
}
}
void repeaterSetup::on_quickSplitChk_clicked(bool checked)
{
emit setQuickSplit(checked);
}

Wyświetl plik

@ -35,6 +35,7 @@ signals:
void getRptDuplexOffset(); void getRptDuplexOffset();
// Split: // Split:
void getSplitModeEnabled(); void getSplitModeEnabled();
void setQuickSplit(bool qsOn);
void getTransmitFrequency(); void getTransmitFrequency();
// Use the duplexMode to communicate split. // Use the duplexMode to communicate split.
// void setSplitModeEnabled(bool splitEnabled); // void setSplitModeEnabled(bool splitEnabled);
@ -65,10 +66,8 @@ private slots:
void on_rptDupPlusBtn_clicked(); void on_rptDupPlusBtn_clicked();
void on_rptDupMinusBtn_clicked(); void on_rptDupMinusBtn_clicked();
void on_rptAutoBtn_clicked(); void on_rptAutoBtn_clicked();
void on_rptReadRigBtn_clicked();
void on_rptToneCombo_activated(int index); void on_rptToneCombo_activated(int index);
void on_rptDTCSCombo_activated(int index); void on_rptDTCSCombo_activated(int index);
void on_debugBtn_clicked();
void on_toneNone_clicked(); void on_toneNone_clicked();
void on_toneTone_clicked(); void on_toneTone_clicked();
void on_toneTSQL_clicked(); void on_toneTSQL_clicked();
@ -108,6 +107,10 @@ private slots:
void on_splitTransmitFreqEdit_returnPressed(); void on_splitTransmitFreqEdit_returnPressed();
void on_setSplitRptrToneChk_clicked(bool checked);
void on_quickSplitChk_clicked(bool checked);
private: private:
Ui::repeaterSetup *ui; Ui::repeaterSetup *ui;
freqt currentMainFrequency; freqt currentMainFrequency;

Wyświetl plik

@ -151,6 +151,13 @@
</attribute> </attribute>
</widget> </widget>
</item> </item>
<item>
<widget class="QCheckBox" name="quickSplitChk">
<property name="text">
<string>QuickSplit</string>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>
@ -163,6 +170,9 @@
<property name="text"> <property name="text">
<string>Set Rpt Tone</string> <string>Set Rpt Tone</string>
</property> </property>
<property name="checked">
<bool>true</bool>
</property>
</widget> </widget>
</item> </item>
<item> <item>
@ -392,6 +402,13 @@
<string>Repeater Tone Type</string> <string>Repeater Tone Type</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLabel" name="warningFMLabel">
<property name="text">
<string>Only available in FM</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QRadioButton" name="toneNone"> <widget class="QRadioButton" name="toneNone">
<property name="text"> <property name="text">

Wyświetl plik

@ -935,6 +935,16 @@ void rigCommander::getDuplexMode()
prepDataAndSend(payload); prepDataAndSend(payload);
} }
void rigCommander::setQuickSplit(bool qsOn)
{
if(rigCaps.hasQuickSplitCommand)
{
QByteArray payload = rigCaps.quickSplitCommand;
payload.append((unsigned char)qsOn);
prepDataAndSend(payload);
}
}
void rigCommander::setPassband(quint16 pass) void rigCommander::setPassband(quint16 pass)
{ {
QByteArray payload; QByteArray payload;
@ -1062,7 +1072,7 @@ void rigCommander::setTone(rptrTone_t t)
{ {
qDebug(logRig()) << "Sending TONE to secondary VFO"; qDebug(logRig()) << "Sending TONE to secondary VFO";
payload.prepend("\x29\x01"); payload.prepend("\x29\x01");
printHex(payload); //printHex(payload);
} }
prepDataAndSend(payload); prepDataAndSend(payload);
@ -1089,7 +1099,7 @@ void rigCommander::setTSQL(rptrTone_t t)
{ {
qDebug(logRig()) << "Sending TSQL to secondary VFO"; qDebug(logRig()) << "Sending TSQL to secondary VFO";
payload.prepend("\x29\x01"); payload.prepend("\x29\x01");
printHex(payload); //printHex(payload);
} }
prepDataAndSend(payload); prepDataAndSend(payload);
@ -1105,7 +1115,7 @@ void rigCommander::setDTCS(quint16 dcscode, bool tinv, bool rinv)
payload.append(denc); payload.append(denc);
//qInfo() << __func__ << "DTCS encoded payload: "; //qInfo() << __func__ << "DTCS encoded payload: ";
printHex(payload); //printHex(payload);
prepDataAndSend(payload); prepDataAndSend(payload);
} }
@ -1206,10 +1216,56 @@ void rigCommander::setRptAccessMode(rptAccessTxRx ratr)
void rigCommander::setRptAccessMode(rptrAccessData_t rd) void rigCommander::setRptAccessMode(rptrAccessData_t rd)
{ {
// NB: This function is the only recommended
// function to be used for toggling tone and tone squelch.
QByteArray payload; QByteArray payload;
payload.setRawData("\x16\x5D", 2); if(rigCaps.hasAdvancedRptrToneCmds)
payload.append((unsigned char)rd.accessMode); {
if(rd.useSecondaryVFO) // IC-9700 basically
payload.setRawData("\x16\x5D", 2);
payload.append((unsigned char)rd.accessMode);
} else {
// These radios either don't support DCS or
// we just haven't added DCS yet.
// 16 42 00 = TONE off
// 16 42 01 = TONE on
// 16 43 00 = TSQL off
// 16 43 01 = TSQL on
switch(rd.accessMode)
{
case ratrNN:
// No tone at all
if(rd.turnOffTone)
{
payload.append("\x16\x42\x00", 3); // TONE off
} else if (rd.turnOffTSQL)
{
payload.append("\x16\x43\x00", 3); // TSQL off
}
break;
case ratrTN:
// TONE on transmit only
payload.append("\x16\x42\x01", 3); // TONE on
break;
case ratrTT:
// Tone on transmit and TSQL
payload.append("\x16\x43\x01", 3); // TSQL on
break;
case ratrNT:
// Tone squelch and no tone transmit:
payload.append("\x16\x43\x01", 3); // TSQL on, close enough here.
// payload.append("\x16\x42\x00", 3); // TONE off
break;
default:
qWarning(logRig()) << "Cannot set tone mode" << (unsigned char)rd.accessMode << "on rig model" << rigCaps.modelName;
return;
}
}
if(rd.useSecondaryVFO && rigCaps.hasSpecifyMainSubCmd)
{ {
payload.prepend("\x29\x01"); payload.prepend("\x29\x01");
} }
@ -1224,8 +1280,8 @@ void rigCommander::setRptDuplexOffset(freqt f)
QByteArray freqPayload = makeFreqPayload(f); QByteArray freqPayload = makeFreqPayload(f);
payload.append(freqPayload.mid(1, 3)); payload.append(freqPayload.mid(1, 3));
//qInfo(logRig()) << "Here is potential repeater offset setting, not sending to radio:"; //qInfo(logRig()) << "Here is potential repeater offset setting, not sending to radio:";
printHexNow(payload, logRig()); //printHexNow(payload, logRig());
QString g = getHex(payload); //QString g = getHex(payload);
//qInfo(logRig()).noquote().nospace() << g; //qInfo(logRig()).noquote().nospace() << g;
prepDataAndSend(payload); prepDataAndSend(payload);
} }
@ -1319,6 +1375,7 @@ void rigCommander::sendCW(QString textToSend)
QByteArray textData = textToSend.toLocal8Bit(); QByteArray textData = textToSend.toLocal8Bit();
unsigned char p=0; unsigned char p=0;
bool printout=false;
for(int c=0; c < textData.length(); c++) for(int c=0; c < textData.length(); c++)
{ {
p = textData.at(c); p = textData.at(c);
@ -1334,10 +1391,12 @@ void rigCommander::sendCW(QString textToSend)
// Allowed character, continue // Allowed character, continue
} else { } else {
qWarning(logRig()) << "Invalid character detected in CW message at position " << c << ", the character is " << textToSend.at(c); qWarning(logRig()) << "Invalid character detected in CW message at position " << c << ", the character is " << textToSend.at(c);
printHex(textData); printout = true;
textData[c] = 0x3F; // "?" textData[c] = 0x3F; // "?"
} }
} }
if(printout)
printHex(textData);
if(pttAllowed) if(pttAllowed)
{ {
@ -2888,6 +2947,7 @@ void rigCommander::parseRegister16()
//"INDEX: 00 01 02 03 " //"INDEX: 00 01 02 03 "
//"DATA: 16 5d 00 fd " //"DATA: 16 5d 00 fd "
// ^-- mode info here // ^-- mode info here
rptAccessTxRx ra;
switch(payloadIn.at(1)) switch(payloadIn.at(1))
{ {
@ -2910,9 +2970,23 @@ void rigCommander::parseRegister16()
break; break;
case '\x42': case '\x42':
state.set(TONEFUNC, payloadIn.at(2) != 0, false); state.set(TONEFUNC, payloadIn.at(2) != 0, false);
if(payloadIn.at(2)==1)
{
ra = ratrTONEon;
} else {
ra = ratrTONEoff;
}
emit haveRptAccessMode(ra);
break; break;
case '\x43': case '\x43':
state.set(TSQLFUNC, payloadIn.at(2) != 0, false); state.set(TSQLFUNC, payloadIn.at(2) != 0, false);
if(payloadIn.at(2)==1)
{
ra = ratrTSQLon;
} else {
ra = ratrTSQLoff;
}
emit haveRptAccessMode(ra);
break; break;
case '\x44': case '\x44':
state.set(COMPFUNC, payloadIn.at(2) != 0, false); state.set(COMPFUNC, payloadIn.at(2) != 0, false);
@ -3275,7 +3349,7 @@ void rigCommander::parseWFData()
// read edge mode center in edge mode // read edge mode center in edge mode
emit haveScopeEdge((char)payloadIn[2]); emit haveScopeEdge((char)payloadIn[2]);
//qInfo(logRig()) << "Received 0x16 edge in center mode:"; //qInfo(logRig()) << "Received 0x16 edge in center mode:";
printHex(payloadIn, false, true); //printHex(payloadIn, false, true);
// [1] 0x16 // [1] 0x16
// [2] 0x01, 0x02, 0x03: Edge 1,2,3 // [2] 0x01, 0x02, 0x03: Edge 1,2,3
break; break;
@ -3348,8 +3422,8 @@ void rigCommander::determineRigCaps()
bandType bandDefGen(bandGen, 10000, 30000000, modeAM); bandType bandDefGen(bandGen, 10000, 30000000, modeAM);
standardHF = { bandDef6m, bandDef10m, bandDef12m, bandDef15m, bandDef17m, standardHF = { bandDef160m, bandDef80m, bandDef60m, bandDef40m, bandDef30m,
bandDef20m, bandDef30m, bandDef40m, bandDef60m, bandDef80m, bandDef160m}; bandDef20m, bandDef17m, bandDef15m, bandDef12m, bandDef10m, bandDef6m };
standardVU = { bandDef2m, bandDef70cm }; standardVU = { bandDef2m, bandDef70cm };
@ -3459,6 +3533,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x71"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x71");
rigCaps.hasVFOMS = false; rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x30");
break; break;
case modelR8600: case modelR8600:
rigCaps.modelName = QString("IC-R8600"); rigCaps.modelName = QString("IC-R8600");
@ -3531,6 +3607,9 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x27"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x27");
rigCaps.hasVFOMS = true; rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasAdvancedRptrToneCmds = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x43");
break; break;
case model910h: case model910h:
rigCaps.modelName = QString("IC-910H"); rigCaps.modelName = QString("IC-910H");
@ -3585,6 +3664,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x97"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x97");
rigCaps.hasVFOMS = true; rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = false; rigCaps.hasVFOAB = false;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x64");
break; break;
case model7610: case model7610:
rigCaps.modelName = QString("IC-7610"); rigCaps.modelName = QString("IC-7610");
@ -3619,6 +3700,8 @@ void rigCommander::determineRigCaps()
rigCaps.hasRXAntenna = true; rigCaps.hasRXAntenna = true;
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x12"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x12");
rigCaps.hasSpecifyMainSubCmd = true; rigCaps.hasSpecifyMainSubCmd = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x33");
rigCaps.hasVFOMS = true; rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = false; rigCaps.hasVFOAB = false;
break; break;
@ -3654,6 +3737,8 @@ void rigCommander::determineRigCaps()
rigCaps.hasRXAntenna = true; rigCaps.hasRXAntenna = true;
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x55"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x55");
rigCaps.hasSpecifyMainSubCmd = true; rigCaps.hasSpecifyMainSubCmd = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x01\x13");
rigCaps.hasVFOMS = true; rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = false; rigCaps.hasVFOAB = false;
break; break;
@ -3693,6 +3778,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x31"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x31");
rigCaps.hasVFOMS = false; rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x45");
break; break;
case model7000: case model7000:
rigCaps.modelName = QString("IC-7000"); rigCaps.modelName = QString("IC-7000");
@ -3719,6 +3806,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x92"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x92");
rigCaps.hasVFOMS = false; rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x52");
break; break;
case model7410: case model7410:
rigCaps.modelName = QString("IC-7410"); rigCaps.modelName = QString("IC-7410");
@ -3744,6 +3833,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x40"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x40");
rigCaps.hasVFOMS = false; rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x11");
break; break;
case model7100: case model7100:
rigCaps.modelName = QString("IC-7100"); rigCaps.modelName = QString("IC-7100");
@ -3775,6 +3866,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x95"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x95");
rigCaps.hasVFOMS = false; rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x15");
break; break;
case model7200: case model7200:
rigCaps.modelName = QString("IC-7200"); rigCaps.modelName = QString("IC-7200");
@ -3799,6 +3892,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x03\x48"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x03\x48");
rigCaps.hasVFOMS = false; rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x03\x18");
break; break;
case model7700: case model7700:
rigCaps.modelName = QString("IC-7700"); rigCaps.modelName = QString("IC-7700");
@ -3827,6 +3922,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x95"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x95");
rigCaps.hasVFOMS = false; rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x67");
break; break;
case model703: case model703:
rigCaps.modelName = QString("IC-703"); rigCaps.modelName = QString("IC-703");
@ -4067,6 +4164,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
rigCaps.hasVFOMS = true; rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = false; rigCaps.hasVFOAB = false;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x24");
break; break;
case model756proiii: case model756proiii:
rigCaps.modelName = QString("IC-756 Pro III"); rigCaps.modelName = QString("IC-756 Pro III");
@ -4090,6 +4189,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00"); rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
rigCaps.hasVFOMS = true; rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = false; rigCaps.hasVFOAB = false;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x24");
break; break;
case model9100: case model9100:
rigCaps.modelName = QString("IC-9100"); rigCaps.modelName = QString("IC-9100");
@ -4121,6 +4222,8 @@ void rigCommander::determineRigCaps()
rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modeDV, 0x17, "DV")}); rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modeDV, 0x17, "DV")});
rigCaps.hasVFOMS = true; rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = true; rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x14");
break; break;
default: default:
rigCaps.modelName = QString("IC-0x%1").arg(rigCaps.modelID, 2, 16); rigCaps.modelName = QString("IC-0x%1").arg(rigCaps.modelID, 2, 16);
@ -4244,6 +4347,17 @@ void rigCommander::parseSpectrum()
return; return;
} }
if(payloadIn.length() >= 15)
{
bool outOfRange = (bool)payloadIn[16];
if(outOfRange != wasOutOfRange)
{
emit haveScopeOutOfRange(outOfRange);
wasOutOfRange = outOfRange;
return;
}
}
// unsigned char waveInfo = payloadIn[06]; // really just one byte? // unsigned char waveInfo = payloadIn[06]; // really just one byte?
//qInfo(logRig()) << "Spectrum Data received: " << sequence << "/" << sequenceMax << " mode: " << scopeMode << " waveInfo: " << waveInfo << " length: " << payloadIn.length(); //qInfo(logRig()) << "Spectrum Data received: " << sequence << "/" << sequenceMax << " mode: " << scopeMode << " waveInfo: " << waveInfo << " length: " << payloadIn.length();
@ -4774,7 +4888,7 @@ void rigCommander::setToneSql(bool enabled)
prepDataAndSend(payload); prepDataAndSend(payload);
} }
void rigCommander::getToneSql() void rigCommander::getToneSqlEnabled()
{ {
QByteArray payload; QByteArray payload;
payload.setRawData("\x16\x43", 2); payload.setRawData("\x16\x43", 2);
@ -5152,7 +5266,7 @@ void rigCommander::stateUpdated()
if (i.value()._valid) { if (i.value()._valid) {
setToneSql(state.getBool(TSQLFUNC)); setToneSql(state.getBool(TSQLFUNC));
} }
getToneSql(); getToneSqlEnabled();
break; break;
case COMPFUNC: case COMPFUNC:
if (i.value()._valid) { if (i.value()._valid) {

Wyświetl plik

@ -112,7 +112,7 @@ public slots:
void setToneEnabled(bool enabled); void setToneEnabled(bool enabled);
void getToneEnabled(); void getToneEnabled();
void setToneSql(bool enabled); void setToneSql(bool enabled);
void getToneSql(); void getToneSqlEnabled();
void setCompressor(bool enabled); void setCompressor(bool enabled);
void getCompressor(); void getCompressor();
void setMonitor(bool enabled); void setMonitor(bool enabled);
@ -137,6 +137,7 @@ public slots:
// Repeater: // Repeater:
void setDuplexMode(duplexMode dm); void setDuplexMode(duplexMode dm);
void getDuplexMode(); void getDuplexMode();
void setQuickSplit(bool qsOn);
void getTransmitFrequency(); void getTransmitFrequency();
void setTone(rptrTone_t t); void setTone(rptrTone_t t);
void setTSQL(rptrTone_t t); void setTSQL(rptrTone_t t);
@ -291,6 +292,7 @@ signals:
void haveSpectrumMode(spectrumMode spectmode); void haveSpectrumMode(spectrumMode spectmode);
void haveScopeEdge(char edge); void haveScopeEdge(char edge);
void haveSpectrumRefLevel(int level); void haveSpectrumRefLevel(int level);
void haveScopeOutOfRange(bool outOfRange);
// Rig ID: // Rig ID:
void haveRigID(rigCapabilities rigCaps); void haveRigID(rigCapabilities rigCaps);
@ -457,6 +459,7 @@ private:
quint16 spectAmpMax; quint16 spectAmpMax;
quint16 spectLenMax; quint16 spectLenMax;
spectrumMode oldScopeMode; spectrumMode oldScopeMode;
bool wasOutOfRange = false;
bool usingNativeLAN; // indicates using OEM LAN connection (705,7610,9700,7850) bool usingNativeLAN; // indicates using OEM LAN connection (705,7610,9700,7850)
bool lookingForRig; bool lookingForRig;

Wyświetl plik

@ -152,6 +152,10 @@ struct rigCapabilities {
bool hasVFOMS = false; bool hasVFOMS = false;
bool hasVFOAB = true; // 0x07 [00||01] bool hasVFOAB = true; // 0x07 [00||01]
bool hasAdvancedRptrToneCmds = false;
bool hasQuickSplitCommand = false;
QByteArray quickSplitCommand;
std::vector <unsigned char> attenuators; std::vector <unsigned char> attenuators;
std::vector <unsigned char> preamps; std::vector <unsigned char> preamps;
std::vector <unsigned char> antennas; std::vector <unsigned char> antennas;

Wyświetl plik

@ -429,11 +429,12 @@ void udpBase::sendTrackedPacket(QByteArray d)
udpMutex.lock(); udpMutex.lock();
udp->writeDatagram(d, radioIP, port); udp->writeDatagram(d, radioIP, port);
if (congestion > 10) { // Poor quality connection?
/*if (congestion > 10) { // Poor quality connection?
udp->writeDatagram(d, radioIP, port); udp->writeDatagram(d, radioIP, port);
if (congestion > 20) // Even worse so send again. if (congestion > 20) // Even worse so send again.
udp->writeDatagram(d, radioIP, port); udp->writeDatagram(d, radioIP, port);
} } */
if (idleTimer != Q_NULLPTR && idleTimer->isActive()) { if (idleTimer != Q_NULLPTR && idleTimer->isActive()) {
idleTimer->start(IDLE_PERIOD); // Reset idle counter if it's running idleTimer->start(IDLE_PERIOD); // Reset idle counter if it's running
} }

Wyświetl plik

@ -18,6 +18,7 @@ usbController::usbController()
usbController::~usbController() usbController::~usbController()
{ {
qInfo(logUsbControl) << "Ending usbController()"; qInfo(logUsbControl) << "Ending usbController()";
ledControl(false, 3);
hid_close(handle); hid_close(handle);
hid_exit(); hid_exit();
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0)) #if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
@ -45,32 +46,6 @@ void usbController::receiveButtons(QVector<BUTTON>* buts)
buttonList = buts; buttonList = buts;
} }
int usbController::hidApiWrite(unsigned char* data, unsigned char length)
{
Q_UNUSED(data);
Q_UNUSED(length);
/* int res;
unsigned char realData[length + 1];
realData[0] = length;
int i;
for (i = 0; i < length; i++)
{
realData[i + 1] = data[i];
}
res = hid_write(handle, realData, length + 1);
if (res < 0) {
printf("Unable to write()\n");
printf("Error: %ls\n", hid_error(handle));
return -1;
}
printf("write success\n");
*/
return 0;
}
void usbController::run() void usbController::run()
{ {
@ -192,10 +167,15 @@ void usbController::run()
if (!handle) { if (!handle) {
handle = hid_open(0x0c26, 0x001e, NULL); handle = hid_open(0x0c26, 0x001e, NULL);
if (!handle) { if (!handle) {
usbDevice = NONE; usbDevice = usbNone;
} }
else { else {
usbDevice = RC28; usbDevice = RC28;
getVersion();
ledControl(false, 0);
ledControl(false, 1);
ledControl(false, 2);
ledControl(true, 3);
} }
} }
else { else {
@ -246,7 +226,7 @@ void usbController::run()
void usbController::runTimer() void usbController::runTimer()
{ {
int res=1; int res=1;
while (res > 0) { while (res > 0) {
QByteArray data(HIDDATALENGTH, 0x0); QByteArray data(HIDDATALENGTH, 0x0);
res = hid_read(handle, (unsigned char*)data.data(), HIDDATALENGTH); res = hid_read(handle, (unsigned char*)data.data(), HIDDATALENGTH);
@ -336,100 +316,111 @@ void usbController::runTimer()
else if ((res > 31) && usbDevice == RC28) else if ((res > 31) && usbDevice == RC28)
{ {
// This is a response from the Icom RC28 // This is a response from the Icom RC28
data.resize(8); // Might as well get rid of the unused data. if ((unsigned char)data[0] == 0x02) {
qInfo(logUsbControl()) << QString("Received RC-28 Firmware Version: %0").arg(QString(data.mid(1,data.indexOf(" ")-1)));
}
else
{
data.resize(8);
// Buttons
BUTTON* butptt = Q_NULLPTR;
BUTTON* butf1 = Q_NULLPTR;
BUTTON* butf2 = Q_NULLPTR;;
// Buttons //delayedCmdQue.erase(std::remove_if(delayedCmdQue.begin() + 1, delayedCmdQue.end(), [cmd](const commandtype& c) { return (c.cmd == cmd); }),
BUTTON* butptt = Q_NULLPTR; for (BUTTON* but = buttonList->begin(); but != buttonList->end(); but++) {
BUTTON* butf1 = Q_NULLPTR; if (but->dev == usbDevice) {
BUTTON* butf2 = Q_NULLPTR;;
for (BUTTON* but = buttonList->begin(); but != buttonList->end(); but++) { if (but->num == 0)
if (but->dev == usbDevice) { {
butptt = but;
if (but->num == 0) }
{ else if (but->num == 1)
butptt = but; {
} butf1 = but;
else if (but->num == 1) }
{ else if (but->num == 2)
butf1 = but; {
} butf2 = but;
else if (but->num == 2) }
{
butf2 = but;
} }
} }
}
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";
qInfo(logUsbControl()) << "On Button event:" << butptt->onCommand->text;
ledControl(true, 0);
emit button(butptt->onCommand);
}
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);
qDebug(logUsbControl()) << "PTT key up";
qInfo(logUsbControl()) << "Off Button event:" << butptt->offCommand->text;
ledControl(false, 0);
emit button(butptt->offCommand);
}
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);
qDebug(logUsbControl()) << "F-1 key down";
qInfo(logUsbControl()) << "On Button event:" << butf1->onCommand->text;
ledControl(true, 1);
emit button(butf1->onCommand);
}
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);
qDebug(logUsbControl()) << "F-1 key up";
qInfo(logUsbControl()) << "Off Button event:" << butf1->offCommand->text;
ledControl(false, 1);
emit button(butf1->offCommand);
}
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);
qDebug(logUsbControl()) << "F-2 key down";
qInfo(logUsbControl()) << "On Button event:" << butf2->onCommand->text;
ledControl(true, 2);
emit button(butf2->onCommand);
}
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);
qDebug(logUsbControl()) << "F-2 key up";
qInfo(logUsbControl()) << "Off Button event:" << butf2->offCommand->text;
ledControl(false, 2);
emit button(butf2->offCommand);
}
if ((unsigned char)data[5] == 0x07)
{
if ((unsigned char)data[3] == 0x01)
{
jogCounter = jogCounter + data[1];
}
else if ((unsigned char)data[3] == 0x02)
{
jogCounter = jogCounter - data[1];
}
}
if (lastData.size() != 8) {
lastData = data; lastData = data;
} }
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";
qInfo(logUsbControl()) << "On Button event:" << butptt->onCommand->text;
emit button(butptt->onCommand);
}
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);
qDebug(logUsbControl()) << "PTT key up";
qInfo(logUsbControl()) << "Off Button event:" << butptt->offCommand->text;
emit button(butptt->offCommand);
}
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);
qDebug(logUsbControl()) << "F-2 key up";
qInfo(logUsbControl()) << "On Button event:" << butf2->onCommand->text;
emit button(butf2->onCommand);
}
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);
qDebug(logUsbControl()) << "F-2 key down";
qInfo(logUsbControl()) << "Off Button event:" << butf2->offCommand->text;
emit button(butf2->offCommand);
}
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);
qDebug(logUsbControl()) << "F-1 key up";
qInfo(logUsbControl()) << "On Button event:" << butf1->onCommand->text;
emit button(butf1->onCommand);
}
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);
qDebug(logUsbControl()) << "F-1 key down";
qInfo(logUsbControl()) << "Off Button event:" << butf1->offCommand->text;
emit button(butf1->offCommand);
}
if ((unsigned char)data[5] == 0x07)
{
if ((unsigned char)data[3] == 0x01)
{
jogCounter = jogCounter + data[1];
}
else if ((unsigned char)data[3] == 0x02)
{
jogCounter = jogCounter - data[1];
}
}
lastData = data;
} }
if (lastusbController.msecsTo(QTime::currentTime()) >= 100 || lastusbController > QTime::currentTime()) if (lastusbController.msecsTo(QTime::currentTime()) >= 100 || lastusbController > QTime::currentTime())
@ -466,16 +457,17 @@ void usbController::runTimer()
void usbController::ledControl(bool on, unsigned char num) void usbController::ledControl(bool on, unsigned char num)
{ {
if (usbDevice == RC28) { if (usbDevice == RC28) {
QByteArray data(9, 0x0); QByteArray data(3, 0x0);
data[0] = 8;
data[1] = 0x01; data[1] = 0x01;
unsigned char ledNum = 0x07; static unsigned char ledNum = 0x07;
if (on) if (on)
ledNum &= ~(1ULL << (num - 1)); ledNum &= ~(1UL << num);
else
ledNum |= 1UL << num;
data[2] = ledNum; data[2] = ledNum;
int res = hid_write(handle, (const unsigned char*)data.constData(), 8); int res = hid_write(handle, (const unsigned char*)data.constData(), data.size());
if (res < 0) { if (res < 0) {
qDebug(logUsbControl()) << "Unable to write(), Error:" << hid_error(handle); qDebug(logUsbControl()) << "Unable to write(), Error:" << hid_error(handle);
@ -486,6 +478,17 @@ void usbController::ledControl(bool on, unsigned char num)
} }
} }
void usbController::getVersion()
{
QByteArray data(64, 0x0);
data[0] = 63;
data[1] = 0x02;
int res = hid_write(handle, (const unsigned char*)data.constData(), data.size());
if (res < 0) {
qDebug(logUsbControl()) << "Unable to write(), Error:" << hid_error(handle);
}
}
void usbController::buttonState(QString name, bool val) void usbController::buttonState(QString name, bool val)
{ {
for (BUTTON* but = buttonList->begin(); but != buttonList->end(); but++) { for (BUTTON* but = buttonList->begin(); but != buttonList->end(); but++) {

Wyświetl plik

@ -85,7 +85,6 @@ class usbController : public QObject
public: public:
usbController(); usbController();
~usbController(); ~usbController();
int hidApiWrite(unsigned char* data, unsigned char length);
public slots: public slots:
void init(); void init();
@ -94,6 +93,7 @@ public slots:
void ledControl(bool on, unsigned char num); void ledControl(bool on, unsigned char num);
void receiveCommands(QVector<COMMAND>*); void receiveCommands(QVector<COMMAND>*);
void receiveButtons(QVector<BUTTON>*); void receiveButtons(QVector<BUTTON>*);
void getVersion();
signals: signals:
void jogPlus(); void jogPlus();
@ -106,7 +106,6 @@ signals:
private: private:
hid_device* handle; hid_device* handle;
enum { NONE=0, shuttleXpress, shuttlePro2, RC28, xBoxGamepad, unknownGamepad }usbDevice;
bool isOpen=false; bool isOpen=false;
unsigned int buttons=0; unsigned int buttons=0;
unsigned char jogpos=0; unsigned char jogpos=0;
@ -114,7 +113,7 @@ private:
unsigned char shutMult = 0; unsigned char shutMult = 0;
int jogCounter = 0; int jogCounter = 0;
QTime lastusbController = QTime::currentTime(); QTime lastusbController = QTime::currentTime();
QByteArray lastData=""; QByteArray lastData = QByteArray(8,0x0);
unsigned char lastDialPos=0; unsigned char lastDialPos=0;
QVector<BUTTON>* buttonList; QVector<BUTTON>* buttonList;
QVector<COMMAND>* commands = Q_NULLPTR; QVector<COMMAND>* commands = Q_NULLPTR;
@ -126,7 +125,7 @@ private:
#endif #endif
void buttonState(QString but, bool val); void buttonState(QString but, bool val);
void buttonState(QString but, double val); void buttonState(QString but, double val);
usbDeviceType usbDevice = usbNone;
protected: protected:
}; };

Wyświetl plik

@ -389,6 +389,8 @@ void wfmain::rigConnections()
connect(rig, SIGNAL(haveDuplexMode(duplexMode)), rpt, SLOT(receiveDuplexMode(duplexMode))); connect(rig, SIGNAL(haveDuplexMode(duplexMode)), rpt, SLOT(receiveDuplexMode(duplexMode)));
connect(this, SIGNAL(getRptDuplexOffset()), rig, SLOT(getRptDuplexOffset())); connect(this, SIGNAL(getRptDuplexOffset()), rig, SLOT(getRptDuplexOffset()));
connect(rig, SIGNAL(haveRptOffsetFrequency(freqt)), rpt, SLOT(handleRptOffsetFrequency(freqt))); connect(rig, SIGNAL(haveRptOffsetFrequency(freqt)), rpt, SLOT(handleRptOffsetFrequency(freqt)));
// These are the current tone frequency or DCS code selected:
connect(rpt, SIGNAL(getTone()), rig, SLOT(getTone())); connect(rpt, SIGNAL(getTone()), rig, SLOT(getTone()));
connect(rpt, SIGNAL(getTSQL()), rig, SLOT(getTSQL())); connect(rpt, SIGNAL(getTSQL()), rig, SLOT(getTSQL()));
connect(rpt, SIGNAL(getDTCS()), rig, SLOT(getDTCS())); connect(rpt, SIGNAL(getDTCS()), rig, SLOT(getDTCS()));
@ -399,13 +401,32 @@ void wfmain::rigConnections()
connect(this->rpt, &repeaterSetup::setTSQL, connect(this->rpt, &repeaterSetup::setTSQL,
[=](const rptrTone_t &t) { issueCmd(cmdSetTSQL, t);}); [=](const rptrTone_t &t) { issueCmd(cmdSetTSQL, t);});
// TODO: struct with the DCS components and command queue entry
connect(rpt, SIGNAL(setDTCS(quint16,bool,bool)), rig, SLOT(setDTCS(quint16,bool,bool))); 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(getRptAccessMode()), rig, SLOT(getRptAccessMode()));
connect(this->rpt, &repeaterSetup::getRptAccessMode,
[=]() {
if(rigCaps.hasAdvancedRptrToneCmds) {
issueDelayedCommand(cmdGetRptAccessMode);
} else {
issueDelayedCommand(cmdGetToneEnabled);
issueDelayedCommand(cmdGetTSQLEnabled);
}
});
connect(this->rpt, &repeaterSetup::setQuickSplit,
[=](const bool &qsEnabled) {
issueCmd(cmdSetQuickSplit, qsEnabled);
});
connect(this, SIGNAL(setQuickSplit(bool)), rig, SLOT(setQuickSplit(bool)));
connect(this->rpt, &repeaterSetup::setRptAccessMode, connect(this->rpt, &repeaterSetup::setRptAccessMode,
[=](const rptrAccessData_t &rd) { issueCmd(cmdSetRptAccessMode, rd);}); [=](const rptrAccessData_t &rd) {
issueCmd(cmdSetRptAccessMode, rd);
});
connect(this, SIGNAL(setRepeaterAccessMode(rptrAccessData_t)), rig, SLOT(setRptAccessMode(rptrAccessData_t))); connect(this, SIGNAL(setRepeaterAccessMode(rptrAccessData_t)), rig, SLOT(setRptAccessMode(rptrAccessData_t)));
connect(this, SIGNAL(setTone(rptrTone_t)), rig, SLOT(setTone(rptrTone_t))); connect(this, SIGNAL(setTone(rptrTone_t)), rig, SLOT(setTone(rptrTone_t)));
@ -422,8 +443,11 @@ void wfmain::rigConnections()
this->splitModeEnabled = false; this->splitModeEnabled = false;
}); });
connect(this, SIGNAL(getToneEnabled()), rig, SLOT(getToneEnabled()));
connect(this, SIGNAL(getTSQLEnabled()), rig, SLOT(getToneSqlEnabled()));
connect(this->rpt, &repeaterSetup::setTransmitFrequency, connect(this->rpt, &repeaterSetup::setTransmitFrequency,
[=](const freqt &transmitFreq) { issueCmd(cmdSetFreq, transmitFreq);}); [=](const freqt &transmitFreq) { issueCmdUniquePriority(cmdSetFreq, transmitFreq);});
connect(this->rpt, &repeaterSetup::setTransmitMode, connect(this->rpt, &repeaterSetup::setTransmitMode,
[=](const mode_info &transmitMode) { issueCmd(cmdSetMode, transmitMode);}); [=](const mode_info &transmitMode) { issueCmd(cmdSetMode, transmitMode);});
connect(this->rpt, &repeaterSetup::selectVFO, connect(this->rpt, &repeaterSetup::selectVFO,
@ -457,6 +481,7 @@ void wfmain::rigConnections()
connect(rig, SIGNAL(haveSpectrumData(QByteArray, double, double)), this, SLOT(receiveSpectrumData(QByteArray, double, double))); connect(rig, SIGNAL(haveSpectrumData(QByteArray, double, double)), this, SLOT(receiveSpectrumData(QByteArray, double, double)));
connect(rig, SIGNAL(haveSpectrumMode(spectrumMode)), this, SLOT(receiveSpectrumMode(spectrumMode))); connect(rig, SIGNAL(haveSpectrumMode(spectrumMode)), this, SLOT(receiveSpectrumMode(spectrumMode)));
connect(rig, SIGNAL(haveScopeOutOfRange(bool)), this, SLOT(handleScopeOutOfRange(bool)));
connect(this, SIGNAL(setScopeMode(spectrumMode)), rig, SLOT(setSpectrumMode(spectrumMode))); connect(this, SIGNAL(setScopeMode(spectrumMode)), rig, SLOT(setSpectrumMode(spectrumMode)));
connect(this, SIGNAL(getScopeMode()), rig, SLOT(getScopeMode())); connect(this, SIGNAL(getScopeMode()), rig, SLOT(getScopeMode()));
@ -1645,7 +1670,6 @@ void wfmain::setupUsbControllerDevice()
connect(usbControllerDev, SIGNAL(doShuttle(bool, unsigned char)), this, SLOT(doShuttle(bool, unsigned char))); connect(usbControllerDev, SIGNAL(doShuttle(bool, unsigned char)), this, SLOT(doShuttle(bool, unsigned char)));
connect(usbControllerDev, SIGNAL(button(const COMMAND*)), this, SLOT(buttonControl(const COMMAND*))); connect(usbControllerDev, SIGNAL(button(const COMMAND*)), this, SLOT(buttonControl(const COMMAND*)));
connect(usbControllerDev, SIGNAL(setBand(int)), this, SLOT(setBand(int))); connect(usbControllerDev, SIGNAL(setBand(int)), this, SLOT(setBand(int)));
connect(this, SIGNAL(controllerLed(bool, unsigned char)), usbControllerDev, SLOT(ledControl(bool, unsigned char)));
connect(usbControllerDev, SIGNAL(newDevice(unsigned char, QVector<BUTTON>*, QVector<COMMAND>*)), shut, SLOT(newDevice(unsigned char, QVector<BUTTON>*, QVector<COMMAND>*))); connect(usbControllerDev, SIGNAL(newDevice(unsigned char, QVector<BUTTON>*, QVector<COMMAND>*)), shut, SLOT(newDevice(unsigned char, QVector<BUTTON>*, QVector<COMMAND>*)));
usbControllerThread->start(QThread::LowestPriority); usbControllerThread->start(QThread::LowestPriority);
@ -1665,7 +1689,6 @@ void wfmain::pttToggle(bool status)
} }
emit setPTT(status); emit setPTT(status);
emit controllerLed(status, 1);
// Start 3 minute timer // Start 3 minute timer
if (status) if (status)
pttTimer->start(); pttTimer->start();
@ -1699,11 +1722,11 @@ void wfmain::buttonControl(const COMMAND* cmd)
case cmdGetBandStackReg: case cmdGetBandStackReg:
issueCmd((cmds)cmd->command, cmd->band); issueCmd((cmds)cmd->command, cmd->band);
break; break;
case cmdSetBandUp: case cmdSetBandDown:
for (size_t i = 0; i < rigCaps.bands.size(); i++) { for (size_t i = 0; i < rigCaps.bands.size(); i++) {
if (rigCaps.bands[i].band == lastRequestedBand) if (rigCaps.bands[i].band == lastRequestedBand)
{ {
if (i>0) { if (i > 0) {
issueCmd(cmdGetBandStackReg, rigCaps.bands[i - 1].band); issueCmd(cmdGetBandStackReg, rigCaps.bands[i - 1].band);
} }
else { else {
@ -1712,7 +1735,7 @@ void wfmain::buttonControl(const COMMAND* cmd)
} }
} }
break; break;
case cmdSetBandDown: case cmdSetBandUp:
for (size_t i = 0; i < rigCaps.bands.size(); i++) { for (size_t i = 0; i < rigCaps.bands.size(); i++) {
if (rigCaps.bands[i].band == lastRequestedBand) if (rigCaps.bands[i].band == lastRequestedBand)
{ {
@ -3445,7 +3468,11 @@ void wfmain:: getInitialRigState()
{ {
issueDelayedCommand(cmdGetDTCS); issueDelayedCommand(cmdGetDTCS);
} }
issueDelayedCommand(cmdGetRptAccessMode);
if(rigCaps.hasCTCSS || rigCaps.hasDTCS)
{
issueDelayedCommand(cmdGetRptAccessMode);
}
if(rigCaps.hasAntennaSel) if(rigCaps.hasAntennaSel)
{ {
@ -3745,7 +3772,43 @@ void wfmain::doCmd(commandtype cmddata)
case cmdSetRptAccessMode: case cmdSetRptAccessMode:
{ {
rptrAccessData_t rd = (*std::static_pointer_cast<rptrAccessData_t>(data)); rptrAccessData_t rd = (*std::static_pointer_cast<rptrAccessData_t>(data));
if(rd.accessMode==ratrNN && !rigCaps.hasAdvancedRptrToneCmds)
{
rd.usingSequence = true;
switch(rd.sequence)
{
case 0:
rd.turnOffTone = true;
rd.turnOffTSQL = false;
break;
case 1:
rd.turnOffTSQL = true;
rd.turnOffTone = false;
break;
default:
break;
}
}
emit setRepeaterAccessMode(rd); emit setRepeaterAccessMode(rd);
rd.sequence++;
if(rd.sequence == 1)
issueCmd(cmdSetRptAccessMode, rd);
break;
}
case cmdSetToneEnabled:
{
// This command is not aware of which VFO to use
bool toneEnabled = (*std::static_pointer_cast<bool>(data));
emit setToneEnabled(toneEnabled);
break;
}
case cmdSetTSQLEnabled:
{
// This command is not aware of which VFO to use
bool toneEnabled = (*std::static_pointer_cast<bool>(data));
emit setTSQLEnabled(toneEnabled);
break; break;
} }
case cmdSetRptDuplexOffset: case cmdSetRptDuplexOffset:
@ -3754,11 +3817,16 @@ void wfmain::doCmd(commandtype cmddata)
emit setRptDuplexOffset(f); emit setRptDuplexOffset(f);
break; break;
} }
case cmdSetQuickSplit:
{
bool qsEnabled = (*std::static_pointer_cast<bool>(data));
emit setQuickSplit(qsEnabled);
break;
}
case cmdSetPTT: case cmdSetPTT:
{ {
bool pttrequest = (*std::static_pointer_cast<bool>(data)); bool pttrequest = (*std::static_pointer_cast<bool>(data));
emit setPTT(pttrequest); emit setPTT(pttrequest);
emit controllerLed(pttrequest, 1);
ui->meter2Widget->clearMeterOnPTTtoggle(); ui->meter2Widget->clearMeterOnPTTtoggle();
if (pttrequest) if (pttrequest)
@ -3774,7 +3842,6 @@ void wfmain::doCmd(commandtype cmddata)
{ {
bool pttrequest = !amTransmitting; bool pttrequest = !amTransmitting;
emit setPTT(pttrequest); emit setPTT(pttrequest);
emit controllerLed(pttrequest, 1);
ui->meter2Widget->clearMeterOnPTTtoggle(); ui->meter2Widget->clearMeterOnPTTtoggle();
if (pttrequest) if (pttrequest)
{ {
@ -3950,7 +4017,19 @@ void wfmain::doCmd(cmds cmd)
emit getDTCS(); emit getDTCS();
break; break;
case cmdGetRptAccessMode: case cmdGetRptAccessMode:
emit getRptAccessMode(); if(rigCaps.hasAdvancedRptrToneCmds) {
emit getRptAccessMode();
} else {
// Get both TONE and TSQL enabled status
emit getToneEnabled();
issueDelayedCommand(cmdGetTSQLEnabled);
}
break;
case cmdGetToneEnabled:
emit getToneEnabled();
break;
case cmdGetTSQLEnabled:
emit getTSQLEnabled();
break; break;
case cmdDispEnable: case cmdDispEnable:
emit scopeDisplayEnable(); emit scopeDisplayEnable();
@ -4450,6 +4529,10 @@ void wfmain::receiveRigID(rigCapabilities rigCaps)
} }
haveRigCaps = true; haveRigCaps = true;
if (rigCaps.bands.size() > 0) {
lastRequestedBand = rigCaps.bands[0].band;
}
// Added so that server receives rig capabilities. // Added so that server receives rig capabilities.
emit sendRigCaps(rigCaps); emit sendRigCaps(rigCaps);
rpt->setRig(rigCaps); rpt->setRig(rigCaps);
@ -5083,6 +5166,17 @@ void wfmain::receiveSpectrumMode(spectrumMode spectMode)
setUISpectrumControlsToMode(spectMode); setUISpectrumControlsToMode(spectMode);
} }
void wfmain::handleScopeOutOfRange(bool outOfRange)
{
if(outOfRange)
{
ui->scopeOutOfRangeLabel->setText("OUT OF RANGE");
ui->scopeOutOfRangeLabel->setStyleSheet("QLabel { background-color : red; color : blue; }");
} else {
ui->scopeOutOfRangeLabel->setText("");
ui->scopeOutOfRangeLabel->setStyleSheet("");
}
}
void wfmain::handlePlotDoubleClick(QMouseEvent *me) void wfmain::handlePlotDoubleClick(QMouseEvent *me)
{ {
@ -5191,6 +5285,10 @@ void wfmain::handlePlotClick(QMouseEvent* me)
this->mousePressFreq = plot->xAxis->pixelToCoord(cursor); this->mousePressFreq = plot->xAxis->pixelToCoord(cursor);
showStatusBarText(QString("Selected %1 MHz").arg(this->mousePressFreq)); showStatusBarText(QString("Selected %1 MHz").arg(this->mousePressFreq));
} }
else {
double x = plot->xAxis->pixelToCoord(cursor);
showStatusBarText(QString("Selected %1 MHz").arg(x));
}
} }
else if (me->button() == Qt::RightButton) else if (me->button() == Qt::RightButton)
{ {
@ -7818,8 +7916,8 @@ void wfmain::on_underlayAverageBuffer_toggled(bool checked)
void wfmain::on_debugBtn_clicked() void wfmain::on_debugBtn_clicked()
{ {
qInfo(logSystem()) << "Debug button pressed."; qInfo(logSystem()) << "Debug button pressed.";
qDebug(logSystem()) << "Query for repeater duplex offset 0x0C headed out"; qDebug(logSystem()) << "Query for repeater access mode (tone, tsql, etc) sent.";
issueDelayedCommand(cmdGetRptDuplexOffset); issueDelayedCommand(cmdGetRptAccessMode);
} }
// ---------- color helper functions: ---------- // // ---------- color helper functions: ---------- //
@ -9083,7 +9181,7 @@ void wfmain::resetUsbButtons()
usbButtons.append(BUTTON(2, 14, QRect(280, 195, 25, 80), Qt::red, &usbCommands[0], &usbCommands[0])); usbButtons.append(BUTTON(2, 14, QRect(280, 195, 25, 80), Qt::red, &usbCommands[0], &usbCommands[0]));
// RC28 // RC28
usbButtons.append(BUTTON(3, 0, QRect(52, 445, 238, 64), Qt::red, &usbCommands[0], &usbCommands[0])); usbButtons.append(BUTTON(3, 0, QRect(52, 445, 238, 64), Qt::red, &usbCommands[1], &usbCommands[2])); // PTT On/OFF
usbButtons.append(BUTTON(3, 1, QRect(52, 373, 98, 46), Qt::red, &usbCommands[0], &usbCommands[0])); usbButtons.append(BUTTON(3, 1, QRect(52, 373, 98, 46), Qt::red, &usbCommands[0], &usbCommands[0]));
usbButtons.append(BUTTON(3, 2, QRect(193, 373, 98, 46), Qt::red, &usbCommands[0], &usbCommands[0])); usbButtons.append(BUTTON(3, 2, QRect(193, 373, 98, 46), Qt::red, &usbCommands[0], &usbCommands[0]));
@ -9112,58 +9210,61 @@ void wfmain::resetUsbButtons()
void wfmain::resetUsbCommands() void wfmain::resetUsbCommands()
{ {
usbCommands.clear(); usbCommands.clear();
usbCommands.append(COMMAND(0, "None", cmdNone, 0x0)); int num = 0;
usbCommands.append(COMMAND(1, "PTT On", cmdSetPTT, 0x1)); usbCommands.append(COMMAND(num++, "None", cmdNone, 0x0));
usbCommands.append(COMMAND(2, "PTT Off", cmdSetPTT, 0x0)); usbCommands.append(COMMAND(num++, "PTT On", cmdSetPTT, 0x1));
usbCommands.append(COMMAND(3, "PTT Toggle", cmdPTTToggle, 0x0)); usbCommands.append(COMMAND(num++, "PTT Off", cmdSetPTT, 0x0));
usbCommands.append(COMMAND(4, "Tune", cmdStartATU, 0x0)); usbCommands.append(COMMAND(num++, "PTT Toggle", cmdPTTToggle, 0x0));
usbCommands.append(COMMAND(5, "Step+", cmdSetStepUp, 0x0)); usbCommands.append(COMMAND(num++, "Tune", cmdStartATU, 0x0));
usbCommands.append(COMMAND(6, "Step-", cmdSetStepDown, 0x0)); usbCommands.append(COMMAND(num++, "Step+", cmdSetStepUp, 0x0));
usbCommands.append(COMMAND(7, "Span+", cmdSetSpanUp, 0x0)); usbCommands.append(COMMAND(num++, "Step-", cmdSetStepDown, 0x0));
usbCommands.append(COMMAND(8, "Span-", cmdSetSpanDown, 0x0)); usbCommands.append(COMMAND(num++, "Span+", cmdSetSpanUp, 0x0));
usbCommands.append(COMMAND(9, "Mode+", cmdSetModeUp, 0x0)); usbCommands.append(COMMAND(num++, "Span-", cmdSetSpanDown, 0x0));
usbCommands.append(COMMAND(10, "Mode-", cmdSetModeDown, 0x0)); usbCommands.append(COMMAND(num++, "Mode+", cmdSetModeUp, 0x0));
usbCommands.append(COMMAND(11, "Mode LSB", cmdSetMode, modeLSB)); usbCommands.append(COMMAND(num++, "Mode-", cmdSetModeDown, 0x0));
usbCommands.append(COMMAND(12, "Mode USB", cmdSetMode, modeUSB)); usbCommands.append(COMMAND(num++, "Mode LSB", cmdSetMode, modeLSB));
usbCommands.append(COMMAND(13, "Mode LSBD", cmdSetMode, modeLSB_D)); usbCommands.append(COMMAND(num++, "Mode USB", cmdSetMode, modeUSB));
usbCommands.append(COMMAND(14, "Mode USBD", cmdSetMode, modeUSB_D)); usbCommands.append(COMMAND(num++, "Mode LSBD", cmdSetMode, modeLSB_D));
usbCommands.append(COMMAND(15, "Mode CW", cmdSetMode, modeCW)); usbCommands.append(COMMAND(num++, "Mode USBD", cmdSetMode, modeUSB_D));
usbCommands.append(COMMAND(16, "Mode CWR", cmdSetMode, modeCW_R)); usbCommands.append(COMMAND(num++, "Mode CW", cmdSetMode, modeCW));
usbCommands.append(COMMAND(17, "Mode FM", cmdSetMode, modeFM)); usbCommands.append(COMMAND(num++, "Mode CWR", cmdSetMode, modeCW_R));
usbCommands.append(COMMAND(18, "Mode AM", cmdSetMode, modeAM)); usbCommands.append(COMMAND(num++, "Mode FM", cmdSetMode, modeFM));
usbCommands.append(COMMAND(19, "Mode RTTY", cmdSetMode, modeRTTY)); usbCommands.append(COMMAND(num++, "Mode AM", cmdSetMode, modeAM));
usbCommands.append(COMMAND(20, "Mode RTTYR", cmdSetMode, modeRTTY_R)); usbCommands.append(COMMAND(num++, "Mode RTTY", cmdSetMode, modeRTTY));
usbCommands.append(COMMAND(21, "Mode PSK", cmdSetMode, modePSK)); usbCommands.append(COMMAND(num++, "Mode RTTYR", cmdSetMode, modeRTTY_R));
usbCommands.append(COMMAND(22, "Mode PSKR", cmdSetMode, modePSK_R)); usbCommands.append(COMMAND(num++, "Mode PSK", cmdSetMode, modePSK));
usbCommands.append(COMMAND(23, "Mode DV", cmdSetMode, modeDV)); usbCommands.append(COMMAND(num++, "Mode PSKR", cmdSetMode, modePSK_R));
usbCommands.append(COMMAND(24, "Mode DD", cmdSetMode, modeDD)); usbCommands.append(COMMAND(num++, "Mode DV", cmdSetMode, modeDV));
usbCommands.append(COMMAND(25, "Band+", cmdSetBandUp, 0x0)); usbCommands.append(COMMAND(num++, "Mode DD", cmdSetMode, modeDD));
usbCommands.append(COMMAND(26, "Band-", cmdSetBandDown, 0x0)); usbCommands.append(COMMAND(num++, "Band+", cmdSetBandUp, 0x0));
usbCommands.append(COMMAND(27, "23cm", cmdGetBandStackReg, band23cm)); usbCommands.append(COMMAND(num++, "Band-", cmdSetBandDown, 0x0));
usbCommands.append(COMMAND(28, "70cm", cmdGetBandStackReg, band70cm)); usbCommands.append(COMMAND(num++, "23cm", cmdGetBandStackReg, band23cm));
usbCommands.append(COMMAND(29, "2m", cmdGetBandStackReg, band2m)); usbCommands.append(COMMAND(num++, "70cm", cmdGetBandStackReg, band70cm));
usbCommands.append(COMMAND(30, "AIR", cmdGetBandStackReg, bandAir)); usbCommands.append(COMMAND(num++, "2m", cmdGetBandStackReg, band2m));
usbCommands.append(COMMAND(31, "WFM", cmdGetBandStackReg, bandWFM)); usbCommands.append(COMMAND(num++, "AIR", cmdGetBandStackReg, bandAir));
usbCommands.append(COMMAND(32, "4m", cmdGetBandStackReg, band4m)); usbCommands.append(COMMAND(num++, "WFM", cmdGetBandStackReg, bandWFM));
usbCommands.append(COMMAND(33, "6m", cmdGetBandStackReg, band6m)); usbCommands.append(COMMAND(num++, "4m", cmdGetBandStackReg, band4m));
usbCommands.append(COMMAND(34, "10m", cmdGetBandStackReg, band10m)); usbCommands.append(COMMAND(num++, "6m", cmdGetBandStackReg, band6m));
usbCommands.append(COMMAND(35, "12m", cmdGetBandStackReg, band12m)); usbCommands.append(COMMAND(num++, "10m", cmdGetBandStackReg, band10m));
usbCommands.append(COMMAND(36, "15m", cmdGetBandStackReg, band15m)); usbCommands.append(COMMAND(num++, "12m", cmdGetBandStackReg, band12m));
usbCommands.append(COMMAND(37, "17m", cmdGetBandStackReg, band17m)); usbCommands.append(COMMAND(num++, "15m", cmdGetBandStackReg, band15m));
usbCommands.append(COMMAND(38, "20m", cmdGetBandStackReg, band20m)); usbCommands.append(COMMAND(num++, "17m", cmdGetBandStackReg, band17m));
usbCommands.append(COMMAND(39, "30m", cmdGetBandStackReg, band30m)); usbCommands.append(COMMAND(num++, "20m", cmdGetBandStackReg, band20m));
usbCommands.append(COMMAND(40, "40m", cmdGetBandStackReg, band40m)); usbCommands.append(COMMAND(num++, "30m", cmdGetBandStackReg, band30m));
usbCommands.append(COMMAND(41, "60m", cmdGetBandStackReg, band60m)); usbCommands.append(COMMAND(num++, "40m", cmdGetBandStackReg, band40m));
usbCommands.append(COMMAND(42, "80m", cmdGetBandStackReg, band80m)); usbCommands.append(COMMAND(num++, "60m", cmdGetBandStackReg, band60m));
usbCommands.append(COMMAND(43, "160m", cmdGetBandStackReg, band160m)); usbCommands.append(COMMAND(num++, "80m", cmdGetBandStackReg, band80m));
usbCommands.append(COMMAND(44, "630m", cmdGetBandStackReg, band630m)); usbCommands.append(COMMAND(num++, "160m", cmdGetBandStackReg, band160m));
usbCommands.append(COMMAND(45, "2200m", cmdGetBandStackReg, band2200m)); usbCommands.append(COMMAND(num++, "630m", cmdGetBandStackReg, band630m));
usbCommands.append(COMMAND(46, "GEN", cmdGetBandStackReg, bandGen)); usbCommands.append(COMMAND(num++, "2200m", cmdGetBandStackReg, band2200m));
usbCommands.append(COMMAND(47, "NR On", cmdNone, 0x0)); usbCommands.append(COMMAND(num++, "GEN", cmdGetBandStackReg, bandGen));
usbCommands.append(COMMAND(48, "NR Off", cmdNone, 0x0)); usbCommands.append(COMMAND(num++, "NR On", cmdNone, 0x0));
usbCommands.append(COMMAND(49, "NB On", cmdNone, 0x0)); usbCommands.append(COMMAND(num++, "NR Off", cmdNone, 0x0));
usbCommands.append(COMMAND(50, "NB Off", cmdNone, 0x0)); usbCommands.append(COMMAND(num++, "NB On", cmdNone, 0x0));
usbCommands.append(COMMAND(51, "Split On", cmdNone, 0x01)); usbCommands.append(COMMAND(num++, "NB Off", cmdNone, 0x0));
usbCommands.append(COMMAND(52, "Split Off", cmdNone, 0x0)); usbCommands.append(COMMAND(num++, "Split On", cmdNone, 0x01));
usbCommands.append(COMMAND(num++, "Split Off", cmdNone, 0x0));
usbCommands.append(COMMAND(num++, "Swap VFOs", cmdVFOSwap, 0x0));
emit sendUsbControllerCommands(&usbCommands); emit sendUsbControllerCommands(&usbCommands);
} }

Wyświetl plik

@ -111,6 +111,7 @@ signals:
// Repeater: // Repeater:
void getDuplexMode(); void getDuplexMode();
void setQuickSplit(bool qsOn);
void getTone(); void getTone();
void getTSQL(); void getTSQL();
void getDTCS(); void getDTCS();
@ -118,6 +119,10 @@ signals:
void setRepeaterAccessMode(rptrAccessData_t rd); void setRepeaterAccessMode(rptrAccessData_t rd);
void setTone(rptrTone_t t); void setTone(rptrTone_t t);
void setTSQL(rptrTone_t t); void setTSQL(rptrTone_t t);
void getToneEnabled();
void getTSQLEnabled();
void setToneEnabled(bool enabled);
void setTSQLEnabled(bool enabled);
void setRptDuplexOffset(freqt f); void setRptDuplexOffset(freqt f);
void getRptDuplexOffset(); void getRptDuplexOffset();
@ -218,7 +223,6 @@ signals:
void openShuttle(); void openShuttle();
void requestRigState(); void requestRigState();
void stateUpdated(); void stateUpdated();
void controllerLed(bool, unsigned char);
void sendUsbControllerCommands(QVector<COMMAND>* cmds); void sendUsbControllerCommands(QVector<COMMAND>* cmds);
void sendUsbControllerButtons(QVector<BUTTON>* buts); void sendUsbControllerButtons(QVector<BUTTON>* buts);
void setClusterUdpPort(int port); void setClusterUdpPort(int port);
@ -281,6 +285,7 @@ private slots:
void receiveSpectrumData(QByteArray spectrum, double startFreq, double endFreq); void receiveSpectrumData(QByteArray spectrum, double startFreq, double endFreq);
void receiveSpectrumMode(spectrumMode spectMode); void receiveSpectrumMode(spectrumMode spectMode);
void receiveSpectrumSpan(freqt freqspan, bool isSub); void receiveSpectrumSpan(freqt freqspan, bool isSub);
void handleScopeOutOfRange(bool outOfRange);
void receivePTTstatus(bool pttOn); void receivePTTstatus(bool pttOn);
void receiveDataModeStatus(bool dataOn); void receiveDataModeStatus(bool dataOn);
void receiveBandStackReg(freqt f, char mode, char filter, bool dataOn); // freq, mode, (filter,) datamode void receiveBandStackReg(freqt f, char mode, char filter, bool dataOn); // freq, mode, (filter,) datamode

Wyświetl plik

@ -6,7 +6,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1012</width> <width>1042</width>
<height>660</height> <height>660</height>
</rect> </rect>
</property> </property>
@ -18,7 +18,7 @@
<item> <item>
<widget class="QTabWidget" name="tabWidget"> <widget class="QTabWidget" name="tabWidget">
<property name="currentIndex"> <property name="currentIndex">
<number>3</number> <number>0</number>
</property> </property>
<widget class="QWidget" name="mainTab"> <widget class="QWidget" name="mainTab">
<attribute name="title"> <attribute name="title">
@ -117,6 +117,19 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QLabel" name="scopeOutOfRangeLabel">
<property name="minimumSize">
<size>
<width>5</width>
<height>0</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item> <item>
<widget class="QPushButton" name="customEdgeBtn"> <widget class="QPushButton" name="customEdgeBtn">
<property name="toolTip"> <property name="toolTip">
@ -1808,6 +1821,7 @@
<font> <font>
<family>DejaVu Sans Mono</family> <family>DejaVu Sans Mono</family>
<pointsize>14</pointsize> <pointsize>14</pointsize>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
@ -3430,8 +3444,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>790</width> <width>570</width>
<height>302</height> <height>224</height>
</rect> </rect>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
@ -5441,6 +5455,7 @@
<widget class="QPushButton" name="exitBtn"> <widget class="QPushButton" name="exitBtn">
<property name="font"> <property name="font">
<font> <font>
<weight>50</weight>
<bold>false</bold> <bold>false</bold>
</font> </font>
</property> </property>
@ -5459,8 +5474,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1012</width> <width>1042</width>
<height>22</height> <height>21</height>
</rect> </rect>
</property> </property>
</widget> </widget>
@ -5488,7 +5503,7 @@
<connections/> <connections/>
<buttongroups> <buttongroups>
<buttongroup name="buttonGroup"/> <buttongroup name="buttonGroup"/>
<buttongroup name="pollingButtonGroup"/>
<buttongroup name="underlayButtonGroup"/> <buttongroup name="underlayButtonGroup"/>
<buttongroup name="pollingButtonGroup"/>
</buttongroups> </buttongroups>
</ui> </ui>

Wyświetl plik

@ -19,21 +19,43 @@ DEFINES += BUILD_WFSERVER
CONFIG(debug, release|debug) { CONFIG(debug, release|debug) {
# For Debug builds only: # For Debug builds only:
QMAKE_CXXFLAGS += -faligned-new linux:QMAKE_CXXFLAGS += -faligned-new
win32:DESTDIR = wfview-release win32 {
win32:LIBS += -L../portaudio/msvc/Win32/Debug/ -lportaudio_x86 -ole32 contains(QMAKE_TARGET.arch, x86_64) {
QMAKE_POST_LINK +=$$quote(cmd /c copy /y ..\portaudio\msvc\x64\Debug\portaudio_x64.dll wfview-debug $$escape_expand(\\n\\t))
LIBS += -L../portaudio/msvc/X64/Debug/ -lportaudio_x64
LIBS += -L../opus/win32/VS2015/x64/Debug/ -lopus -lole32
} else {
QMAKE_POST_LINK +=$$quote(cmd /c copy /y ..\portaudio\msvc\win32\Debug\portaudio_x86.dll wfview-debug\$$escape_expand(\\n\\t))
LIBS += -L../portaudio/msvc/Win32/Debug/ -lportaudio_x86
LIBS += -L../opus/win32/VS2015/Win32/Debug/ -lopus -lole32
}
DESTDIR = wfview-release
}
} else { } else {
# For Release builds only: # For Release builds only:
linux:QMAKE_CXXFLAGS += -s linux:QMAKE_CXXFLAGS += -s
QMAKE_CXXFLAGS += -fvisibility=hidden linux:QMAKE_CXXFLAGS += -fvisibility=hidden
QMAKE_CXXFLAGS += -fvisibility-inlines-hidden linux:QMAKE_CXXFLAGS += -fvisibility-inlines-hidden
QMAKE_CXXFLAGS += -faligned-new linux:QMAKE_CXXFLAGS += -faligned-new
linux:QMAKE_LFLAGS += -O2 -s linux:QMAKE_LFLAGS += -O2 -s
win32:DESTDIR = wfview-debug
win32:LIBS += -L../portaudio/msvc/Win32/Release/ -lportaudio_x86 -lole32 win32 {
contains(QMAKE_TARGET.arch, x86_64) {
QMAKE_POST_LINK +=$$quote(cmd /c copy /y ..\portaudio\msvc\x64\Release\portaudio_x64.dll wfview-release $$escape_expand(\\n\\t))
LIBS += -L../portaudio/msvc/X64/Release/ -lportaudio_x64
LIBS += -L../opus/win32/VS2015/x64/Release/ -lopus -lole32
} else {
QMAKE_POST_LINK +=$$quote(cmd /c copy /y ..\portaudio\msvc\win32\Release\portaudio_x86.dll wfview-release $$escape_expand(\\n\\t))
LIBS += -L../portaudio/msvc/Win32/Release/ -lportaudio_x86
LIBS += -L../opus/win32/VS2015/Win32/Release/ -lopus -lole32
}
DESTDIR = wfview-debug
}
} }
# RTAudio defines # RTAudio defines
win32:DEFINES += __WINDOWS_WASAPI__ win32:DEFINES += __WINDOWS_WASAPI__
#win32:DEFINES += __WINDOWS_DS__ # Requires DirectSound libraries #win32:DEFINES += __WINDOWS_DS__ # Requires DirectSound libraries
@ -103,15 +125,6 @@ RESOURCES += qdarkstyle/style.qrc \
unix:target.path = $$PREFIX/bin unix:target.path = $$PREFIX/bin
INSTALLS += target INSTALLS += target
# Do not do this, it will hang on start:
# CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT
CONFIG(debug, release|debug) {
win32:LIBS += -L../opus/win32/VS2015/Win32/Debug/ -lopus
} else {
win32:LIBS += -L../opus/win32/VS2015/Win32/Release/ -lopus
}
linux:LIBS += -L./ -lopus linux:LIBS += -L./ -lopus
macx:LIBS += -framework CoreAudio -framework CoreFoundation -lpthread -lopus macx:LIBS += -framework CoreAudio -framework CoreFoundation -lpthread -lopus

Wyświetl plik

@ -98,12 +98,20 @@ enum rptAccessTxRx {
ratrDN=0x06, // "DTCS(T)" ratrDN=0x06, // "DTCS(T)"
ratrTD=0x07, // "TONE(T) / TSQL(R)" ratrTD=0x07, // "TONE(T) / TSQL(R)"
ratrDT=0x08, // "DTCS(T) / TSQL(R)" ratrDT=0x08, // "DTCS(T) / TSQL(R)"
ratrTT=0x09 // "TONE(T) / TSQL(R)" ratrTT=0x09, // "TONE(T) / TSQL(R)"
ratrTONEoff,
ratrTONEon,
ratrTSQLoff,
ratrTSQLon
}; };
struct rptrAccessData_t { struct rptrAccessData_t {
rptAccessTxRx accessMode = ratrNN; rptAccessTxRx accessMode = ratrNN;
bool useSecondaryVFO = false; bool useSecondaryVFO = false;
bool turnOffTone = false;
bool turnOffTSQL = false;
bool usingSequence = false;
int sequence = 0;
}; };
struct mode_info { struct mode_info {
@ -153,12 +161,15 @@ enum cmds {
cmdGetCurrentModLevel, cmdStartRegularPolling, cmdStopRegularPolling, cmdQueNormalSpeed, cmdGetCurrentModLevel, cmdStartRegularPolling, cmdStopRegularPolling, cmdQueNormalSpeed,
cmdGetVdMeter, cmdGetIdMeter, cmdGetSMeter, cmdGetCenterMeter, cmdGetPowerMeter, cmdGetVdMeter, cmdGetIdMeter, cmdGetSMeter, cmdGetCenterMeter, cmdGetPowerMeter,
cmdGetSWRMeter, cmdGetALCMeter, cmdGetCompMeter, cmdGetTxRxMeter, cmdGetSWRMeter, cmdGetALCMeter, cmdGetCompMeter, cmdGetTxRxMeter,
cmdGetTone, cmdGetTSQL, cmdGetDTCS, cmdGetRptAccessMode, cmdSetTone, cmdSetTSQL, cmdSetRptAccessMode, cmdSetRptDuplexOffset, cmdGetRptDuplexOffset, cmdGetTone, cmdGetTSQL, cmdGetToneEnabled, cmdGetTSQLEnabled, cmdGetDTCS,
cmdSelVFO, cmdVFOSwap, cmdVFOEqualAB, cmdVFOEqualMS, cmdSetToneEnabled, cmdSetTSQLEnabled, cmdGetRptAccessMode, cmdSetTone, cmdSetTSQL,
cmdSetRptAccessMode, cmdSetRptDuplexOffset, cmdGetRptDuplexOffset,
cmdSelVFO, cmdVFOSwap, cmdVFOEqualAB, cmdVFOEqualMS, cmdSetQuickSplit,
cmdGetPreamp, cmdGetAttenuator, cmdGetAntenna, cmdGetPreamp, cmdGetAttenuator, cmdGetAntenna,
cmdGetBandStackReg, cmdGetKeySpeed, cmdSetKeySpeed, cmdGetBreakMode, cmdSetBreakMode, cmdSendCW, cmdStopCW, 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. // Below Only used for USB Controller at the moment.
cmdSetBandUp, cmdSetBandDown, cmdSetModeUp, cmdSetModeDown, cmdSetStepUp, cmdSetStepDown, cmdSetSpanUp, cmdSetSpanDown, cmdIFFilterUp, cmdIFFilterDown
}; };
struct commandtype { struct commandtype {
@ -183,4 +194,6 @@ enum codecType { LPCM, PCMU, OPUS };
enum passbandActions {passbandStatic, pbtInnerMove, pbtOuterMove, pbtMoving, passbandResizing}; enum passbandActions {passbandStatic, pbtInnerMove, pbtOuterMove, pbtMoving, passbandResizing};
enum usbDeviceType { usbNone = 0, shuttleXpress, shuttlePro2, RC28, xBoxGamepad, unknownGamepad };
#endif // WFVIEWTYPES_H #endif // WFVIEWTYPES_H