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);
private:
enum { NONE=0, shuttleXpress, shuttlePro2, RC28, xBoxGamepad, unknownGamepad } usbDevice;
usbDeviceType usbDevice = usbNone;
Ui::controllerSetup* ui;
QGraphicsScene* scene;
QGraphicsTextItem* textItem;

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

@ -8,7 +8,7 @@ repeaterSetup::repeaterSetup(QWidget *parent) :
ui->setupUi(this);
ui->autoTrackLiveBtn->setEnabled(false); // until we set split enabled.
ui->warningFMLabel->setVisible(false);
// populate the CTCSS combo box:
populateTones();
@ -101,6 +101,7 @@ void repeaterSetup::setRig(rigCapabilities inRig)
ui->rptrOffsetSetBtn->setEnabled(rig.hasRepeaterModes);
ui->setToneSubVFOBtn->setEnabled(rig.hasSpecifyMainSubCmd);
ui->setRptrSubVFOBtn->setEnabled(rig.hasSpecifyMainSubCmd);
ui->quickSplitChk->setVisible(rig.hasQuickSplitCommand);
}
void repeaterSetup::populateTones()
@ -313,25 +314,43 @@ void repeaterSetup::receiveDuplexMode(duplexMode dm)
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)
{
case ratrNN:
ui->toneNone->setChecked(true);
break;
case ratrTT:
ui->toneTSQL->setChecked(true);
break;
case ratrTN:
ui->toneTone->setChecked(true);
break;
case ratrDD:
ui->toneDTCS->setChecked(true);
break;
default:
break;
case ratrNN:
ui->toneNone->setChecked(true);
break;
case ratrTT:
case ratrNT:
ui->toneTSQL->setChecked(true);
break;
case ratrTN:
ui->toneTone->setChecked(true);
break;
case ratrDD:
ui->toneDTCS->setChecked(true);
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)
@ -396,6 +415,10 @@ void repeaterSetup::handleUpdateCurrentMainMode(mode_info m)
this->currentModeMain = m;
this->modeTransmitVFO = m;
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);
}
void repeaterSetup::on_rptReadRigBtn_clicked()
{
emit getDuplexMode();
}
void repeaterSetup::on_rptToneCombo_activated(int tindex)
{
quint16 tone=0;
@ -594,23 +612,6 @@ void repeaterSetup::on_toneDTCS_clicked()
// 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)
{
// This function takes a string containing a number in KHz,
@ -822,3 +823,17 @@ void repeaterSetup::on_rptrOffsetEdit_returnPressed()
{
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();
// Split:
void getSplitModeEnabled();
void setQuickSplit(bool qsOn);
void getTransmitFrequency();
// Use the duplexMode to communicate split.
// void setSplitModeEnabled(bool splitEnabled);
@ -65,10 +66,8 @@ private slots:
void on_rptDupPlusBtn_clicked();
void on_rptDupMinusBtn_clicked();
void on_rptAutoBtn_clicked();
void on_rptReadRigBtn_clicked();
void on_rptToneCombo_activated(int index);
void on_rptDTCSCombo_activated(int index);
void on_debugBtn_clicked();
void on_toneNone_clicked();
void on_toneTone_clicked();
void on_toneTSQL_clicked();
@ -108,6 +107,10 @@ private slots:
void on_splitTransmitFreqEdit_returnPressed();
void on_setSplitRptrToneChk_clicked(bool checked);
void on_quickSplitChk_clicked(bool checked);
private:
Ui::repeaterSetup *ui;
freqt currentMainFrequency;

Wyświetl plik

@ -151,6 +151,13 @@
</attribute>
</widget>
</item>
<item>
<widget class="QCheckBox" name="quickSplitChk">
<property name="text">
<string>QuickSplit</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
@ -163,6 +170,9 @@
<property name="text">
<string>Set Rpt Tone</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
@ -392,6 +402,13 @@
<string>Repeater Tone Type</string>
</property>
<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>
<widget class="QRadioButton" name="toneNone">
<property name="text">

Wyświetl plik

@ -935,6 +935,16 @@ void rigCommander::getDuplexMode()
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)
{
QByteArray payload;
@ -1062,7 +1072,7 @@ void rigCommander::setTone(rptrTone_t t)
{
qDebug(logRig()) << "Sending TONE to secondary VFO";
payload.prepend("\x29\x01");
printHex(payload);
//printHex(payload);
}
prepDataAndSend(payload);
@ -1089,7 +1099,7 @@ void rigCommander::setTSQL(rptrTone_t t)
{
qDebug(logRig()) << "Sending TSQL to secondary VFO";
payload.prepend("\x29\x01");
printHex(payload);
//printHex(payload);
}
prepDataAndSend(payload);
@ -1105,7 +1115,7 @@ void rigCommander::setDTCS(quint16 dcscode, bool tinv, bool rinv)
payload.append(denc);
//qInfo() << __func__ << "DTCS encoded payload: ";
printHex(payload);
//printHex(payload);
prepDataAndSend(payload);
}
@ -1206,10 +1216,56 @@ void rigCommander::setRptAccessMode(rptAccessTxRx ratr)
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;
payload.setRawData("\x16\x5D", 2);
payload.append((unsigned char)rd.accessMode);
if(rd.useSecondaryVFO)
if(rigCaps.hasAdvancedRptrToneCmds)
{
// 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");
}
@ -1224,8 +1280,8 @@ void rigCommander::setRptDuplexOffset(freqt f)
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);
//printHexNow(payload, logRig());
//QString g = getHex(payload);
//qInfo(logRig()).noquote().nospace() << g;
prepDataAndSend(payload);
}
@ -1319,6 +1375,7 @@ void rigCommander::sendCW(QString textToSend)
QByteArray textData = textToSend.toLocal8Bit();
unsigned char p=0;
bool printout=false;
for(int c=0; c < textData.length(); c++)
{
p = textData.at(c);
@ -1334,10 +1391,12 @@ void rigCommander::sendCW(QString textToSend)
// Allowed character, continue
} else {
qWarning(logRig()) << "Invalid character detected in CW message at position " << c << ", the character is " << textToSend.at(c);
printHex(textData);
printout = true;
textData[c] = 0x3F; // "?"
}
}
if(printout)
printHex(textData);
if(pttAllowed)
{
@ -2888,6 +2947,7 @@ void rigCommander::parseRegister16()
//"INDEX: 00 01 02 03 "
//"DATA: 16 5d 00 fd "
// ^-- mode info here
rptAccessTxRx ra;
switch(payloadIn.at(1))
{
@ -2910,9 +2970,23 @@ void rigCommander::parseRegister16()
break;
case '\x42':
state.set(TONEFUNC, payloadIn.at(2) != 0, false);
if(payloadIn.at(2)==1)
{
ra = ratrTONEon;
} else {
ra = ratrTONEoff;
}
emit haveRptAccessMode(ra);
break;
case '\x43':
state.set(TSQLFUNC, payloadIn.at(2) != 0, false);
if(payloadIn.at(2)==1)
{
ra = ratrTSQLon;
} else {
ra = ratrTSQLoff;
}
emit haveRptAccessMode(ra);
break;
case '\x44':
state.set(COMPFUNC, payloadIn.at(2) != 0, false);
@ -3275,7 +3349,7 @@ void rigCommander::parseWFData()
// read edge mode center in edge mode
emit haveScopeEdge((char)payloadIn[2]);
//qInfo(logRig()) << "Received 0x16 edge in center mode:";
printHex(payloadIn, false, true);
//printHex(payloadIn, false, true);
// [1] 0x16
// [2] 0x01, 0x02, 0x03: Edge 1,2,3
break;
@ -3348,8 +3422,8 @@ void rigCommander::determineRigCaps()
bandType bandDefGen(bandGen, 10000, 30000000, modeAM);
standardHF = { bandDef6m, bandDef10m, bandDef12m, bandDef15m, bandDef17m,
bandDef20m, bandDef30m, bandDef40m, bandDef60m, bandDef80m, bandDef160m};
standardHF = { bandDef160m, bandDef80m, bandDef60m, bandDef40m, bandDef30m,
bandDef20m, bandDef17m, bandDef15m, bandDef12m, bandDef10m, bandDef6m };
standardVU = { bandDef2m, bandDef70cm };
@ -3459,6 +3533,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x71");
rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x30");
break;
case modelR8600:
rigCaps.modelName = QString("IC-R8600");
@ -3531,6 +3607,9 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x27");
rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = true;
rigCaps.hasAdvancedRptrToneCmds = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x43");
break;
case model910h:
rigCaps.modelName = QString("IC-910H");
@ -3585,6 +3664,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x97");
rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = false;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x64");
break;
case model7610:
rigCaps.modelName = QString("IC-7610");
@ -3619,6 +3700,8 @@ void rigCommander::determineRigCaps()
rigCaps.hasRXAntenna = true;
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x12");
rigCaps.hasSpecifyMainSubCmd = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x33");
rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = false;
break;
@ -3654,6 +3737,8 @@ void rigCommander::determineRigCaps()
rigCaps.hasRXAntenna = true;
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x55");
rigCaps.hasSpecifyMainSubCmd = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x01\x13");
rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = false;
break;
@ -3693,6 +3778,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x01\x31");
rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x45");
break;
case model7000:
rigCaps.modelName = QString("IC-7000");
@ -3719,6 +3806,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x92");
rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x52");
break;
case model7410:
rigCaps.modelName = QString("IC-7410");
@ -3744,6 +3833,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x40");
rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x11");
break;
case model7100:
rigCaps.modelName = QString("IC-7100");
@ -3775,6 +3866,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x95");
rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x15");
break;
case model7200:
rigCaps.modelName = QString("IC-7200");
@ -3799,6 +3892,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x03\x48");
rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x03\x18");
break;
case model7700:
rigCaps.modelName = QString("IC-7700");
@ -3827,6 +3922,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x95");
rigCaps.hasVFOMS = false;
rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x67");
break;
case model703:
rigCaps.modelName = QString("IC-703");
@ -4067,6 +4164,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = false;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x24");
break;
case model756proiii:
rigCaps.modelName = QString("IC-756 Pro III");
@ -4090,6 +4189,8 @@ void rigCommander::determineRigCaps()
rigCaps.transceiveCommand = QByteArrayLiteral("\x1a\x05\x00\x00");
rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = false;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x24");
break;
case model9100:
rigCaps.modelName = QString("IC-9100");
@ -4121,6 +4222,8 @@ void rigCommander::determineRigCaps()
rigCaps.modes.insert(rigCaps.modes.end(), {createMode(modeDV, 0x17, "DV")});
rigCaps.hasVFOMS = true;
rigCaps.hasVFOAB = true;
rigCaps.hasQuickSplitCommand = true;
rigCaps.quickSplitCommand = QByteArrayLiteral("\x1a\x05\x00\x14");
break;
default:
rigCaps.modelName = QString("IC-0x%1").arg(rigCaps.modelID, 2, 16);
@ -4244,6 +4347,17 @@ void rigCommander::parseSpectrum()
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?
//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);
}
void rigCommander::getToneSql()
void rigCommander::getToneSqlEnabled()
{
QByteArray payload;
payload.setRawData("\x16\x43", 2);
@ -5152,7 +5266,7 @@ void rigCommander::stateUpdated()
if (i.value()._valid) {
setToneSql(state.getBool(TSQLFUNC));
}
getToneSql();
getToneSqlEnabled();
break;
case COMPFUNC:
if (i.value()._valid) {

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

@ -18,6 +18,7 @@ usbController::usbController()
usbController::~usbController()
{
qInfo(logUsbControl) << "Ending usbController()";
ledControl(false, 3);
hid_close(handle);
hid_exit();
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
@ -45,32 +46,6 @@ void usbController::receiveButtons(QVector<BUTTON>* 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()
{
@ -192,10 +167,15 @@ void usbController::run()
if (!handle) {
handle = hid_open(0x0c26, 0x001e, NULL);
if (!handle) {
usbDevice = NONE;
usbDevice = usbNone;
}
else {
usbDevice = RC28;
getVersion();
ledControl(false, 0);
ledControl(false, 1);
ledControl(false, 2);
ledControl(true, 3);
}
}
else {
@ -246,7 +226,7 @@ void usbController::run()
void usbController::runTimer()
{
int res=1;
while (res > 0) {
QByteArray data(HIDDATALENGTH, 0x0);
res = hid_read(handle, (unsigned char*)data.data(), HIDDATALENGTH);
@ -336,100 +316,111 @@ void usbController::runTimer()
else if ((res > 31) && usbDevice == 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;
BUTTON* butf1 = Q_NULLPTR;
BUTTON* butf2 = Q_NULLPTR;;
for (BUTTON* but = buttonList->begin(); but != buttonList->end(); but++) {
if (but->dev == usbDevice) {
for (BUTTON* but = buttonList->begin(); but != buttonList->end(); but++) {
if (but->dev == usbDevice) {
if (but->num == 0)
{
butptt = but;
}
else if (but->num == 1)
{
butf1 = but;
}
else if (but->num == 2)
{
butf2 = but;
if (but->num == 0)
{
butptt = but;
}
else if (but->num == 1)
{
butf1 = 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;
}
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())
@ -466,16 +457,17 @@ void usbController::runTimer()
void usbController::ledControl(bool on, unsigned char num)
{
if (usbDevice == RC28) {
QByteArray data(9, 0x0);
data[0] = 8;
QByteArray data(3, 0x0);
data[1] = 0x01;
unsigned char ledNum = 0x07;
static unsigned char ledNum = 0x07;
if (on)
ledNum &= ~(1ULL << (num - 1));
ledNum &= ~(1UL << num);
else
ledNum |= 1UL << num;
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) {
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)
{
for (BUTTON* but = buttonList->begin(); but != buttonList->end(); but++) {

Wyświetl plik

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

Wyświetl plik

@ -389,6 +389,8 @@ void wfmain::rigConnections()
connect(rig, SIGNAL(haveDuplexMode(duplexMode)), rpt, SLOT(receiveDuplexMode(duplexMode)));
connect(this, SIGNAL(getRptDuplexOffset()), rig, SLOT(getRptDuplexOffset()));
connect(rig, SIGNAL(haveRptOffsetFrequency(freqt)), rpt, SLOT(handleRptOffsetFrequency(freqt)));
// These are the current tone frequency or DCS code selected:
connect(rpt, SIGNAL(getTone()), rig, SLOT(getTone()));
connect(rpt, SIGNAL(getTSQL()), rig, SLOT(getTSQL()));
connect(rpt, SIGNAL(getDTCS()), rig, SLOT(getDTCS()));
@ -399,13 +401,32 @@ void wfmain::rigConnections()
connect(this->rpt, &repeaterSetup::setTSQL,
[=](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(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,
[=](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(setTone(rptrTone_t)), rig, SLOT(setTone(rptrTone_t)));
@ -422,8 +443,11 @@ void wfmain::rigConnections()
this->splitModeEnabled = false;
});
connect(this, SIGNAL(getToneEnabled()), rig, SLOT(getToneEnabled()));
connect(this, SIGNAL(getTSQLEnabled()), rig, SLOT(getToneSqlEnabled()));
connect(this->rpt, &repeaterSetup::setTransmitFrequency,
[=](const freqt &transmitFreq) { issueCmd(cmdSetFreq, transmitFreq);});
[=](const freqt &transmitFreq) { issueCmdUniquePriority(cmdSetFreq, transmitFreq);});
connect(this->rpt, &repeaterSetup::setTransmitMode,
[=](const mode_info &transmitMode) { issueCmd(cmdSetMode, transmitMode);});
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(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(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(button(const COMMAND*)), this, SLOT(buttonControl(const COMMAND*)));
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>*)));
usbControllerThread->start(QThread::LowestPriority);
@ -1665,7 +1689,6 @@ void wfmain::pttToggle(bool status)
}
emit setPTT(status);
emit controllerLed(status, 1);
// Start 3 minute timer
if (status)
pttTimer->start();
@ -1699,11 +1722,11 @@ void wfmain::buttonControl(const COMMAND* cmd)
case cmdGetBandStackReg:
issueCmd((cmds)cmd->command, cmd->band);
break;
case cmdSetBandUp:
case cmdSetBandDown:
for (size_t i = 0; i < rigCaps.bands.size(); i++) {
if (rigCaps.bands[i].band == lastRequestedBand)
{
if (i>0) {
if (i > 0) {
issueCmd(cmdGetBandStackReg, rigCaps.bands[i - 1].band);
}
else {
@ -1712,7 +1735,7 @@ void wfmain::buttonControl(const COMMAND* cmd)
}
}
break;
case cmdSetBandDown:
case cmdSetBandUp:
for (size_t i = 0; i < rigCaps.bands.size(); i++) {
if (rigCaps.bands[i].band == lastRequestedBand)
{
@ -3445,7 +3468,11 @@ void wfmain:: getInitialRigState()
{
issueDelayedCommand(cmdGetDTCS);
}
issueDelayedCommand(cmdGetRptAccessMode);
if(rigCaps.hasCTCSS || rigCaps.hasDTCS)
{
issueDelayedCommand(cmdGetRptAccessMode);
}
if(rigCaps.hasAntennaSel)
{
@ -3745,7 +3772,43 @@ void wfmain::doCmd(commandtype cmddata)
case cmdSetRptAccessMode:
{
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);
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;
}
case cmdSetRptDuplexOffset:
@ -3754,11 +3817,16 @@ void wfmain::doCmd(commandtype cmddata)
emit setRptDuplexOffset(f);
break;
}
case cmdSetQuickSplit:
{
bool qsEnabled = (*std::static_pointer_cast<bool>(data));
emit setQuickSplit(qsEnabled);
break;
}
case cmdSetPTT:
{
bool pttrequest = (*std::static_pointer_cast<bool>(data));
emit setPTT(pttrequest);
emit controllerLed(pttrequest, 1);
ui->meter2Widget->clearMeterOnPTTtoggle();
if (pttrequest)
@ -3774,7 +3842,6 @@ void wfmain::doCmd(commandtype cmddata)
{
bool pttrequest = !amTransmitting;
emit setPTT(pttrequest);
emit controllerLed(pttrequest, 1);
ui->meter2Widget->clearMeterOnPTTtoggle();
if (pttrequest)
{
@ -3950,7 +4017,19 @@ void wfmain::doCmd(cmds cmd)
emit getDTCS();
break;
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;
case cmdDispEnable:
emit scopeDisplayEnable();
@ -4450,6 +4529,10 @@ void wfmain::receiveRigID(rigCapabilities rigCaps)
}
haveRigCaps = true;
if (rigCaps.bands.size() > 0) {
lastRequestedBand = rigCaps.bands[0].band;
}
// Added so that server receives rig capabilities.
emit sendRigCaps(rigCaps);
rpt->setRig(rigCaps);
@ -5083,6 +5166,17 @@ void wfmain::receiveSpectrumMode(spectrumMode 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)
{
@ -5191,6 +5285,10 @@ void wfmain::handlePlotClick(QMouseEvent* me)
this->mousePressFreq = plot->xAxis->pixelToCoord(cursor);
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)
{
@ -7818,8 +7916,8 @@ void wfmain::on_underlayAverageBuffer_toggled(bool checked)
void wfmain::on_debugBtn_clicked()
{
qInfo(logSystem()) << "Debug button pressed.";
qDebug(logSystem()) << "Query for repeater duplex offset 0x0C headed out";
issueDelayedCommand(cmdGetRptDuplexOffset);
qDebug(logSystem()) << "Query for repeater access mode (tone, tsql, etc) sent.";
issueDelayedCommand(cmdGetRptAccessMode);
}
// ---------- 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]));
// 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, 2, QRect(193, 373, 98, 46), Qt::red, &usbCommands[0], &usbCommands[0]));
@ -9112,58 +9210,61 @@ void wfmain::resetUsbButtons()
void wfmain::resetUsbCommands()
{
usbCommands.clear();
usbCommands.append(COMMAND(0, "None", cmdNone, 0x0));
usbCommands.append(COMMAND(1, "PTT On", cmdSetPTT, 0x1));
usbCommands.append(COMMAND(2, "PTT Off", cmdSetPTT, 0x0));
usbCommands.append(COMMAND(3, "PTT Toggle", cmdPTTToggle, 0x0));
usbCommands.append(COMMAND(4, "Tune", cmdStartATU, 0x0));
usbCommands.append(COMMAND(5, "Step+", cmdSetStepUp, 0x0));
usbCommands.append(COMMAND(6, "Step-", cmdSetStepDown, 0x0));
usbCommands.append(COMMAND(7, "Span+", cmdSetSpanUp, 0x0));
usbCommands.append(COMMAND(8, "Span-", cmdSetSpanDown, 0x0));
usbCommands.append(COMMAND(9, "Mode+", cmdSetModeUp, 0x0));
usbCommands.append(COMMAND(10, "Mode-", cmdSetModeDown, 0x0));
usbCommands.append(COMMAND(11, "Mode LSB", cmdSetMode, modeLSB));
usbCommands.append(COMMAND(12, "Mode USB", cmdSetMode, modeUSB));
usbCommands.append(COMMAND(13, "Mode LSBD", cmdSetMode, modeLSB_D));
usbCommands.append(COMMAND(14, "Mode USBD", cmdSetMode, modeUSB_D));
usbCommands.append(COMMAND(15, "Mode CW", cmdSetMode, modeCW));
usbCommands.append(COMMAND(16, "Mode CWR", cmdSetMode, modeCW_R));
usbCommands.append(COMMAND(17, "Mode FM", cmdSetMode, modeFM));
usbCommands.append(COMMAND(18, "Mode AM", cmdSetMode, modeAM));
usbCommands.append(COMMAND(19, "Mode RTTY", cmdSetMode, modeRTTY));
usbCommands.append(COMMAND(20, "Mode RTTYR", cmdSetMode, modeRTTY_R));
usbCommands.append(COMMAND(21, "Mode PSK", cmdSetMode, modePSK));
usbCommands.append(COMMAND(22, "Mode PSKR", cmdSetMode, modePSK_R));
usbCommands.append(COMMAND(23, "Mode DV", cmdSetMode, modeDV));
usbCommands.append(COMMAND(24, "Mode DD", cmdSetMode, modeDD));
usbCommands.append(COMMAND(25, "Band+", cmdSetBandUp, 0x0));
usbCommands.append(COMMAND(26, "Band-", cmdSetBandDown, 0x0));
usbCommands.append(COMMAND(27, "23cm", cmdGetBandStackReg, band23cm));
usbCommands.append(COMMAND(28, "70cm", cmdGetBandStackReg, band70cm));
usbCommands.append(COMMAND(29, "2m", cmdGetBandStackReg, band2m));
usbCommands.append(COMMAND(30, "AIR", cmdGetBandStackReg, bandAir));
usbCommands.append(COMMAND(31, "WFM", cmdGetBandStackReg, bandWFM));
usbCommands.append(COMMAND(32, "4m", cmdGetBandStackReg, band4m));
usbCommands.append(COMMAND(33, "6m", cmdGetBandStackReg, band6m));
usbCommands.append(COMMAND(34, "10m", cmdGetBandStackReg, band10m));
usbCommands.append(COMMAND(35, "12m", cmdGetBandStackReg, band12m));
usbCommands.append(COMMAND(36, "15m", cmdGetBandStackReg, band15m));
usbCommands.append(COMMAND(37, "17m", cmdGetBandStackReg, band17m));
usbCommands.append(COMMAND(38, "20m", cmdGetBandStackReg, band20m));
usbCommands.append(COMMAND(39, "30m", cmdGetBandStackReg, band30m));
usbCommands.append(COMMAND(40, "40m", cmdGetBandStackReg, band40m));
usbCommands.append(COMMAND(41, "60m", cmdGetBandStackReg, band60m));
usbCommands.append(COMMAND(42, "80m", cmdGetBandStackReg, band80m));
usbCommands.append(COMMAND(43, "160m", cmdGetBandStackReg, band160m));
usbCommands.append(COMMAND(44, "630m", cmdGetBandStackReg, band630m));
usbCommands.append(COMMAND(45, "2200m", cmdGetBandStackReg, band2200m));
usbCommands.append(COMMAND(46, "GEN", cmdGetBandStackReg, bandGen));
usbCommands.append(COMMAND(47, "NR On", cmdNone, 0x0));
usbCommands.append(COMMAND(48, "NR Off", cmdNone, 0x0));
usbCommands.append(COMMAND(49, "NB On", cmdNone, 0x0));
usbCommands.append(COMMAND(50, "NB Off", cmdNone, 0x0));
usbCommands.append(COMMAND(51, "Split On", cmdNone, 0x01));
usbCommands.append(COMMAND(52, "Split Off", cmdNone, 0x0));
int num = 0;
usbCommands.append(COMMAND(num++, "None", cmdNone, 0x0));
usbCommands.append(COMMAND(num++, "PTT On", cmdSetPTT, 0x1));
usbCommands.append(COMMAND(num++, "PTT Off", cmdSetPTT, 0x0));
usbCommands.append(COMMAND(num++, "PTT Toggle", cmdPTTToggle, 0x0));
usbCommands.append(COMMAND(num++, "Tune", cmdStartATU, 0x0));
usbCommands.append(COMMAND(num++, "Step+", cmdSetStepUp, 0x0));
usbCommands.append(COMMAND(num++, "Step-", cmdSetStepDown, 0x0));
usbCommands.append(COMMAND(num++, "Span+", cmdSetSpanUp, 0x0));
usbCommands.append(COMMAND(num++, "Span-", cmdSetSpanDown, 0x0));
usbCommands.append(COMMAND(num++, "Mode+", cmdSetModeUp, 0x0));
usbCommands.append(COMMAND(num++, "Mode-", cmdSetModeDown, 0x0));
usbCommands.append(COMMAND(num++, "Mode LSB", cmdSetMode, modeLSB));
usbCommands.append(COMMAND(num++, "Mode USB", cmdSetMode, modeUSB));
usbCommands.append(COMMAND(num++, "Mode LSBD", cmdSetMode, modeLSB_D));
usbCommands.append(COMMAND(num++, "Mode USBD", cmdSetMode, modeUSB_D));
usbCommands.append(COMMAND(num++, "Mode CW", cmdSetMode, modeCW));
usbCommands.append(COMMAND(num++, "Mode CWR", cmdSetMode, modeCW_R));
usbCommands.append(COMMAND(num++, "Mode FM", cmdSetMode, modeFM));
usbCommands.append(COMMAND(num++, "Mode AM", cmdSetMode, modeAM));
usbCommands.append(COMMAND(num++, "Mode RTTY", cmdSetMode, modeRTTY));
usbCommands.append(COMMAND(num++, "Mode RTTYR", cmdSetMode, modeRTTY_R));
usbCommands.append(COMMAND(num++, "Mode PSK", cmdSetMode, modePSK));
usbCommands.append(COMMAND(num++, "Mode PSKR", cmdSetMode, modePSK_R));
usbCommands.append(COMMAND(num++, "Mode DV", cmdSetMode, modeDV));
usbCommands.append(COMMAND(num++, "Mode DD", cmdSetMode, modeDD));
usbCommands.append(COMMAND(num++, "Band+", cmdSetBandUp, 0x0));
usbCommands.append(COMMAND(num++, "Band-", cmdSetBandDown, 0x0));
usbCommands.append(COMMAND(num++, "23cm", cmdGetBandStackReg, band23cm));
usbCommands.append(COMMAND(num++, "70cm", cmdGetBandStackReg, band70cm));
usbCommands.append(COMMAND(num++, "2m", cmdGetBandStackReg, band2m));
usbCommands.append(COMMAND(num++, "AIR", cmdGetBandStackReg, bandAir));
usbCommands.append(COMMAND(num++, "WFM", cmdGetBandStackReg, bandWFM));
usbCommands.append(COMMAND(num++, "4m", cmdGetBandStackReg, band4m));
usbCommands.append(COMMAND(num++, "6m", cmdGetBandStackReg, band6m));
usbCommands.append(COMMAND(num++, "10m", cmdGetBandStackReg, band10m));
usbCommands.append(COMMAND(num++, "12m", cmdGetBandStackReg, band12m));
usbCommands.append(COMMAND(num++, "15m", cmdGetBandStackReg, band15m));
usbCommands.append(COMMAND(num++, "17m", cmdGetBandStackReg, band17m));
usbCommands.append(COMMAND(num++, "20m", cmdGetBandStackReg, band20m));
usbCommands.append(COMMAND(num++, "30m", cmdGetBandStackReg, band30m));
usbCommands.append(COMMAND(num++, "40m", cmdGetBandStackReg, band40m));
usbCommands.append(COMMAND(num++, "60m", cmdGetBandStackReg, band60m));
usbCommands.append(COMMAND(num++, "80m", cmdGetBandStackReg, band80m));
usbCommands.append(COMMAND(num++, "160m", cmdGetBandStackReg, band160m));
usbCommands.append(COMMAND(num++, "630m", cmdGetBandStackReg, band630m));
usbCommands.append(COMMAND(num++, "2200m", cmdGetBandStackReg, band2200m));
usbCommands.append(COMMAND(num++, "GEN", cmdGetBandStackReg, bandGen));
usbCommands.append(COMMAND(num++, "NR On", cmdNone, 0x0));
usbCommands.append(COMMAND(num++, "NR Off", cmdNone, 0x0));
usbCommands.append(COMMAND(num++, "NB On", cmdNone, 0x0));
usbCommands.append(COMMAND(num++, "NB 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);
}
}

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

@ -19,21 +19,43 @@ DEFINES += BUILD_WFSERVER
CONFIG(debug, release|debug) {
# For Debug builds only:
QMAKE_CXXFLAGS += -faligned-new
win32:DESTDIR = wfview-release
win32:LIBS += -L../portaudio/msvc/Win32/Debug/ -lportaudio_x86 -ole32
# For Debug builds only:
linux:QMAKE_CXXFLAGS += -faligned-new
win32 {
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 {
# For Release builds only:
linux:QMAKE_CXXFLAGS += -s
QMAKE_CXXFLAGS += -fvisibility=hidden
QMAKE_CXXFLAGS += -fvisibility-inlines-hidden
QMAKE_CXXFLAGS += -faligned-new
linux:QMAKE_LFLAGS += -O2 -s
win32:DESTDIR = wfview-debug
win32:LIBS += -L../portaudio/msvc/Win32/Release/ -lportaudio_x86 -lole32
# For Release builds only:
linux:QMAKE_CXXFLAGS += -s
linux:QMAKE_CXXFLAGS += -fvisibility=hidden
linux:QMAKE_CXXFLAGS += -fvisibility-inlines-hidden
linux:QMAKE_CXXFLAGS += -faligned-new
linux:QMAKE_LFLAGS += -O2 -s
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
win32:DEFINES += __WINDOWS_WASAPI__
#win32:DEFINES += __WINDOWS_DS__ # Requires DirectSound libraries
@ -103,15 +125,6 @@ RESOURCES += qdarkstyle/style.qrc \
unix:target.path = $$PREFIX/bin
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
macx:LIBS += -framework CoreAudio -framework CoreFoundation -lpthread -lopus

Wyświetl plik

@ -98,12 +98,20 @@ enum rptAccessTxRx {
ratrDN=0x06, // "DTCS(T)"
ratrTD=0x07, // "TONE(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 {
rptAccessTxRx accessMode = ratrNN;
bool useSecondaryVFO = false;
bool turnOffTone = false;
bool turnOffTSQL = false;
bool usingSequence = false;
int sequence = 0;
};
struct mode_info {
@ -153,12 +161,15 @@ enum cmds {
cmdGetCurrentModLevel, cmdStartRegularPolling, cmdStopRegularPolling, cmdQueNormalSpeed,
cmdGetVdMeter, cmdGetIdMeter, cmdGetSMeter, cmdGetCenterMeter, cmdGetPowerMeter,
cmdGetSWRMeter, cmdGetALCMeter, cmdGetCompMeter, cmdGetTxRxMeter,
cmdGetTone, cmdGetTSQL, cmdGetDTCS, cmdGetRptAccessMode, cmdSetTone, cmdSetTSQL, cmdSetRptAccessMode, cmdSetRptDuplexOffset, cmdGetRptDuplexOffset,
cmdSelVFO, cmdVFOSwap, cmdVFOEqualAB, cmdVFOEqualMS,
cmdGetTone, cmdGetTSQL, cmdGetToneEnabled, cmdGetTSQLEnabled, cmdGetDTCS,
cmdSetToneEnabled, cmdSetTSQLEnabled, cmdGetRptAccessMode, cmdSetTone, cmdSetTSQL,
cmdSetRptAccessMode, cmdSetRptDuplexOffset, cmdGetRptDuplexOffset,
cmdSelVFO, cmdVFOSwap, cmdVFOEqualAB, cmdVFOEqualMS, cmdSetQuickSplit,
cmdGetPreamp, cmdGetAttenuator, cmdGetAntenna,
cmdGetBandStackReg, cmdGetKeySpeed, cmdSetKeySpeed, cmdGetBreakMode, cmdSetBreakMode, cmdSendCW, cmdStopCW,
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 {
@ -183,4 +194,6 @@ enum codecType { LPCM, PCMU, OPUS };
enum passbandActions {passbandStatic, pbtInnerMove, pbtOuterMove, pbtMoving, passbandResizing};
enum usbDeviceType { usbNone = 0, shuttleXpress, shuttlePro2, RC28, xBoxGamepad, unknownGamepad };
#endif // WFVIEWTYPES_H