diff --git a/rigcommander.cpp b/rigcommander.cpp index c9b970d..7ddcd08 100644 --- a/rigcommander.cpp +++ b/rigcommander.cpp @@ -542,6 +542,7 @@ void rigCommander::setFrequency(freqt freq) //printHex(cmdPayload, false, true); prepDataAndSend(cmdPayload); + rigState.vfoAFreq = freq; } QByteArray rigCommander::makeFreqPayload(freqt freq) @@ -613,6 +614,8 @@ void rigCommander::setMode(unsigned char mode, unsigned char modeFilter) payload.append(modeFilter); } prepDataAndSend(payload); + rigState.mode = mode; + rigState.filter = modeFilter; } } @@ -629,6 +632,7 @@ void rigCommander::setDataMode(bool dataOn) payload.append("\x00\x00", 2); // data mode off, bandwidth not defined per ICD. } prepDataAndSend(payload); + rigState.datamode = dataOn; } void rigCommander::getFrequency() @@ -887,6 +891,7 @@ void rigCommander::setPTT(bool pttOn) QByteArray payload("\x1C\x00", 2); payload.append((char)pttOn); prepDataAndSend(payload); + rigState.ptt = pttOn; } } @@ -1961,6 +1966,7 @@ void rigCommander::parseRegisters1A() // YY: filter selected, 01 through 03.; // if YY is 00 then XX was also set to 00 emit haveDataMode((bool)payloadIn[03]); + rigState.datamode = (bool)payloadIn[03]; break; case '\x07': // IP+ status diff --git a/rigcommander.h b/rigcommander.h index 5f34d98..411fa72 100644 --- a/rigcommander.h +++ b/rigcommander.h @@ -46,6 +46,7 @@ struct rigStateStruct { unsigned char ptt; unsigned char mode; unsigned char filter; + bool datamode; }; class rigCommander : public QObject diff --git a/rigctld.cpp b/rigctld.cpp index 6cda1c5..2f86350 100644 --- a/rigctld.cpp +++ b/rigctld.cpp @@ -120,8 +120,10 @@ void rigCtlClient::socketReadyRead() const QRegExp rx(QLatin1Literal("[^0-9]+")); auto&& parts = commandBuffer.split(rx); freqt freq; - freq.Hz = parts[1].toInt(); - emit parent->setFrequency(freq); + if (parts.length() > 1) { + freq.Hz = parts[1].toInt(); + emit parent->setFrequency(freq); + } sendData(QString("RPRT 0\n")); } else if (commandBuffer[num] == "1" || commandBuffer.contains("\\dump_caps")) @@ -148,11 +150,17 @@ void rigCtlClient::socketReadyRead() } else if (commandBuffer[num] == "m") { - sendData(QString("FM\n15000\n")); + sendData(QString("%1\n%2\n").arg(getMode(rigState->mode,rigState->datamode)).arg(getFilter(rigState->mode,rigState->filter))); } else if (commandBuffer[num] == "M") { // Set mode + const QRegExp rx(QLatin1Literal("\\s+")); + auto&& parts = commandBuffer.split(rx); + if (parts.length() > 1) { + qDebug(logRigCtlD()) << "setting mode: " << getMode(parts[1]); + emit parent->setMode(getMode(parts[1]), 0x06); + } sendData(QString("RPRT 0\n")); } else if (commandBuffer[num] == "s") @@ -203,4 +211,138 @@ void rigCtlClient::dumpCaps(QString sep) sendData(QString("DCD type:\tRig capable%1").arg(sep)); sendData(QString("Port type:\tNetwork link%1").arg(sep)); sendData(QString("\n")); +} + +QString rigCtlClient::getFilter(unsigned char mode, unsigned char filter) { + + if (mode == 3 || mode == 7 || mode == 12 || mode == 17) { + switch (filter) { + case 1: + return QString("1200"); + case 2: + return QString("500"); + case 3: + return QString("250"); + } + } + else if (mode == 4 || mode == 8) + { + switch (filter) { + case 1: + return QString("2400"); + case 2: + return QString("500"); + case 3: + return QString("250"); + } + } + else if (mode == 2) + { + switch (filter) { + case 1: + return QString("9000"); + case 2: + return QString("6000"); + case 3: + return QString("3000"); + } + } + else if (mode == 5) + { + switch (filter) { + case 1: + return QString("15000"); + case 2: + return QString("10000"); + case 3: + return QString("7000"); + } + } + else { // SSB or unknown mode + switch (filter) { + case 1: + return QString("3000"); + case 2: + return QString("2400"); + case 3: + return QString("1800"); + } + } + return QString(""); +} + +QString rigCtlClient::getMode(unsigned char mode, bool datamode) { + switch (mode) { + case 0: + return QString("LSB"); + case 1: + return QString("USB"); + case 2: + return QString("AM"); + case 3: + return QString("CW"); + case 4: + return QString("RTTY"); + case 5: + return QString("FM"); + case 6: + return QString("WFM"); + case 7: + return QString("CWR"); + case 8: + return QString("RTTYR"); + case 12: + return QString("PKTUSB"); + case 17: + return QString("PKTLSB"); + case 22: + return QString("PKTFM"); + default: + return QString(""); + } + return QString(""); +} + +unsigned char rigCtlClient::getMode(QString modeString) { + + if (modeString == QString("LSB")) { + return 0; + } + else if (modeString == QString("USB")) { + return 1; + } + else if (modeString == QString("AM")) { + return 2; + } + else if (modeString == QString("CW")) { + return 3; + } + else if (modeString == QString("RTTY")) { + return 4; + } + else if (modeString == QString("FM")) { + return 5; + } + else if (modeString == QString("WFM")) { + return 6; + } + else if (modeString == QString("CWR")) { + return 7; + } + else if (modeString == QString("RTTYR")) { + return 8; + } + else if (modeString == QString("PKTUSB")) { + return 1; + } + else if (modeString == QString("PKTLSB")) { + return 0; + } + else if (modeString == QString("PKTFM")) { + return 22; + } + else { + return 0; + } + return 0; } \ No newline at end of file diff --git a/rigctld.h b/rigctld.h index f18af29..2094ce1 100644 --- a/rigctld.h +++ b/rigctld.h @@ -29,6 +29,7 @@ signals: void sendData(QString data); void setFrequency(freqt freq); void setPTT(bool state); + void setMode(unsigned char mode, unsigned char modeFilter); public slots: virtual void incomingConnection(qintptr socketDescriptor); @@ -67,6 +68,9 @@ private: rigCapabilities rigCaps; rigStateStruct* rigState = Q_NULLPTR; rigCtlD* parent; + QString rigCtlClient::getMode(unsigned char mode, bool datamode); + unsigned char rigCtlClient::getMode(QString modeString); + QString rigCtlClient::getFilter(unsigned char mode, unsigned char filter); }; #endif diff --git a/wfmain.cpp b/wfmain.cpp index bf9ef64..9059b9c 100644 --- a/wfmain.cpp +++ b/wfmain.cpp @@ -640,6 +640,7 @@ void wfmain::openRig() if (rigCtl != Q_NULLPTR) { connect(rig, SIGNAL(stateInfo(rigStateStruct*)), rigCtl, SLOT(receiveStateInfo(rigStateStruct*))); connect(rigCtl, SIGNAL(setFrequency(freqt)), rig, SLOT(setFrequency(freqt))); + connect(rigCtl, SIGNAL(setMode(unsigned char, unsigned char)), rig, SLOT(setMode(unsigned char, unsigned char))); connect(rigCtl, SIGNAL(setPTT(bool)), rig, SLOT(setPTT(bool))); } }