Working read/write of Tone, TSQL, and DTCS tones/code. Some code is also

present now to change the mode being used (tone, tsql, DTCS, or some
combo of the two).
merge-requests/2/head
Elliott Liggett 2021-04-04 23:33:56 -07:00
rodzic 8cc78e37bb
commit e7f2d1eba8
5 zmienionych plików z 141 dodań i 26 usunięć

Wyświetl plik

@ -271,7 +271,8 @@ void repeaterSetup::on_rptToneCombo_activated(int index)
{
quint16 tsql=0;
tsql = (quint16)ui->rptToneCombo->itemData(index).toUInt();
emit setTSQL(tsql);
//if(selected mode == TSQL)... send this way... otherwise if just tone, send other way...
emit setTone(tsql);
}
void repeaterSetup::on_rptDTCSCombo_activated(int index)
@ -285,7 +286,7 @@ void repeaterSetup::on_rptDTCSCombo_activated(int index)
void repeaterSetup::on_debugBtn_clicked()
{
emit getTSQL();
//emit getTone();
//emit getDTCS();
//emit getTSQL();
emit getDTCS();
}

Wyświetl plik

@ -652,47 +652,101 @@ void rigCommander::getTransmitFrequency()
void rigCommander::setTone(quint16 tone)
{
freqt f;
f.Hz = tone;
QByteArray fenc = makeFreqPayload(f);
qDebug() << __func__ << "tone encoded: ";
printHex(fenc);
QByteArray fenc = encodeTone(tone);
QByteArray payload;
payload.setRawData("\x1B\x00", 2);
payload.append(fenc);
//prepDataAndSend(payload);
//qDebug() << __func__ << "TONE encoded payload: ";
printHex(payload);
prepDataAndSend(payload);
}
void rigCommander::setTSQL(quint16 tsql)
{
freqt f;
f.Hz = tsql;
QByteArray fenc = makeFreqPayload(f);
qDebug() << __func__ << "tsql encoded: ";
printHex(fenc);
QByteArray fenc = encodeTone(tsql);
QByteArray payload;
payload.setRawData("\x1B\x00", 2);
payload.setRawData("\x1B\x01", 2);
payload.append(fenc);
//prepDataAndSend(payload);
//qDebug() << __func__ << "TSQL encoded payload: ";
printHex(payload);
prepDataAndSend(payload);
}
void rigCommander::setDTCS(quint16 dcscode, bool tinv, bool rinv)
{
freqt f;
f.Hz = dcscode;
QByteArray denc = makeFreqPayload(f);
qDebug() << __func__ << "dtcs encoded: ";
printHex(denc);
(void)tinv;
(void)rinv;
QByteArray denc = encodeTone(dcscode, tinv, rinv);
QByteArray payload;
payload.setRawData("\x1B\x02", 2);
payload.append(denc);
//prepDataAndSend(payload);
//qDebug() << __func__ << "DTCS encoded payload: ";
printHex(payload);
prepDataAndSend(payload);
}
QByteArray rigCommander::encodeTone(quint16 tone)
{
return encodeTone(tone, false, false);
}
QByteArray rigCommander::encodeTone(quint16 tone, bool tinv, bool rinv)
{
// This function is fine to use for DTCS and TONE
QByteArray enct;
unsigned char inv=0;
inv = inv | (unsigned char)rinv;
inv = inv | ((unsigned char)tinv) << 4;
enct.append(inv);
unsigned char hundreds = tone / 1000;
unsigned char tens = (tone-(hundreds*1000)) / 100;
unsigned char ones = (tone -(hundreds*1000)-(tens*100)) / 10;
unsigned char dec = (tone -(hundreds*1000)-(tens*100)-(ones*10));
enct.append(tens | (hundreds<<4));
enct.append(dec | (ones <<4));
return enct;
}
quint16 rigCommander::decodeTone(QByteArray eTone)
{
bool t;
bool r;
return decodeTone(eTone, t, r);
}
quint16 rigCommander::decodeTone(QByteArray eTone, bool &tinv, bool &rinv)
{
// index: 00 01 02 03 04
// CTCSS: 1B 01 00 12 73 = PL 127.3, decode as 1273
// D(T)CS: 1B 01 TR 01 23 = T/R Invert bits + DCS code 123
tinv = false; rinv = false;
quint16 result = 0;
if((eTone.at(2) & 0x01) == 0x01)
tinv = true;
if((eTone.at(2) & 0x10) == 0x10)
rinv = true;
result += (eTone.at(4) & 0x0f);
result += ((eTone.at(4) & 0xf0) >> 4) * 10;
result += (eTone.at(3) & 0x0f) * 100;
result += ((eTone.at(3) & 0xf0) >> 4) * 1000;
return result;
}
void rigCommander::getTone()
@ -1044,6 +1098,9 @@ void rigCommander::parseCommand()
parseRegisters1A();
}
break;
case '\x1B':
parseRegister1B();
break;
case '\x1C':
parseRegisters1C();
break;
@ -1867,6 +1924,37 @@ void rigCommander::parseRegisters1A()
}
}
void rigCommander::parseRegister1B()
{
quint16 tone=0;
bool tinv = false;
bool rinv = false;
switch(payloadIn[01])
{
case '\x00':
// "Repeater tone"
tone = decodeTone(payloadIn);
emit haveTone(tone);
break;
case '\x01':
// "TSQL tone"
tone = decodeTone(payloadIn);
emit haveTSQL(tone);
break;
case '\x02':
// DTCS (DCS)
tone = decodeTone(payloadIn, tinv, rinv);
emit haveDTCS(tone, tinv, rinv);
break;
case '\x07':
// "CSQL code (DV mode)"
break;
default:
break;
}
}
void rigCommander::parseBandStackReg()
{
// qDebug(logRig()) << "Band stacking register response received: ";
@ -2215,6 +2303,9 @@ void rigCommander::determineRigCaps()
rigCaps.hasDV = false;
rigCaps.hasATU = false;
rigCaps.hasCTCSS = false;
rigCaps.hasDTCS = false;
rigCaps.spectSeqMax = 0;
rigCaps.spectAmpMax = 0;
rigCaps.spectLenMax = 0;
@ -2239,6 +2330,7 @@ void rigCommander::determineRigCaps()
rigCaps.hasEthernet = false;
rigCaps.hasWiFi = false;
rigCaps.hasATU = true;
rigCaps.hasCTCSS = true;
break;
case modelR8600:
rigCaps.modelName = QString("IC-R8600");
@ -2251,6 +2343,8 @@ void rigCommander::determineRigCaps()
rigCaps.hasEthernet = true;
rigCaps.hasWiFi = false;
rigCaps.hasTransmit = false;
rigCaps.hasCTCSS = true;
rigCaps.hasDTCS = true;
break;
case model9700:
rigCaps.modelName = QString("IC-9700");
@ -2266,6 +2360,8 @@ void rigCommander::determineRigCaps()
rigCaps.hasWiFi = false;
rigCaps.hasDD = true;
rigCaps.hasDV = true;
rigCaps.hasCTCSS = true;
rigCaps.hasDTCS = true;
break;
case model7610:
rigCaps.modelName = QString("IC-7610");
@ -2279,6 +2375,7 @@ void rigCommander::determineRigCaps()
rigCaps.hasLan = true;
rigCaps.hasEthernet = true;
rigCaps.hasWiFi = false;
rigCaps.hasCTCSS = true;
break;
case model7850:
rigCaps.modelName = QString("IC-785x");
@ -2294,6 +2391,7 @@ void rigCommander::determineRigCaps()
rigCaps.hasEthernet = true;
rigCaps.hasWiFi = false;
rigCaps.hasATU = true;
rigCaps.hasCTCSS = true;
break;
case model705:
rigCaps.modelName = QString("IC-705");
@ -2309,6 +2407,8 @@ void rigCommander::determineRigCaps()
rigCaps.hasDD = true;
rigCaps.hasDV = true;
rigCaps.hasATU = true;
rigCaps.hasCTCSS = true;
rigCaps.hasDTCS = true;
break;
case model7100:
rigCaps.modelName = QString("IC-7100");
@ -2319,6 +2419,8 @@ void rigCommander::determineRigCaps()
rigCaps.hasEthernet = false;
rigCaps.hasWiFi = false;
rigCaps.hasATU = true;
rigCaps.hasCTCSS = true;
rigCaps.hasDTCS = true;
break;
case model706:
rigCaps.modelName = QString("IC-706");

Wyświetl plik

@ -229,7 +229,7 @@ signals:
void haveRptAccessMode(rptAccessTxRx ratr);
void haveTone(quint16 tone);
void haveTSQL(quint16 tsql);
void haveDTCS(quint16 dcscode);
void haveDTCS(quint16 dcscode, bool tinv, bool rinv);
// Levels:
void haveRfGain(unsigned char level);
@ -284,14 +284,20 @@ private:
freqt parseFrequency(QByteArray data, unsigned char lastPosition); // supply index where Mhz is found
QByteArray makeFreqPayload(double frequency);
QByteArray makeFreqPayload(freqt freq);
QByteArray encodeTone(quint16 tone, bool tinv, bool rinv);
QByteArray encodeTone(quint16 tone);
quint16 decodeTone(QByteArray eTone);
quint16 decodeTone(QByteArray eTone, bool &tinv, bool &rinv);
void parseMode();
void parseSpectrum();
void parseWFData();
void parseSpectrumRefLevel();
void parseDetailedRegisters1A05();
void parseRegisters1A();
void parseBandStackReg();
void parseRegister1B();
void parseRegisters1C();
void parseBandStackReg();
void parsePTT();
void parseATU();
void parseLevels(); // register 0x14

Wyświetl plik

@ -61,6 +61,9 @@ struct rigCapabilities {
bool hasDV;
bool hasATU;
bool hasCTCSS;
bool hasDTCS;
bool hasTransmit;
};

Wyświetl plik

@ -399,6 +399,9 @@ wfmain::wfmain(const QString serialPortCL, const QString hostCL, QWidget *parent
connect(rpt, SIGNAL(getTone()), rig, SLOT(getTone()));
connect(rpt, SIGNAL(getTSQL()), rig, SLOT(getTSQL()));
connect(rpt, SIGNAL(getDTCS()), rig, SLOT(getDTCS()));
connect(rpt, SIGNAL(setTone(quint16)), rig, SLOT(setTone(quint16)));
connect(rpt, SIGNAL(setTSQL(quint16)), rig, SLOT(setTSQL(quint16)));
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(rig, SIGNAL(haveTone(quint16)), rpt, SLOT(handleTone(quint16)));