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: + + + + + +