From 3538e545d986cae5a6d47f8f22a3f280aef8e9c9 Mon Sep 17 00:00:00 2001 From: Elliott Liggett Date: Fri, 19 Feb 2021 00:14:40 -0800 Subject: [PATCH] We can now set the modulation input and read the modulation input for both data on and data off. Next step is to change the "Mic" slider to adjust whatever input is selected. --- rigcommander.cpp | 34 +++++++++++- rigcommander.h | 9 ---- rigidentities.h | 14 ++++- wfmain.cpp | 136 ++++++++++++++++++++++++++++++++++------------- wfmain.h | 11 ++-- wfmain.ui | 10 ++++ 6 files changed, 163 insertions(+), 51 deletions(-) diff --git a/rigcommander.cpp b/rigcommander.cpp index 7c92ac7..c46c36c 100644 --- a/rigcommander.cpp +++ b/rigcommander.cpp @@ -1607,9 +1607,9 @@ void rigCommander::parseDetailedRegisters1A05() // It is a work in progress. // TODO: inputMod source and gain for models: 7700, and 7600 - int level = bcdHexToUChar(payloadIn[4]) + (10*bcdHexToUChar(payloadIn[5])); + int level = bcdHexToUChar(payloadIn[4]) + (100*bcdHexToUChar(payloadIn[5])); - int subcmd = bcdHexToUChar(payloadIn[3]) + (10*bcdHexToUChar(payloadIn[2])); + int subcmd = bcdHexToUChar(payloadIn[3]) + (100*bcdHexToUChar(payloadIn[2])); rigInput input; input = (rigInput)bcdHexToUChar(payloadIn[4]); @@ -1620,6 +1620,7 @@ void rigCommander::parseDetailedRegisters1A05() case model9700: switch(subcmd) { + case 72: // course reference emit haveRefAdjustCourse( bcdHexToUChar(payloadIn[5]) + (100*bcdHexToUChar(payloadIn[4])) ); @@ -1915,6 +1916,8 @@ void rigCommander::determineRigCaps() rigCaps.spectAmpMax = 0; rigCaps.spectLenMax = 0; + rigCaps.inputs.append(inputMic); + rigCaps.hasTransmit = true; @@ -1925,6 +1928,8 @@ void rigCommander::determineRigCaps() rigCaps.spectSeqMax = 11; rigCaps.spectAmpMax = 160; rigCaps.spectLenMax = 475; + rigCaps.inputs.append(inputUSB); + rigCaps.inputs.append(inputACC); rigCaps.hasLan = false; rigCaps.hasEthernet = false; rigCaps.hasWiFi = false; @@ -1936,6 +1941,7 @@ void rigCommander::determineRigCaps() rigCaps.spectSeqMax = 11; rigCaps.spectAmpMax = 160; rigCaps.spectLenMax = 475; + rigCaps.inputs.clear(); rigCaps.hasLan = true; rigCaps.hasEthernet = true; rigCaps.hasWiFi = false; @@ -1947,6 +1953,9 @@ void rigCommander::determineRigCaps() rigCaps.spectSeqMax = 11; rigCaps.spectAmpMax = 160; rigCaps.spectLenMax = 475; + rigCaps.inputs.append(inputLAN); + rigCaps.inputs.append(inputUSB); + rigCaps.inputs.append(inputACC); rigCaps.hasLan = true; rigCaps.hasEthernet = true; rigCaps.hasWiFi = false; @@ -1959,6 +1968,9 @@ void rigCommander::determineRigCaps() rigCaps.spectSeqMax = 15; rigCaps.spectAmpMax = 200; rigCaps.spectLenMax = 689; + rigCaps.inputs.append(inputLAN); + rigCaps.inputs.append(inputUSB); + rigCaps.inputs.append(inputACC); rigCaps.hasLan = true; rigCaps.hasEthernet = true; rigCaps.hasWiFi = false; @@ -1969,6 +1981,10 @@ void rigCommander::determineRigCaps() rigCaps.spectSeqMax = 15; rigCaps.spectAmpMax = 136; rigCaps.spectLenMax = 689; + rigCaps.inputs.append(inputLAN); + rigCaps.inputs.append(inputUSB); + rigCaps.inputs.append(inputACCA); + rigCaps.inputs.append(inputACCB); rigCaps.hasLan = true; rigCaps.hasEthernet = true; rigCaps.hasWiFi = false; @@ -1980,6 +1996,8 @@ void rigCommander::determineRigCaps() rigCaps.spectSeqMax = 11; rigCaps.spectAmpMax = 160; rigCaps.spectLenMax = 475; + rigCaps.inputs.append(inputLAN); + rigCaps.inputs.append(inputUSB); rigCaps.hasLan = true; rigCaps.hasEthernet = false; rigCaps.hasWiFi = true; @@ -1987,9 +2005,20 @@ void rigCommander::determineRigCaps() rigCaps.hasDV = true; rigCaps.hasATU = true; break; + case model7100: + rigCaps.modelName = QString("IC-7100"); + rigCaps.hasSpectrum = false; + rigCaps.inputs.append(inputUSB); + rigCaps.inputs.append(inputACC); + rigCaps.hasLan = false; + rigCaps.hasEthernet = false; + rigCaps.hasWiFi = false; + rigCaps.hasATU = true; + break; case model706: rigCaps.modelName = QString("IC-706"); rigCaps.hasSpectrum = false; + rigCaps.inputs.clear(); rigCaps.hasLan = false; rigCaps.hasEthernet = false; rigCaps.hasWiFi = false; @@ -2001,6 +2030,7 @@ void rigCommander::determineRigCaps() rigCaps.spectSeqMax = 0; rigCaps.spectAmpMax = 0; rigCaps.spectLenMax = 0; + rigCaps.inputs.clear(); rigCaps.hasLan = false; rigCaps.hasEthernet = false; rigCaps.hasWiFi = false; diff --git a/rigcommander.h b/rigcommander.h index ef6a22f..d5b21b4 100644 --- a/rigcommander.h +++ b/rigcommander.h @@ -15,15 +15,6 @@ // note: using a define because switch case doesn't even work with const unsigned char. Surprised me. #define compCivAddr 0xE1 -enum rigInput{ inputMic=0, - inputACC=1, - inputUSB=3, - inputLAN=5, - inputACCA, - inputACCB, - inputUnknown=0xff -}; - enum duplexMode{ dmSplitOff=0x00, dmSplitOn=0x01, diff --git a/rigidentities.h b/rigidentities.h index 1cb4675..80b445e 100644 --- a/rigidentities.h +++ b/rigidentities.h @@ -3,8 +3,9 @@ #include #include +#include -// Credit: +// Credit for parts of CIV list: // http://www.docksideradio.com/Icom%20Radio%20Hex%20Addresses.htm // 7850 and 7851 have the same commands and are essentially identical @@ -25,6 +26,15 @@ enum model_kind { modelUnknown = 0xFF }; +enum rigInput{ inputMic=0, + inputACC=1, + inputUSB=3, + inputLAN=5, + inputACCA, + inputACCB, + inputNone, + inputUnknown=0xff +}; model_kind determineRadioModel(unsigned char rigID); @@ -40,6 +50,8 @@ struct rigCapabilities { bool hasEthernet; bool hasWiFi; + QVector inputs; + bool hasSpectrum; quint8 spectSeqMax; quint16 spectAmpMax; diff --git a/wfmain.cpp b/wfmain.cpp index 69f1d34..4eeb7d1 100644 --- a/wfmain.cpp +++ b/wfmain.cpp @@ -301,6 +301,10 @@ wfmain::wfmain(const QString serialPortCL, const QString hostCL, QWidget *parent connect(this, SIGNAL(setDuplexMode(duplexMode)), rig, SLOT(setDuplexMode(duplexMode))); connect(rig, SIGNAL(haveDuplexMode(duplexMode)), this, SLOT(receiveDuplexMode(duplexMode))); + connect(this, SIGNAL(getModInput(bool)), rig, SLOT(getModInput(bool))); + connect(rig, SIGNAL(haveModInput(rigInput,bool)), this, SLOT(receiveModInput(rigInput, bool))); + connect(this, SIGNAL(setModInput(rigInput, bool)), rig, SLOT(setModInput(rigInput,bool))); + connect(rig, SIGNAL(haveSpectrumData(QByteArray, double, double)), this, SLOT(receiveSpectrumData(QByteArray, double, double))); connect(rig, SIGNAL(haveSpectrumFixedMode(bool)), this, SLOT(receiveSpectrumFixedMode(bool))); connect(this, SIGNAL(setFrequency(double)), rig, SLOT(setFrequency(double))); @@ -630,23 +634,6 @@ void wfmain::receiveFoundRigID(rigCapabilities rigCaps) //now we know what the rig ID is: //qDebug() << "In wfview, we now have a reply to our request for rig identity sent to CIV BROADCAST."; - // We have to be careful here: - // If we enter this a second time, we will get two sets of DV and DD modes - // Also, if ever there is a rig with DV but without DV, we'll be off by one. - // A better solution is to translate the combo selection to a shared type - // such as an enum or even the actual CIV mode byte. - - /* - if(rigCaps.hasDV) - { - ui->modeSelectCombo->addItem("DV"); - } - if(rigCaps.hasDD) - { - ui->modeSelectCombo->addItem("DD"); - } - */ - delayedCommand->setInterval(100); // faster polling is ok now. receiveRigID(rigCaps); getInitialRigState(); @@ -1256,6 +1243,9 @@ void wfmain:: getInitialRigState() cmdOutQue.append(cmdDispEnable); cmdOutQue.append(cmdSpecOn); + cmdOutQue.append(cmdGetModInput); + cmdOutQue.append(cmdGetModDataInput); + cmdOutQue.append(cmdNone); if(rigCaps.hasATU) @@ -1430,6 +1420,12 @@ void wfmain::runDelayedCommand() case cmdSetDataModeOn: emit setDataMode(true); break; + case cmdGetModInput: + emit getModInput(false); + break; + case cmdGetModDataInput: + emit getModInput(true); + break; case cmdGetDuplexMode: emit getDuplexMode(); break; @@ -1547,6 +1543,42 @@ void wfmain::receiveRigID(rigCapabilities rigCaps) ui->satOpsBtn->setDisabled(true); ui->adjRefBtn->setDisabled(true); } + QString inName; + for(int i=0; i < rigCaps.inputs.length(); i++) + { + switch(rigCaps.inputs.at(i)) + { + case inputMic: + inName = "Mic"; + break; + case inputLAN: + inName = "LAN"; + break; + case inputUSB: + inName = "USB"; + break; + case inputACC: + inName = "ACC"; + break; + case inputACCA: + inName = "ACCA"; + break; + case inputACCB: + inName = "ACCB"; + break; + default: + inName = "Unknown"; + break; + + } + ui->modInputCombo->addItem(inName, rigCaps.inputs.at(i)); + ui->modInputDataCombo->addItem(inName, rigCaps.inputs.at(i)); + } + if(rigCaps.inputs.length() == 0) + { + ui->modInputCombo->addItem("None", inputNone); + ui->modInputDataCombo->addItem("None", inputNone); + } ui->tuneEnableChk->setEnabled(rigCaps.hasATU); ui->tuneNowBtn->setEnabled(rigCaps.hasATU); @@ -2701,9 +2733,30 @@ void wfmain::receiveMicGain(unsigned char gain) changeSliderQuietly(ui->micGainSlider, gain); } -void wfmain::receiveModInput(rigInput input) +void wfmain::receiveModInput(rigInput input, bool dataOn) { - (void)input; + QComboBox *box; + bool found; + qDebug() << "Found rig input " << (int) input << " with data set to: " << dataOn; + if(dataOn) + { + box = ui->modInputDataCombo; + } else { + box = ui->modInputCombo; + } + + for(int i=0; i < box->count(); i++) + { + if(box->itemData(i).toInt() == (int)input) + { + box->blockSignals(true); + box->setCurrentIndex(i); + box->blockSignals(false); + found = true; + } + } + if(!found) + qDebug() << "Could not find modulation input: " << (int)input; } void wfmain::receiveDuplexMode(duplexMode dm) @@ -2782,23 +2835,6 @@ void wfmain::receiveSpectrumRefLevel(int level) changeSliderQuietly(ui->scopeRefLevelSlider, level); } -// --- DEBUG FUNCTION --- -void wfmain::on_debugBtn_clicked() -{ - qDebug() << "Debug button pressed."; - - // TODO: Why don't these commands work?! - //emit getScopeMode(); - //emit getScopeEdge(); // 1,2,3 only in "fixed" mode - //emit getScopeSpan(); // in khz, only in "center" mode - - // emit getLevels(); - // emit getMeters(amTransmitting); - - //emit getSpectrumRefLevel(); - emit getDuplexMode(); -} - // Slot to send/receive server config. // If store is true then write to config otherwise send current config by signal void wfmain::serverConfigRequested(SERVERCONFIG conf, bool store) @@ -2844,4 +2880,32 @@ void wfmain::on_rptAutoBtn_clicked() emit setDuplexMode(dmDupAutoOn); } +void wfmain::on_modInputCombo_activated(int index) +{ + emit setModInput( (rigInput)ui->modInputCombo->currentData().toInt(), false ); +} + +void wfmain::on_modInputDataCombo_activated(int index) +{ + emit setModInput( (rigInput)ui->modInputDataCombo->currentData().toInt(), true ); +} + +// --- DEBUG FUNCTION --- +void wfmain::on_debugBtn_clicked() +{ + qDebug() << "Debug button pressed."; + + // TODO: Why don't these commands work?! + //emit getScopeMode(); + //emit getScopeEdge(); // 1,2,3 only in "fixed" mode + //emit getScopeSpan(); // in khz, only in "center" mode + + // emit getLevels(); + // emit getMeters(amTransmitting); + + // emit getTSQL(); + emit getModInput(false); + emit getModInput(true); +} + diff --git a/wfmain.h b/wfmain.h index 114630d..07c2bc3 100644 --- a/wfmain.h +++ b/wfmain.h @@ -47,7 +47,8 @@ signals: void getDataMode(); void getDuplexMode(); void setDuplexMode(duplexMode dm); - void getModInput(); + void getModInput(bool dataOn); + void setModInput(rigInput input, bool dataOn); void getPTT(); void setPTT(bool pttOn); void getBandStackReg(char band, char regCode); @@ -149,7 +150,7 @@ private slots: void receivePTTstatus(bool pttOn); void receiveDataModeStatus(bool dataOn); void receiveBandStackReg(float freq, char mode, bool dataOn); // freq, mode, (filter,) datamode - void receiveModInput(rigInput input); + void receiveModInput(rigInput input, bool dataOn); void receiveDuplexMode(duplexMode dm); @@ -356,6 +357,10 @@ private slots: void on_useSystemThemeChk_clicked(bool checked); + void on_modInputCombo_activated(int index); + + void on_modInputDataCombo_activated(int index); + private: Ui::wfmain *ui; QSettings settings; @@ -448,7 +453,7 @@ private: enum cmds {cmdNone, cmdGetRigID, cmdGetRigCIV, cmdGetFreq, cmdGetMode, cmdGetDataMode, cmdSetDataModeOn, cmdSetDataModeOff, cmdSpecOn, cmdSpecOff, cmdDispEnable, cmdDispDisable, cmdGetRxGain, cmdGetAfGain, cmdGetSql, cmdGetATUStatus, cmdScopeCenterMode, cmdScopeFixedMode, cmdGetPTT, - cmdGetTxPower, cmdGetMicGain, cmdGetSpectrumRefLevel, cmdGetDuplexMode}; + cmdGetTxPower, cmdGetMicGain, cmdGetSpectrumRefLevel, cmdGetDuplexMode, cmdGetModInput, cmdGetModDataInput}; cmds cmdOut; QVector cmdOutQue; freqMemory mem; diff --git a/wfmain.ui b/wfmain.ui index 2717597..08f2981 100644 --- a/wfmain.ui +++ b/wfmain.ui @@ -1511,6 +1511,16 @@ + + + + Data Mod Input: + + + + + +