Correctly handle filter width (remove PBT for now)

half-duplex
Phil Taylor 2023-01-18 18:52:05 +00:00
rodzic a0f7d5d86f
commit e94c3e53c5
4 zmienionych plików z 181 dodań i 105 usunięć

Wyświetl plik

@ -877,26 +877,39 @@ void rigCommander::setPassband(quint16 pass)
QByteArray payload;
payload.setRawData("\x1A\x03", 2);
unsigned char calc;
/*
Mode Data Steps
SSB/CW/RTTY/PSK 0 to 9 50 ~ 500 Hz (50 Hz)
SSB/CW/PSK 10 to 40 600 Hz ~ 3.6 kHz (100 Hz)
RTTY 10 to 31 600 ~ 2.7 kHz (100 Hz)
AM 0 to 49 200 Hz ~ 10.0 kHz (200 Hz)
* Passband is calculated as follows, if a higher than legal value is provided,
* It will set passband to the maximum allowed for the particular mode.
*
* Mode Data Steps
* SSB/CW/RTTY/PSK 0 to 9 50 ~ 500 Hz (50 Hz)
* SSB/CW/PSK 10 to 40 600 Hz ~ 3.6 kHz (100 Hz)
* RTTY 10 to 31 600 ~ 2.7 kHz (100 Hz)
* AM 0 to 49 200 Hz ~ 10.0 kHz (200 Hz)
*/
unsigned char calc;
if (state.getChar(MODE) == modeAM) { // AM 0-49
calc = quint16((pass / 200) - 1);
if (calc > 49)
calc = 49;
}
else if (pass >= 600 && pass <= 3600) // SSB/CW/PSK 10-40 (10-31 for RTTY)
else if (pass >= 600) // SSB/CW/PSK 10-40 (10-31 for RTTY)
{
calc = quint16((pass / 100) + 4);
if (((calc > 31) && (state.getChar(MODE) == modeRTTY || state.getChar(MODE) == modeRTTY_R)))
{
calc = 31;
}
else if (calc > 40) {
calc = 40;
}
}
else { // SSB etc 0-9
calc = quint16((pass / 50) - 1);
}
char tens = (calc / 10);
char units = (calc - (10 * tens));
@ -913,6 +926,27 @@ void rigCommander::getPassband()
prepDataAndSend(payload);
}
void rigCommander::getCwPitch()
{
QByteArray payload;
payload.setRawData("\x14\x09", 2);
prepDataAndSend(payload);
}
void rigCommander::getPskTone()
{
QByteArray payload;
payload.setRawData("\x1a\x05\x00\x44", 4);
prepDataAndSend(payload);
}
void rigCommander::getRttyMark()
{
QByteArray payload;
payload.setRawData("\x1a\x05\x00\x41", 4);
prepDataAndSend(payload);
}
void rigCommander::getTransmitFrequency()
{
QByteArray payload;
@ -1490,7 +1524,8 @@ void rigCommander::parseLevels()
state.set(PBTOUT, level, false);
break;
case '\x09':
// CW Pitch - ignore for now
// CW Pitch
emit haveCwPitch(level);
state.set(CWPITCH, level, false);
break;
case '\x0A':

Wyświetl plik

@ -117,6 +117,9 @@ public slots:
void getManualNotch();
void getPassband();
void getCwPitch();
void getPskTone();
void getRttyMark();
// Repeater:
void setDuplexMode(duplexMode dm);
@ -283,6 +286,9 @@ signals:
void haveRitEnabled(bool ritEnabled);
void haveRitFrequency(int ritHz);
void havePassband(quint16 pass);
void haveCwPitch(unsigned char pitch);
void havePskTone(unsigned char tone);
void haveRttyMark(unsigned char mark);
// Repeater:
void haveDuplexMode(duplexMode);

Wyświetl plik

@ -358,6 +358,7 @@ void wfmain::rigConnections()
connect(rig, SIGNAL(haveMode(unsigned char, unsigned char)), this, SLOT(receiveMode(unsigned char, unsigned char)));
connect(rig, SIGNAL(haveDataMode(bool)), this, SLOT(receiveDataModeStatus(bool)));
connect(rig, SIGNAL(havePassband(quint16)), this, SLOT(receivePassband(quint16)));
connect(rig, SIGNAL(haveCwPitch(unsigned char)), this, SLOT(receiveCwPitch(unsigned char)));
connect(rpt, SIGNAL(getDuplexMode()), rig, SLOT(getDuplexMode()));
connect(rpt, SIGNAL(setDuplexMode(duplexMode)), rig, SLOT(setDuplexMode(duplexMode)));
@ -378,6 +379,9 @@ void wfmain::rigConnections()
connect(this, SIGNAL(getDuplexMode()), rig, SLOT(getDuplexMode()));
connect(this, SIGNAL(getPassband()), rig, SLOT(getPassband()));
connect(this, SIGNAL(setPassband(quint16)), rig, SLOT(setPassband(quint16)));
connect(this, SIGNAL(getCwPitch()), rig, SLOT(getCwPitch()));
connect(this, SIGNAL(getPskTone()), rig, SLOT(getPskTone()));
connect(this, SIGNAL(getRttyMark()), rig, SLOT(getRttyMark()));
connect(this, SIGNAL(getTone()), rig, SLOT(getTone()));
connect(this, SIGNAL(getTSQL()), rig, SLOT(getTSQL()));
connect(this, SIGNAL(getRptAccessMode()), rig, SLOT(getRptAccessMode()));
@ -3593,6 +3597,15 @@ void wfmain::doCmd(cmds cmd)
case cmdGetPassband:
emit getPassband();
break;
case cmdGetCwPitch:
emit getCwPitch();
break;
case cmdGetPskTone:
emit getPskTone();
break;
case cmdGetRttyMark:
emit getRttyMark();
break;
case cmdGetTone:
emit getTone();
break;
@ -4399,74 +4412,75 @@ void wfmain::receiveSpectrumData(QByteArray spectrum, double startFreq, double e
plasmaMutex.unlock();
if(!spectrumDrawLock)
if (!spectrumDrawLock)
{
if((plotFloor != oldPlotFloor) || (plotCeiling != oldPlotCeiling))
if ((plotFloor != oldPlotFloor) || (plotCeiling != oldPlotCeiling)){
updateRange = true;
}
plot->graph(0)->setData(x, y, true);
#if QCUSTOMPLOT_VERSION >= 0x020000
plot->graph(0)->setData(x,y, true);
if((freq.MHzDouble < endFreq) && (freq.MHzDouble > startFreq))
{
freqIndicatorLine->start->setCoords(freq.MHzDouble, 0);
freqIndicatorLine->end->setCoords(freq.MHzDouble, rigCaps.spectAmpMax);
double tpbfDiff = qMax(TPBFInner, TPBFOuter);
double pbStart = 0.0;
double pbEnd = 0.0;
if (TPBFOuter < TPBFInner) {
tpbfDiff = qMin(TPBFInner, TPBFOuter);
}
if (currentModeInfo.mk == modeLSB || currentModeInfo.mk == modePSK_R) {
passbandIndicator->topLeft->setCoords(freq.MHzDouble - passBand - 0.0001 - tpbfDiff, 0);
passbandIndicator->bottomRight->setCoords(freq.MHzDouble - 0.0001 - tpbfDiff, rigCaps.spectAmpMax);
}
else if (currentModeInfo.mk == modeUSB || currentModeInfo.mk == modePSK) {
passbandIndicator->topLeft->setCoords(freq.MHzDouble + 0.0001 + tpbfDiff, 0);
passbandIndicator->bottomRight->setCoords(freq.MHzDouble + 0.0001 + passBand + tpbfDiff, rigCaps.spectAmpMax);
}
else
switch (currentModeInfo.mk)
{
if (currentModeInfo.mk == modeFM) {
if (currentModeInfo.filter == 1)
passBand = 0.015;
else if (currentModeInfo.filter == 2)
passBand = 0.010;
else
passBand = 0.007;
case modeLSB:
case modeRTTY:
case modePSK_R:
pbStart = freq.MHzDouble - passbandCenterFrequency - (passbandWidth / 2);
pbEnd = freq.MHzDouble - passbandCenterFrequency + (passbandWidth / 2);
break;
case modeCW:
if (passbandWidth < 0.0006) {
pbStart = freq.MHzDouble - (passbandWidth / 2);
pbEnd = freq.MHzDouble + (passbandWidth / 2);
}
passbandIndicator->topLeft->setCoords(freq.MHzDouble - (passBand / 2) + tpbfDiff, 0);
passbandIndicator->bottomRight->setCoords(freq.MHzDouble + (passBand / 2) + tpbfDiff, rigCaps.spectAmpMax);
else {
pbStart = freq.MHzDouble + passbandCenterFrequency - passbandWidth;
pbEnd = freq.MHzDouble + passbandCenterFrequency;
}
break;
case modeCW_R:
if (passbandWidth < 0.0006) {
pbStart = freq.MHzDouble - (passbandWidth / 2);
pbEnd = freq.MHzDouble + (passbandWidth / 2);
}
else {
pbStart = freq.MHzDouble - passbandCenterFrequency;
pbEnd = freq.MHzDouble + passbandWidth - passbandCenterFrequency;
}
break;
default:
pbStart = freq.MHzDouble + passbandCenterFrequency - (passbandWidth / 2);
pbEnd = freq.MHzDouble + passbandCenterFrequency + (passbandWidth / 2);
break;
}
passbandIndicator->topLeft->setCoords(pbStart, 0);
passbandIndicator->bottomRight->setCoords(pbEnd, rigCaps.spectAmpMax);
}
if(underlayMode == underlayPeakHold)
if (underlayMode == underlayPeakHold)
{
plot->graph(1)->setData(x,y2, true); // peaks
} else if (underlayMode != underlayNone) {
plot->graph(1)->setData(x, y2, true); // peaks
}
else if (underlayMode != underlayNone) {
computePlasma();
plot->graph(1)->setData(x,spectrumPlasmaLine, true);
} else {
plot->graph(1)->setData(x,y2, true); // peaks, but probably cleared out
plot->graph(1)->setData(x, spectrumPlasmaLine, true);
}
#else
plot->graph(0)->setData(x,y);
if((freq.MHzDouble < endFreq) && (freq.MHzDouble > startFreq))
{
freqIndicatorLine->start->setCoords(freq.MHzDouble,0);
freqIndicatorLine->end->setCoords(freq.MHzDouble,rigCaps.spectAmpMax);
else {
plot->graph(1)->setData(x, y2, true); // peaks, but probably cleared out
}
if(underlayMode == underlayPeakHold)
{
plot->graph(1)->setData(x,y2); // peaks
} else if (underlayMode != underlayNone) {
computePlasma();
plot->graph(1)->setData(x,spectrumPlasmaLine);
} else {
plot->graph(1)->setData(x,y2); // peaks, but probably cleared out
}
#endif
if(updateRange)
plot->yAxis->setRange(prefs.plotFloor, prefs.plotCeiling);
@ -4726,7 +4740,13 @@ void wfmain::handlePlotMouseMove(QMouseEvent *me)
else if (passbandAction == passbandResizing) {
// We are currently resizing the passband.
double pb = 0.0;
if (currentModeInfo.mk == modeUSB || currentModeInfo.mk == modePSK || plot->xAxis->pixelToCoord(me->pos().x()) >= freq.MHzDouble) {
double origin = passbandCenterFrequency;
if (currentModeInfo.mk == modeCW || currentModeInfo.mk == modeCW_R)
{
origin = 0.0;
}
if (plot->xAxis->pixelToCoord(me->pos().x()) >= freq.MHzDouble + origin) {
pb = plot->xAxis->pixelToCoord(me->pos().x()) - passbandIndicator->topLeft->coords().x();
}
else {
@ -4734,18 +4754,16 @@ void wfmain::handlePlotMouseMove(QMouseEvent *me)
}
issueCmdUniquePriority(cmdSetPassband, (quint16)(pb * 1000000));
issueCmdUniquePriority(cmdSetPassband, (quint16)(pb * 1000000));
}
else if (passbandAction == passbandMoving) {
double movedFrequency = plot->xAxis->pixelToCoord(me->pos().x()) - clickedFrequency;
double pbFreq = 0.0;
if (currentModeInfo.mk == modeLSB || currentModeInfo.mk == modePSK_R) {
pbFreq = ((TPBFInner - movedFrequency) / passBand) * 127;
pbFreq = ((TPBFInner - movedFrequency) / passbandWidth) * 127;
}
else {
pbFreq = ((movedFrequency + TPBFInner) / passBand) * 127;
pbFreq = ((movedFrequency + TPBFInner) / passbandWidth) * 127;
}
qint16 newFreq = pbFreq + 128;
@ -4859,6 +4877,35 @@ void wfmain::receiveMode(unsigned char mode, unsigned char filter)
currentModeIndex = mode;
currentModeInfo.mk = (mode_kind)mode;
currentModeInfo.filter = filter;
switch (currentModeInfo.mk) {
case modeFM:
if (currentModeInfo.filter == 1)
passbandWidth = 0.015;
else if (currentModeInfo.filter == 2)
passbandWidth = 0.010;
else
passbandWidth = 0.007;
passbandCenterFrequency = 0.0;
break;
case modeLSB:
case modeUSB:
removePeriodicCommand(cmdGetCwPitch);
removePeriodicCommand(cmdGetPskTone);
removePeriodicCommand(cmdGetRttyMark);
passbandCenterFrequency = 0.0015;
break;
case modeCW:
case modeCW_R:
insertPeriodicCommandUnique(cmdGetCwPitch);
removePeriodicCommand(cmdGetPskTone);
removePeriodicCommand(cmdGetRttyMark);
break;
default:
passbandCenterFrequency = 0.0;
break;
}
} else {
qInfo(logSystem()) << __func__ << "Invalid mode " << mode << " received. ";
}
@ -6093,47 +6140,28 @@ void wfmain::receiveLANGain(unsigned char level)
void wfmain::receivePassband(quint16 pass)
{
if (passBand != (double)(pass / 1000000.0)) {
passBand = (double)(pass / 1000000.0);
if (passbandWidth != (double)(pass / 1000000.0)) {
passbandWidth = (double)(pass / 1000000.0);
showStatusBarText(QString("IF filter width %1 Hz").arg(pass));
}
}
void wfmain::receiveCwPitch(unsigned char pitch) {
if (currentModeInfo.mk == modeCW || currentModeInfo.mk == modeCW_R) {
passbandCenterFrequency = (double)((((600 / 256) * pitch) + 300) / 1000000.0)/2.0;
}
}
void wfmain::receiveTPBFInner(unsigned char level) {
qint16 shift = (qint16)(level - 128);
if (passbandAction != passbandResizing) {
TPBFInner = (double)(shift / 127.0) * (passBand);
}
else {
double pbFreq = 0.0;
pbFreq = (TPBFInner / passBand) * 127;
qint16 newFreq = pbFreq + 128;
if (newFreq < 0)
newFreq = 0;
if (newFreq > 255)
newFreq = 255;
issueCmd(cmdSetTPBFInner, (unsigned char)newFreq);
}
TPBFInner = (double)(shift / 127.0) * (passbandWidth);
}
void wfmain::receiveTPBFOuter(unsigned char level) {
qint16 shift = (qint16)(level - 128);
if (passbandAction != passbandResizing) {
TPBFOuter = (double)(shift / 127.0) * (passBand);
}
else {
double pbFreq = 0.0;
pbFreq = (TPBFOuter / passBand) * 127;
qint16 newFreq = pbFreq + 128;
if (newFreq < 0)
newFreq = 0;
if (newFreq > 255)
newFreq = 255;
issueCmd(cmdSetTPBFOuter, (unsigned char)newFreq);
}
TPBFOuter = (double)(shift / 127.0) * (passbandWidth);
}

Wyświetl plik

@ -124,6 +124,9 @@ signals:
void getModInputLevel(rigInput input);
void getMeters(meterKind meter);
void getPassband();
void getCwPitch();
void getPskTone();
void getRttyMark();
// Level set:
void setRfGain(unsigned char level);
@ -266,6 +269,7 @@ private slots:
void receiveModInput(rigInput input, bool dataOn);
//void receiveDuplexMode(duplexMode dm);
void receivePassband(quint16 pass);
void receiveCwPitch(unsigned char pitch);
void receiveTPBFInner(unsigned char level);
void receiveTPBFOuter(unsigned char level);
@ -845,7 +849,7 @@ private:
double wfCeiling = 160;
double oldPlotFloor = -1;
double oldPlotCeiling = 999;
double passBand = 0.0;
double passbandWidth = 0.0;
double mousePressFreq = 0.0;
double mouseReleaseFreq = 0.0;
@ -866,21 +870,23 @@ private:
unsigned char setModeVal=0;
unsigned char setFilterVal=0;
enum cmds {cmdNone, cmdGetRigID, cmdGetRigCIV, cmdGetFreq, cmdSetFreq, cmdGetMode, cmdSetMode,
cmdGetDataMode, cmdSetModeFilter, cmdSetDataModeOn, cmdSetDataModeOff, cmdGetRitEnabled, cmdGetRitValue,
cmdSpecOn, cmdSpecOff, cmdDispEnable, cmdDispDisable, cmdGetRxGain, cmdSetRxRfGain, cmdGetAfGain, cmdSetAfGain,
cmdGetSql, cmdSetSql, cmdGetIFShift, cmdSetIFShift, cmdGetTPBFInner, cmdSetTPBFInner,
cmdGetTPBFOuter, cmdSetTPBFOuter, cmdGetATUStatus, cmdGetPassband, cmdSetPassband,
cmdSetATU, cmdStartATU, cmdGetSpectrumMode,
cmdGetSpectrumSpan, cmdScopeCenterMode, cmdScopeFixedMode, cmdGetPTT, cmdSetPTT,cmdPTTToggle,
cmdGetTxPower, cmdSetTxPower, cmdGetMicGain, cmdSetMicGain, cmdSetModLevel,
cmdGetSpectrumRefLevel, cmdGetDuplexMode, cmdGetModInput, cmdGetModDataInput,
cmdGetCurrentModLevel, cmdStartRegularPolling, cmdStopRegularPolling, cmdQueNormalSpeed,
cmdGetVdMeter, cmdGetIdMeter, cmdGetSMeter, cmdGetCenterMeter, cmdGetPowerMeter,
cmdGetSWRMeter, cmdGetALCMeter, cmdGetCompMeter, cmdGetTxRxMeter,
cmdGetTone, cmdGetTSQL, cmdGetDTCS, cmdGetRptAccessMode, cmdGetPreamp, cmdGetAttenuator, cmdGetAntenna,
cmdGetBandStackReg,
cmdSetTime, cmdSetDate, cmdSetUTCOffset};
enum cmds {
cmdNone, cmdGetRigID, cmdGetRigCIV, cmdGetFreq, cmdSetFreq, cmdGetMode, cmdSetMode,
cmdGetDataMode, cmdSetModeFilter, cmdSetDataModeOn, cmdSetDataModeOff, cmdGetRitEnabled, cmdGetRitValue,
cmdSpecOn, cmdSpecOff, cmdDispEnable, cmdDispDisable, cmdGetRxGain, cmdSetRxRfGain, cmdGetAfGain, cmdSetAfGain,
cmdGetSql, cmdSetSql, cmdGetIFShift, cmdSetIFShift, cmdGetTPBFInner, cmdSetTPBFInner,
cmdGetTPBFOuter, cmdSetTPBFOuter, cmdGetATUStatus, cmdGetPassband, cmdSetPassband,
cmdGetCwPitch, cmdGetPskTone, cmdGetRttyMark, cmdSetCwPitch, cmdSetPskTone, cmdSetRttyMark,
cmdSetATU, cmdStartATU, cmdGetSpectrumMode,
cmdGetSpectrumSpan, cmdScopeCenterMode, cmdScopeFixedMode, cmdGetPTT, cmdSetPTT,cmdPTTToggle,
cmdGetTxPower, cmdSetTxPower, cmdGetMicGain, cmdSetMicGain, cmdSetModLevel,
cmdGetSpectrumRefLevel, cmdGetDuplexMode, cmdGetModInput, cmdGetModDataInput,
cmdGetCurrentModLevel, cmdStartRegularPolling, cmdStopRegularPolling, cmdQueNormalSpeed,
cmdGetVdMeter, cmdGetIdMeter, cmdGetSMeter, cmdGetCenterMeter, cmdGetPowerMeter,
cmdGetSWRMeter, cmdGetALCMeter, cmdGetCompMeter, cmdGetTxRxMeter,
cmdGetTone, cmdGetTSQL, cmdGetDTCS, cmdGetRptAccessMode, cmdGetPreamp, cmdGetAttenuator, cmdGetAntenna,
cmdGetBandStackReg,
cmdSetTime, cmdSetDate, cmdSetUTCOffset};
struct commandtype {
cmds cmd;
@ -1076,6 +1082,7 @@ private:
double clickedFrequency = 0.0;
double TPBFInner = 0.0;
double TPBFOuter = 0.0;
double passbandCenterFrequency = 0.0;
SERVERCONFIG serverConfig;
void serverAddUserLine(const QString& user, const QString& pass, const int& type);