Merge branch 'rigctl-enhancement'

merge-requests/8/head
Roeland Jansen 2021-12-10 12:09:32 +01:00
commit da9f60e0bc
5 zmienionych plików z 192 dodań i 34 usunięć

Wyświetl plik

@ -22,6 +22,7 @@
rigCommander::rigCommander()
{
state.set(SCOPEFUNC,true,false);
}
rigCommander::~rigCommander()
@ -1703,6 +1704,20 @@ void rigCommander::setModInputLevel(rigInput input, unsigned char level)
}
}
void rigCommander::setAfMute(bool gainOn)
{
QByteArray payload("\x1a\x09");
payload.append((quint8)gainOn);
prepDataAndSend(payload);
}
void rigCommander::setDialLock(bool lockOn)
{
QByteArray payload("\x16\x50");
payload.append((quint8)lockOn);
prepDataAndSend(payload);
}
void rigCommander::getModInputLevel(rigInput input)
{
switch(input)
@ -1736,6 +1751,18 @@ void rigCommander::getModInputLevel(rigInput input)
}
}
void rigCommander::getAfMute()
{
QByteArray payload("\x1a\x09");
prepDataAndSend(payload);
}
void rigCommander::getDialLock()
{
QByteArray payload("\x16\x50");
prepDataAndSend(payload);
}
QByteArray rigCommander::getUSBAddr()
{
QByteArray payload;
@ -2347,6 +2374,7 @@ void rigCommander::parseRegister21()
break;
ritHz = f.Hz*((payloadIn.at(4)=='\x01')?-1:1);
emit haveRitFrequency(ritHz);
state.set(RITVALUE, ritHz, false);
break;
case '\x01':
// RIT on/off
@ -2356,6 +2384,7 @@ void rigCommander::parseRegister21()
} else {
emit haveRitEnabled(false);
}
state.set(RITFUNC, (bool)payloadIn.at(02), false);
break;
case '\x02':
// Delta TX setting on/off
@ -2373,6 +2402,8 @@ void rigCommander::parseATU()
// [1]: 0x01
// [2]: 0 = off, 0x01 = on, 0x02 = tuning in-progress
emit haveATUStatus((unsigned char) payloadIn[2]);
// This is a bool so any non-zero will mean enabled.
state.set(TUNERFUNC, (bool)payloadIn[2], false);
}
void rigCommander::parsePTT()
@ -2433,6 +2464,8 @@ void rigCommander::parseRegisters1A()
case '\x07':
// IP+ status
break;
case '\x09':
state.set(MUTEFUNC, (quint8)payloadIn[2], false);
default:
break;
}
@ -2505,13 +2538,13 @@ void rigCommander::parseRegister16()
case '\x43':
state.set(TSQLFUNC, payloadIn.at(2) != 0, false);
break;
case '\44':
case '\x44':
state.set(COMPFUNC, payloadIn.at(2) != 0, false);
break;
case '\45':
case '\x45':
state.set(MONFUNC, payloadIn.at(2) != 0, false);
break;
case '\46':
case '\x46':
state.set(VOXFUNC, payloadIn.at(2) != 0, false);
break;
case '\x47':
@ -2529,9 +2562,12 @@ void rigCommander::parseRegister16()
state.set(SBKINFUNC, false, false);
}
break;
case '\48': // Manual Notch
case '\x48': // Manual Notch
state.set(MNFUNC, payloadIn.at(2) != 0, false);
break;
case '\x50': // Dial lock
state.set(LOCKFUNC, payloadIn.at(2) != 0, false);
break;
default:
break;
}
@ -4469,6 +4505,87 @@ void rigCommander::stateUpdated()
powerOff();
}
}
break;
case RITVALUE:
if (i.value()._valid) {
setRitValue(state.getInt32(RITVALUE));
}
getRitValue();
break;
case RITFUNC:
if (i.value()._valid) {
setRitEnable(state.getBool(RITFUNC));
}
getRitEnabled();
break;
// All meters can only be updated from the rig end.
case SMETER:
case POWERMETER:
case ALCMETER:
case COMPMETER:
case VOLTAGEMETER:
case CURRENTMETER:
break;
case AGC:
break;
case MODINPUT:
break;
case FAGCFUNC:
break;
case AIPFUNC:
break;
case APFFUNC:
break;
case RFFUNC: // Should this set RF output power to 0?
break;
case AROFUNC:
break;
case MUTEFUNC:
if (i.value()._valid) {
setAfMute(state.getBool(MUTEFUNC));
}
getAfMute();
break;
case VSCFUNC:
break;
case REVFUNC:
break;
case SQLFUNC:
break;
case ABMFUNC:
break;
case BCFUNC:
break;
case MBCFUNC:
break;
case AFCFUNC:
break;
case SATMODEFUNC:
break;
case NBLEVEL:
break;
case NBDEPTH:
break;
case NBWIDTH:
break;
case NRLEVEL:
break;
case RESUMEFUNC:
break;
case TBURSTFUNC:
break;
case TUNERFUNC:
if (i.value()._valid) {
setATU(state.getBool(TUNERFUNC));
}
getATUStatus();
break;
case LOCKFUNC:
if (i.value()._valid) {
setDialLock(state.getBool(LOCKFUNC));
}
getDialLock();
break;
}
}
++i;

Wyświetl plik

@ -184,6 +184,8 @@ public slots:
void getACCGain(unsigned char ab);
void getModInput(bool dataOn);
void getModInputLevel(rigInput input);
void getAfMute();
void getDialLock();
// Set Levels:
void setSquelch(unsigned char level);
@ -204,6 +206,8 @@ public slots:
void setAntiVoxGain(unsigned char gain);
void setModInput(rigInput input, bool dataOn);
void setModInputLevel(rigInput input, unsigned char level);
void setAfMute(bool muteOn);
void setDialLock(bool lockOn);
// NB, NR, IP+:
void setIPP(bool enabled);

Wyświetl plik

@ -144,7 +144,7 @@ void rigCtlClient::socketReadyRead()
continue;
}
qDebug(logRigCtlD()) << sessionId << "command received" << commands;
//qDebug(logRigCtlD()) << sessionId << "command received" << commands;
// We have a full line so process command.
@ -185,6 +185,7 @@ void rigCtlClient::socketReadyRead()
if (command[0] == 0xf0 || command[0] == "chk_vfo")
{
chkVfoEecuted = true;
QString resp;
if (longReply) {
resp.append(QString("ChkVFO: "));
@ -198,29 +199,42 @@ void rigCtlClient::socketReadyRead()
response.append("1"); // rigctld protocol version
response.append(QString("%1").arg(rigCaps.rigctlModel));
response.append("0"); // Print something
bandType lastBand;
for (bandType band : rigCaps.bands)
{
response.append(generateFreqRange(band));
if (band != lastBand)
response.append(generateFreqRange(band));
lastBand = band;
}
response.append("0 0 0 0 0 0 0");
if (rigCaps.hasTransmit) {
for (bandType band : rigCaps.bands)
{
response.append(generateFreqRange(band));
{
if (band != lastBand)
response.append(generateFreqRange(band));
lastBand = band;
}
}
response.append("0 0 0 0 0 0 0");
response.append("0x1ff 1");
response.append("0x1ff 0");
response.append(QString("0x%1 1").arg(getRadioModes(), 0, 16));
response.append(QString("0x%1 10").arg(getRadioModes(), 0, 16));
response.append(QString("0x%1 100").arg(getRadioModes(), 0, 16));
response.append(QString("0x%1 1000").arg(getRadioModes(), 0, 16));
response.append(QString("0x%1 2500").arg(getRadioModes(), 0, 16));
response.append(QString("0x%1 5000").arg(getRadioModes(), 0, 16));
response.append(QString("0x%1 6125").arg(getRadioModes(), 0, 16));
response.append(QString("0x%1 8333").arg(getRadioModes(), 0, 16));
response.append(QString("0x%1 10000").arg(getRadioModes(), 0, 16));
response.append(QString("0x%1 12500").arg(getRadioModes(), 0, 16));
response.append(QString("0x%1 25000").arg(getRadioModes(), 0, 16));
response.append(QString("0x%1 100000").arg(getRadioModes(), 0, 16));
response.append(QString("0x%1 250000").arg(getRadioModes(), 0, 16));
response.append(QString("0x%1 1000000").arg(getRadioModes(), 0, 16));
response.append("0 0");
response.append("0x1e 2400");
response.append("0x2 500");
response.append("0x1 8000");
response.append("0x1 2400");
response.append("0x20 15000");
response.append("0x20 8000");
response.append("0x40 230000");
response.append(QString("0x%1 1200").arg(getRadioModes(), 0, 16));
response.append(QString("0x%1 2400").arg(getRadioModes(), 0, 16));
response.append(QString("0x%1 3000").arg(getRadioModes(), 0, 16));
response.append("0 0");
response.append("9900");
response.append("9900");
@ -283,7 +297,20 @@ void rigCtlClient::socketReadyRead()
response.append("0x7fffffff");
response.append("0x7fffffff");
*/
response.append("done");
if (chkVfoEecuted) {
response.append(QString("vfo_ops=0x%1").arg(255, 0, 16));
response.append(QString("ptt_type=0x%1").arg(rigCaps.hasTransmit, 0, 16));
response.append(QString("has_set_vfo=0x%1").arg(1, 0, 16));
response.append(QString("has_get_vfo=0x%1").arg(1, 0, 16));
response.append(QString("has_set_freq=0x%1").arg(1, 0, 16));
response.append(QString("has_get_freq=0x%1").arg(1, 0, 16));
response.append(QString("has_set_conf=0x%1").arg(1, 0, 16));
response.append(QString("has_get_conf=0x%1").arg(1, 0, 16));
response.append(QString("has_power2mW=0x%1").arg(1, 0, 16));
response.append(QString("has_mW2power=0x%1").arg(1, 0, 16));
response.append(QString("timeout=0x%1").arg(1000, 0, 16));
response.append("done");
}
}
else if (command[0] == "f" || command[0] == "get_freq")
@ -592,11 +619,12 @@ void rigCtlClient::socketReadyRead()
if (longReply) {
resp.append("RIT: ");
}
resp.append(QString("%1").arg(0));
resp.append(QString("%1").arg(rigState->getInt32(RITVALUE)));
response.append(resp);
}
}
else if (command[0] == "J" || command[0] == "set_rit")
{
rigState->set(RITVALUE, command[1].toInt(),true);
setCommand = true;
}
else if (command[0] == "y" || command[0] == "get_ant")
@ -1074,12 +1102,11 @@ void rigCtlClient::socketReadyRead()
if (str != "")
sendData(QString("%1%2").arg(str).arg(sep));
}
if (sep != "\n") {
sendData(QString("\n"));
}
sep = " ";
sep = "\n";
num = 0;
}
@ -1100,7 +1127,7 @@ void rigCtlClient::closeSocket()
void rigCtlClient::sendData(QString data)
{
qDebug(logRigCtlD()) << "Sending:" << data;
//qDebug(logRigCtlD()) << "Sending:" << data;
if (socket != Q_NULLPTR && socket->isValid() && socket->isOpen())
{
socket->write(data.toLatin1());
@ -1173,18 +1200,18 @@ QString rigCtlClient::getFilter(unsigned char mode, unsigned char filter) {
QString rigCtlClient::getMode(unsigned char mode, bool datamode) {
QString ret;
if (datamode) {
ret="PKT";
}
switch (mode) {
case 0:
if (datamode) { ret = "PKT"; }
ret.append("LSB");
break;
case 1:
if (datamode) { ret = "PKT"; }
ret.append("USB");
break;
case 2:
if (datamode) { ret = "PKT"; }
ret.append("AM");
break;
case 3:
@ -1194,6 +1221,7 @@ QString rigCtlClient::getMode(unsigned char mode, bool datamode) {
ret.append("RTTY");
break;
case 5:
if (datamode) { ret = "PKT"; }
ret.append("FM");
break;
case 6:
@ -1206,12 +1234,15 @@ QString rigCtlClient::getMode(unsigned char mode, bool datamode) {
ret.append("RTTYR");
break;
case 12:
if (datamode) { ret = "PKT"; }
ret.append("USB");
break;
case 17:
if (datamode) { ret = "PKT"; }
ret.append("LSB");
break;
case 22:
if (datamode) { ret = "PKT"; }
ret.append("FM");
break;
}
@ -1351,7 +1382,7 @@ QString rigCtlClient::generateFreqRange(bandType band)
QString ret = "";
if (lowFreq > 0 && highFreq > 0) {
ret = QString("%1 %2 0x%3 %4 %5 0x%6 0x%7").arg(lowFreq).arg(highFreq).arg(getRadioModes(),0,16).arg(-1).arg(-1).arg(0x16000003,0,16).arg(getAntennas(),0,16);
ret = QString("%1.000000 %2.000000 0x%3 %4 %5 0x%6 0x%7").arg(lowFreq).arg(highFreq).arg(getRadioModes(),0,16).arg(-1).arg(-1).arg(0x16000003,0,16).arg(getAntennas(),0,16);
}
return ret;
}
@ -1376,13 +1407,18 @@ quint64 rigCtlClient::getRadioModes()
QString curMode = mode.name;
if (!strcmp(curMode.toLocal8Bit(), mode_str[i].str))
{
//qDebug(logRigCtlD()) << "Found mode:" << mode.name << mode_str[i].mode;
modes |= mode_str[i].mode;
}
if (rigCaps.hasDataModes) {
curMode = "PKT" + mode.name;
if (!strcmp(curMode.toLocal8Bit(), mode_str[i].str))
{
modes |= mode_str[i].mode;
if (mode.name == "LSB" || mode.name == "USB" || mode.name == "FM" || mode.name == "AM")
{
// qDebug(logRigCtlD()) << "Found data mode:" << mode.name << mode_str[i].mode;
modes |= mode_str[i].mode;
}
}
}
}

Wyświetl plik

@ -402,6 +402,7 @@ private:
rigCapabilities rigCaps;
rigstate* rigState = Q_NULLPTR;
rigCtlD* parent;
bool chkVfoEecuted=false;
QString getMode(unsigned char mode, bool datamode);
unsigned char getMode(QString modeString);
QString getFilter(unsigned char mode, unsigned char filter);

Wyświetl plik

@ -12,11 +12,11 @@
#include "rigidentities.h"
// Meters at the end as they are ALWAYS updated from the rig!
enum stateTypes { NONE, VFOAFREQ, VFOBFREQ, CURRENTVFO, PTT, MODE, FILTER, DUPLEX, DATAMODE, ANTENNA, RXANTENNA, CTCSS, TSQL, DTCS, CSQL,
enum stateTypes { VFOAFREQ, VFOBFREQ, CURRENTVFO, PTT, MODE, FILTER, DUPLEX, DATAMODE, ANTENNA, RXANTENNA, CTCSS, TSQL, DTCS, CSQL,
PREAMP, AGC, ATTENUATOR, MODINPUT, AFGAIN, RFGAIN, SQUELCH, TXPOWER, MICGAIN, COMPLEVEL, MONITORLEVEL, VOXGAIN, ANTIVOXGAIN,
FAGCFUNC, NBFUNC, COMPFUNC, VOXFUNC, TONEFUNC, TSQLFUNC, SBKINFUNC, FBKINFUNC, ANFFUNC, NRFUNC, AIPFUNC, APFFUNC, MONFUNC, MNFUNC,RFFUNC,
AROFUNC, MUTEFUNC, VSCFUNC, REVFUNC, SQLFUNC, ABMFUNC, BCFUNC, MBCFUNC, RITFUNC, AFCFUNC, SATMODEFUNC, SCOPEFUNC,
NBLEVEL, NBDEPTH, NBWIDTH, NRLEVEL, RIGINPUT, POWERONOFF,
NBLEVEL, NBDEPTH, NBWIDTH, NRLEVEL, RIGINPUT, POWERONOFF, RITVALUE,
RESUMEFUNC, TBURSTFUNC, TUNERFUNC, LOCKFUNC, SMETER, POWERMETER, SWRMETER, ALCMETER, COMPMETER, VOLTAGEMETER, CURRENTMETER
};
@ -47,7 +47,7 @@ public:
_mutex.unlock();
}
}
void set(stateTypes s, quint32 x, bool u) {
void set(stateTypes s, qint32 x, bool u) {
if ((quint64)x != map[s]._value) {
_mutex.lock();
map[s]._value = (quint64)x;
@ -110,9 +110,9 @@ public:
}
bool getBool(stateTypes s) { return map[s]._value != 0; }
quint8 getChar(stateTypes s) { return map[s]._value & 0xff; }
quint16 getInt16(stateTypes s) { return map[s]._value != 0xffff; }
quint32 getInt32(stateTypes s) { return map[s]._value != 0xffffffff; }
quint8 getChar(stateTypes s) { return (quint8)map[s]._value; }
quint16 getInt16(stateTypes s) { return (qint16)map[s]._value; }
qint32 getInt32(stateTypes s) { return (qint32)map[s]._value; }
quint64 getInt64(stateTypes s) { return map[s]._value; }
duplexMode getDuplex(stateTypes s) { return(duplexMode)map[s]._value; }
rigInput getInput(stateTypes s) { return(rigInput)map[s]._value; }