Move rigCaps to a single pointer across whole app.

translations
Phil Taylor 2024-03-25 12:42:08 +00:00
rodzic ffeec4925a
commit 235869a501
15 zmienionych plików z 516 dodań i 538 usunięć

Wyświetl plik

@ -13,6 +13,7 @@ bandbuttons::bandbuttons(QWidget *parent) :
this->setWindowTitle("Band Switcher"); this->setWindowTitle("Band Switcher");
this->setObjectName("bandButtons"); this->setObjectName("bandButtons");
queue = cachingQueue::getInstance(this); queue = cachingQueue::getInstance(this);
connect(queue, SIGNAL(rigCapsUpdated(rigCapabilities*)), this, SLOT(receiveRigCaps(rigCapabilities*)));
} }
bandbuttons::~bandbuttons() bandbuttons::~bandbuttons()
@ -25,26 +26,24 @@ int bandbuttons::getBSRNumber()
return ui->bandStkPopdown->currentIndex()+1; return ui->bandStkPopdown->currentIndex()+1;
} }
void bandbuttons::acceptRigCaps(rigCapabilities rc) void bandbuttons::receiveRigCaps(rigCapabilities* rc)
{ {
this->rigCaps = rc; this->rigCaps = rc;
qDebug(logGui()) << "Accepting new rigcaps into band buttons."; qDebug(logGui()) << "Accepting new rigcaps into band buttons.";
if(haveRigCaps)
qDebug(logGui()) << "Accepting additional rigcaps into band buttons.";
qDebug(logGui()) << "Bands in this rigcaps: "; if (rigCaps != Q_NULLPTR) {
for(size_t i=0; i < rigCaps.bands.size(); i++) qDebug(logGui()) << "Bands in this rigcaps: ";
{ for(size_t i=0; i < rigCaps->bands.size(); i++)
qDebug(logGui()) << "band[" << i << "]: " << (unsigned char)rigCaps.bands.at(i).band; {
qDebug(logGui()) << "band[" << i << "]: " << (unsigned char)rigCaps->bands.at(i).band;
}
for(size_t i=0; i < 20; i++)
{
qDebug(logGui()) << "bsr[" << i << "]: " << (unsigned char)rigCaps->bsr[i];
}
} }
for(size_t i=0; i < 20; i++)
{
qDebug(logGui()) << "bsr[" << i << "]: " << (unsigned char)rigCaps.bsr[i];
}
setUIToRig(); setUIToRig();
haveRigCaps = true;
} }
void bandbuttons::setUIToRig() void bandbuttons::setUIToRig()
@ -76,82 +75,84 @@ void bandbuttons::setUIToRig()
hideButton(ui->band2200mbtn); hideButton(ui->band2200mbtn);
hideButton(ui->bandGenbtn); hideButton(ui->bandGenbtn);
for (auto &band: rigCaps.bands) if (rigCaps != Q_NULLPTR) {
{ for (auto &band: rigCaps->bands)
switch(band.band)
{ {
case(band3cm): switch(band.band)
showButton(ui->band3cmbtn); {
break; case(band3cm):
case(band6cm): showButton(ui->band3cmbtn);
showButton(ui->band6cmbtn); break;
break; case(band6cm):
case(band13cm): showButton(ui->band6cmbtn);
showButton(ui->band13cmbtn); break;
break; case(band13cm):
case(band23cm): showButton(ui->band13cmbtn);
showButton(ui->band23cmbtn); break;
break; case(band23cm):
case(band70cm): showButton(ui->band23cmbtn);
showButton(ui->band70cmbtn); break;
break; case(band70cm):
case(band2m): showButton(ui->band70cmbtn);
showButton(ui->band2mbtn); break;
break; case(band2m):
case(bandAir): showButton(ui->band2mbtn);
showButton(ui->bandAirbtn); break;
break; case(bandAir):
case(bandWFM): showButton(ui->bandAirbtn);
showButton(ui->bandWFMbtn); break;
break; case(bandWFM):
case(band4m): showButton(ui->bandWFMbtn);
showButton(ui->band4mbtn); break;
break; case(band4m):
case(band6m): showButton(ui->band4mbtn);
showButton(ui->band6mbtn); break;
break; case(band6m):
case(band10m): showButton(ui->band6mbtn);
showButton(ui->band10mbtn); break;
break; case(band10m):
case(band12m): showButton(ui->band10mbtn);
showButton(ui->band12mbtn); break;
break; case(band12m):
case(band15m): showButton(ui->band12mbtn);
showButton(ui->band15mbtn); break;
break; case(band15m):
case(band17m): showButton(ui->band15mbtn);
showButton(ui->band17mbtn); break;
break; case(band17m):
case(band20m): showButton(ui->band17mbtn);
showButton(ui->band20mbtn); break;
break; case(band20m):
case(band30m): showButton(ui->band20mbtn);
showButton(ui->band30mbtn); break;
break; case(band30m):
case(band40m): showButton(ui->band30mbtn);
showButton(ui->band40mbtn); break;
break; case(band40m):
case(band60m): showButton(ui->band40mbtn);
showButton(ui->band60mbtn); break;
break; case(band60m):
case(band80m): showButton(ui->band60mbtn);
showButton(ui->band80mbtn); break;
break; case(band80m):
case(band160m): showButton(ui->band80mbtn);
showButton(ui->band160mbtn); break;
break; case(band160m):
case(band630m): showButton(ui->band160mbtn);
showButton(ui->band630mbtn); break;
break; case(band630m):
case(band2200m): showButton(ui->band630mbtn);
showButton(ui->band2200mbtn); break;
break; case(band2200m):
case(bandGen): showButton(ui->band2200mbtn);
showButton(ui->bandGenbtn); break;
break; case(bandGen):
showButton(ui->bandGenbtn);
break;
default: default:
break; break;
}
} }
} }
} }
@ -166,33 +167,11 @@ void bandbuttons::hideButton(QPushButton *b)
b->setHidden(true); b->setHidden(true);
} }
void bandbuttons::receiveBandStackReg(freqt freqGo, char mode, char filter, bool dataOn)
{
// This function is not currently used, but perhaps it should be?
// Issue: wfmain is also waiting for a BSR and acts upon it.
if(waitingForBSR)
{
qDebug(logGui()) << "Received band stack register and was waiting for one.";
emit issueCmdF(cmdSetFreq, freqGo);
emit issueCmd(cmdSetMode, mode);
//emit issueCmd(cmdSetFilter, filter); // TODO
if(dataOn)
emit issueDelayedCommand(cmdSetDataModeOn);
else
emit issueDelayedCommand(cmdSetDataModeOff);
waitingForBSR = false;
} else {
qWarning(logGui()) << "Received a BSR but did not expect one.";
}
(void)filter;
}
void bandbuttons::bandStackBtnClick(availableBands band) void bandbuttons::bandStackBtnClick(availableBands band)
{ {
if(haveRigCaps) if(rigCaps != Q_NULLPTR)
{ {
for (auto &b: rigCaps.bands) for (auto &b: rigCaps->bands)
{ {
if (b.band == band) if (b.band == band)
{ {
@ -215,16 +194,19 @@ void bandbuttons::bandStackBtnClick(availableBands band)
void bandbuttons::jumpToBandWithoutBSR(availableBands band) void bandbuttons::jumpToBandWithoutBSR(availableBands band)
{ {
// Sometimes we do not have a BSR for these bands: // Sometimes we do not have a BSR for these bands:
for (auto &b: rigCaps.bands) if (rigCaps != Q_NULLPTR)
{ {
if (b.band == band) for (auto &b: rigCaps->bands)
{ {
freqt f; if (b.band == band)
f.Hz = (b.lowFreq+b.highFreq)/2.0; {
f.MHzDouble = f.Hz/1000000.0; freqt f;
f.VFO = activeVFO; f.Hz = (b.lowFreq+b.highFreq)/2.0;
queue->add(priorityImmediate,queueItem(funcSelectedFreq,QVariant::fromValue<freqt>(f),false,false)); f.MHzDouble = f.Hz/1000000.0;
break; f.VFO = activeVFO;
queue->add(priorityImmediate,queueItem(funcSelectedFreq,QVariant::fromValue<freqt>(f),false,false));
break;
}
} }
} }
} }

Wyświetl plik

@ -51,9 +51,7 @@ signals:
public slots: public slots:
// These should come from connections to rigCommander: void receiveRigCaps(rigCapabilities* rc);
void acceptRigCaps(rigCapabilities rc);
void receiveBandStackReg(freqt freqGo, char mode, char filter, bool dataOn);
private slots: private slots:
void on_band2200mbtn_clicked(); void on_band2200mbtn_clicked();
@ -90,7 +88,7 @@ private:
char bandStkRegCode; char bandStkRegCode;
bool waitingForBSR = false; bool waitingForBSR = false;
rigCapabilities rigCaps; rigCapabilities* rigCaps=Q_NULLPTR;
bool haveRigCaps = false; bool haveRigCaps = false;
cachingQueue* queue; cachingQueue* queue;
}; };

Wyświetl plik

@ -118,7 +118,7 @@ public:
QMultiMap <queuePriority,queueItem> getQueueItems(); QMultiMap <queuePriority,queueItem> getQueueItems();
void lockMutex() {mutex.lock();} void lockMutex() {mutex.lock();}
void unlockMutex() {mutex.unlock();} void unlockMutex() {mutex.unlock();}
void setRigCaps(rigCapabilities* caps) { rigCaps = caps; emit rigCapsUpdated(rigCaps);} void setRigCaps(rigCapabilities* caps) { if (rigCaps != caps) { rigCaps = caps; emit rigCapsUpdated(rigCaps);} }
rigCapabilities* getRigCaps() { return rigCaps; } rigCapabilities* getRigCaps() { return rigCaps; }
}; };

Wyświetl plik

@ -4,16 +4,19 @@
#include "memories.h" #include "memories.h"
#include "ui_memories.h" #include "ui_memories.h"
memories::memories(rigCapabilities rigCaps, bool slowLoad, QWidget *parent) : memories::memories(bool slowLoad, QWidget *parent) :
QWidget(parent), QWidget(parent),
slowLoad(slowLoad), slowLoad(slowLoad),
rigCaps(rigCaps),
ui(new Ui::memories) ui(new Ui::memories)
{ {
ui->setupUi(this); ui->setupUi(this);
ui->table->setColumnCount(totalColumns); ui->table->setColumnCount(totalColumns);
ui->table->editing(false); ui->table->editing(false);
this->setObjectName("RigCtlD");
queue = cachingQueue::getInstance(this);
rigCaps = queue->getRigCaps();
QStringList headers; QStringList headers;
/* /*
@ -32,9 +35,9 @@ memories::memories(rigCapabilities rigCaps, bool slowLoad, QWidget *parent) :
split << "OFF" << "ON"; split << "OFF" << "ON";
dataModes << "OFF" << "DATA1"; dataModes << "OFF" << "DATA1";
if (rigCaps.commands.contains(funcDATA2Mod)) if (rigCaps->commands.contains(funcDATA2Mod))
dataModes.append("DATA2"); dataModes.append("DATA2");
if (rigCaps.commands.contains(funcDATA3Mod)) if (rigCaps->commands.contains(funcDATA3Mod))
dataModes.append("DATA3"); dataModes.append("DATA3");
filters << "FIL1" << "FIL2" << "FIL3"; filters << "FIL1" << "FIL2" << "FIL3";
@ -42,7 +45,7 @@ memories::memories(rigCapabilities rigCaps, bool slowLoad, QWidget *parent) :
duplexModes << "OFF" << "DUP-" << "DUP+" << "RPS"; duplexModes << "OFF" << "DUP-" << "DUP+" << "RPS";
toneModes << "OFF" << "TONE" << "TSQL"; toneModes << "OFF" << "TONE" << "TSQL";
if (rigCaps.commands.contains(funcRepeaterDTCS)) if (rigCaps->commands.contains(funcRepeaterDTCS))
toneModes.append("DTCS"); toneModes.append("DTCS");
@ -72,12 +75,12 @@ memories::memories(rigCapabilities rigCaps, bool slowLoad, QWidget *parent) :
ui->group->blockSignals(true); ui->group->blockSignals(true);
ui->group->addItem("Memory Group",-1); ui->group->addItem("Memory Group",-1);
for (int i=rigCaps.memStart;i<=rigCaps.memGroups;i++) { for (int i=rigCaps->memStart;i<=rigCaps->memGroups;i++) {
ui->group->addItem(QString("Group %0").arg(i,2,10,QChar('0')),i); ui->group->addItem(QString("Group %0").arg(i,2,10,QChar('0')),i);
} }
if (rigCaps.satMemories && rigCaps.commands.contains(funcSatelliteMode)){ if (rigCaps->satMemories && rigCaps->commands.contains(funcSatelliteMode)){
ui->group->addItem("Satellite",MEMORY_SATGROUP); ui->group->addItem("Satellite",MEMORY_SATGROUP);
} }
@ -88,13 +91,13 @@ memories::memories(rigCapabilities rigCaps, bool slowLoad, QWidget *parent) :
dvsql.append(QString::number(i).rightJustified(2,'0')); dvsql.append(QString::number(i).rightJustified(2,'0'));
} }
if (rigCaps.commands.contains(funcVFOEqualAB)) { if (rigCaps->commands.contains(funcVFOEqualAB)) {
vfos << "VFOA" << "VFOB"; vfos << "VFOA" << "VFOB";
} else if (rigCaps.commands.contains(funcVFOEqualMS)) { } else if (rigCaps->commands.contains(funcVFOEqualMS)) {
vfos << "MAIN" << "SUB"; vfos << "MAIN" << "SUB";
} }
for (auto &mode: rigCaps.modes){ for (auto &mode: rigCaps->modes){
modes.append(mode.name); modes.append(mode.name);
} }
@ -131,7 +134,7 @@ void memories::rowAdded(int row)
{ {
// Find the next available memory number: // Find the next available memory number:
quint32 num=rigCaps.memStart; quint32 num=rigCaps->memStart;
/* This feels unnecessarily complicated, but here we are: /* This feels unnecessarily complicated, but here we are:
* Set the memory number to 1 * Set the memory number to 1
@ -160,11 +163,11 @@ void memories::rowAdded(int row)
if (i == rows.end()) if (i == rows.end())
{ {
// No gaps found so work on highest value found // No gaps found so work on highest value found
if ((ui->group->currentData().toInt() != 200 && rows.back() < groupMemories-1) || (ui->group->currentData().toInt() == MEMORY_SATGROUP && rows.back() < rigCaps.satMemories-1)) if ((ui->group->currentData().toInt() != 200 && rows.back() < groupMemories-1) || (ui->group->currentData().toInt() == MEMORY_SATGROUP && rows.back() < rigCaps->satMemories-1))
{ {
num = rows.back() + 1; num = rows.back() + 1;
} }
else if (rows.front() == rigCaps.memStart) else if (rows.front() == rigCaps->memStart)
{ {
qWarning() << "Sorry no free memory slots found, please delete one first"; qWarning() << "Sorry no free memory slots found, please delete one first";
ui->table->removeRow(row); ui->table->removeRow(row);
@ -177,7 +180,9 @@ void memories::rowAdded(int row)
QPushButton* recall = new QPushButton("Recall"); QPushButton* recall = new QPushButton("Recall");
ui->table->setCellWidget(row,columnRecall,recall); ui->table->setCellWidget(row,columnRecall,recall);
connect(recall, &QPushButton::clicked, this, connect(recall, &QPushButton::clicked, this,
[=]() { qInfo() << "Recalling" << num; emit recallMemory((quint32((ui->group->currentData().toUInt() << 16) | num)));}); [=]() { qInfo() << "Recalling" << num;
queue->add(priorityImmediate,queueItem(funcMemoryMode,QVariant::fromValue<uint>((quint32((ui->group->currentData().toUInt() << 16) | num)))));
});
ui->table->model()->setData(ui->table->model()->index(row,columnNum),QString::number(num).rightJustified(3,'0')); ui->table->model()->setData(ui->table->model()->index(row,columnNum),QString::number(num).rightJustified(3,'0'));
// Set default values (where possible) for all other values: // Set default values (where possible) for all other values:
if (ui->table->item(row,columnSplit) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnSplit),split[0]); if (ui->table->item(row,columnSplit) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnSplit),split[0]);
@ -219,7 +224,7 @@ void memories::rowAdded(int row)
void memories::rowDeleted(quint32 mem) void memories::rowDeleted(quint32 mem)
{ {
if (mem >= rigCaps.memStart && mem <= rigCaps.memories) { if (mem >= rigCaps->memStart && mem <= rigCaps->memories) {
qInfo() << "Mem Deleted" << mem; qInfo() << "Mem Deleted" << mem;
memoryType currentMemory; memoryType currentMemory;
if (ui->group->currentData().toInt() == MEMORY_SATGROUP) if (ui->group->currentData().toInt() == MEMORY_SATGROUP)
@ -230,7 +235,7 @@ void memories::rowDeleted(quint32 mem)
currentMemory.group=ui->group->currentData().toInt(); currentMemory.group=ui->group->currentData().toInt();
currentMemory.channel = mem; currentMemory.channel = mem;
currentMemory.del = true; currentMemory.del = true;
emit setMemory(currentMemory); queue->add(priorityImmediate,queueItem((currentMemory.sat?funcSatelliteMemory:funcMemoryContents),QVariant::fromValue<memoryType>(currentMemory)));
} }
} }
@ -315,7 +320,7 @@ void memories::on_table_cellChanged(int row, int col)
currentMemory.frequency.Hz = (ui->table->item(row,columnFrequency) == NULL) ? 0 : quint64(ui->table->item(row,columnFrequency)->text().toDouble()*1000000.0); currentMemory.frequency.Hz = (ui->table->item(row,columnFrequency) == NULL) ? 0 : quint64(ui->table->item(row,columnFrequency)->text().toDouble()*1000000.0);
currentMemory.frequencyB.Hz = (ui->table->item(row,columnFrequencyB) == NULL) ? 0 : quint64(ui->table->item(row,columnFrequencyB)->text().toDouble()*1000000.0); currentMemory.frequencyB.Hz = (ui->table->item(row,columnFrequencyB) == NULL) ? 0 : quint64(ui->table->item(row,columnFrequencyB)->text().toDouble()*1000000.0);
for (auto &m: rigCaps.modes){ for (auto &m: rigCaps->modes){
if (!ui->table->isColumnHidden(columnMode) && ui->table->item(row,columnMode) != NULL && ui->table->item(row,columnMode)->text()==m.name) { if (!ui->table->isColumnHidden(columnMode) && ui->table->item(row,columnMode) != NULL && ui->table->item(row,columnMode)->text()==m.name) {
currentMemory.mode=m.reg; currentMemory.mode=m.reg;
} }
@ -412,8 +417,7 @@ void memories::on_table_cellChanged(int row, int col)
write=false; write=false;
} }
if (write) { if (write) {
emit setMemory(currentMemory); queue->add(priorityImmediate,queueItem((currentMemory.sat?funcSatelliteMemory:funcMemoryContents),QVariant::fromValue<memoryType>(currentMemory)));
qInfo() << "Sending memory, group:" << currentMemory.group << "channel" << currentMemory.channel; qInfo() << "Sending memory, group:" << currentMemory.group << "channel" << currentMemory.channel;
// Set number to not be editable once written. Not sure why but this crashes? // Set number to not be editable once written. Not sure why but this crashes?
//ui->table->item(row,columnNum)->setFlags(ui->table->item(row,columnNum)->flags() & (~Qt::ItemIsEditable)); //ui->table->item(row,columnNum)->setFlags(ui->table->item(row,columnNum)->flags() & (~Qt::ItemIsEditable));
@ -431,11 +435,11 @@ void memories::on_group_currentIndexChanged(int index)
// Special case for group 100 on the IC705! // Special case for group 100 on the IC705!
if (ui->group->currentData().toInt() == MEMORY_SATGROUP) if (ui->group->currentData().toInt() == MEMORY_SATGROUP)
groupMemories=rigCaps.satMemories; groupMemories=rigCaps->satMemories;
else if (ui->group->currentData().toInt() == MEMORY_SHORTGROUP) else if (ui->group->currentData().toInt() == MEMORY_SHORTGROUP)
groupMemories=3; groupMemories=3;
else else
groupMemories=rigCaps.memories; groupMemories=rigCaps->memories;
ui->loadingMemories->setVisible(true); ui->loadingMemories->setVisible(true);
ui->table->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->table->setEditTriggers(QAbstractItemView::NoEditTriggers);
@ -453,15 +457,21 @@ void memories::on_group_currentIndexChanged(int index)
QVector<memParserFormat> parser; QVector<memParserFormat> parser;
queue->add(priorityImmediate,queueItem(funcSatelliteMode,QVariant::fromValue<bool>(ui->group->currentData().toInt() == MEMORY_SATGROUP)));
if (ui->group->currentData().toInt() == MEMORY_SATGROUP) { if (ui->group->currentData().toInt() == MEMORY_SATGROUP) {
emit setSatelliteMode(true); queue->del(funcSelectedFreq,false);
parser = rigCaps.satParser; queue->del(funcSelectedMode,false);
queue->del(funcUnselectedFreq,true);
queue->del(funcUnselectedMode,true);
parser = rigCaps->satParser;
} else { } else {
emit setSatelliteMode(false); queue->addUnique(priorityMedium,funcSelectedFreq,true,false);
parser = rigCaps.memParser; queue->addUnique(priorityMedium,funcSelectedMode,true,false);
queue->addUnique(priorityMedium,funcUnselectedFreq,true,true);
queue->addUnique(priorityMedium,funcUnselectedMode,true,true);
parser = rigCaps->memParser;
} }
for (auto &parse: parser) { for (auto &parse: parser) {
switch (parse.spec) switch (parse.spec)
{ {
@ -879,38 +889,49 @@ void memories::on_group_currentIndexChanged(int index)
if (ui->group->currentData().toInt() == MEMORY_SATGROUP) { if (ui->group->currentData().toInt() == MEMORY_SATGROUP) {
lastMemoryRequested = rigCaps.memStart; lastMemoryRequested = rigCaps->memStart;
if (slowLoad) { if (slowLoad) {
QTimer::singleShot(MEMORY_SLOWLOAD, this, [this]{ emit getSatMemory(lastMemoryRequested); }); QTimer::singleShot(MEMORY_SLOWLOAD, this, [this]{
queue->add(priorityImmediate,queueItem(funcSatelliteMemory,QVariant::fromValue<ushort>(lastMemoryRequested & 0xffff)));
});
} else { } else {
emit getSatMemory(lastMemoryRequested); queue->add(priorityImmediate,queueItem(funcSatelliteMemory,QVariant::fromValue<ushort>(lastMemoryRequested & 0xffff)));
} }
} else { } else {
lastMemoryRequested = quint32((ui->group->currentData().toInt())<<16) | (rigCaps.memStart & 0xffff); lastMemoryRequested = quint32((ui->group->currentData().toInt())<<16) | (rigCaps->memStart & 0xffff);
if (slowLoad) { if (slowLoad) {
QTimer::singleShot(MEMORY_SLOWLOAD, this, [this]{ emit getMemory(lastMemoryRequested); }); QTimer::singleShot(MEMORY_SLOWLOAD, this, [this]{
queue->add(priorityImmediate,queueItem(funcMemoryContents,QVariant::fromValue<uint>(lastMemoryRequested)));
});
} else { } else {
// Is the current group attached to a particular band? // Is the current group attached to a particular band?
for (auto &band: rigCaps.bands) for (auto &band: rigCaps->bands)
{ {
if (band.memGroup==ui->group->currentData().toInt()) if (band.memGroup==ui->group->currentData().toInt())
{ {
emit setBand(band.band); queue->add(priorityImmediate,queueItem(funcBandStackReg,QVariant::fromValue<uchar>(band.band)));
} }
} }
emit getMemory(lastMemoryRequested); queue->add(priorityImmediate,queueItem(funcMemoryContents,QVariant::fromValue<uint>(lastMemoryRequested)));
} }
} }
} }
void memories::on_vfoMode_clicked() void memories::on_vfoMode_clicked()
{ {
emit vfoMode(); queue->addUnique(priorityMedium,funcSelectedFreq,true,false);
queue->addUnique(priorityMedium,funcSelectedMode,true,false);
queue->addUnique(priorityMedium,funcUnselectedFreq,true,true);
queue->addUnique(priorityMedium,funcUnselectedMode,true,true);
} }
void memories::on_memoryMode_clicked() void memories::on_memoryMode_clicked()
{ {
emit memoryMode(); queue->add(priorityImmediate,funcMemoryMode);
queue->del(funcSelectedFreq,false);
queue->del(funcSelectedMode,false);
queue->del(funcUnselectedFreq,true);
queue->del(funcUnselectedMode,true);
} }
@ -921,9 +942,9 @@ void memories::receiveMemory(memoryType mem)
{ {
lastMemoryRequested++; lastMemoryRequested++;
if (mem.sat) if (mem.sat)
emit getSatMemory(lastMemoryRequested); queue->add(priorityImmediate,queueItem(funcSatelliteMemory,QVariant::fromValue<ushort>(lastMemoryRequested & 0xffff)));
else else
emit getMemory(lastMemoryRequested); queue->add(priorityImmediate,queueItem(funcMemoryContents,QVariant::fromValue<uint>(lastMemoryRequested)));
timeoutTimer.start(MEMORY_TIMEOUT); timeoutTimer.start(MEMORY_TIMEOUT);
} }
else if (mem.channel == groupMemories) else if (mem.channel == groupMemories)
@ -946,7 +967,8 @@ void memories::receiveMemory(memoryType mem)
for (int n = 0; n<ui->table->rowCount();n++) for (int n = 0; n<ui->table->rowCount();n++)
{ {
if (ui->table->item(n,columnNum) != NULL && ui->table->item(n,columnNum)->text().toInt() == mem.channel && (rigCaps.memGroups < 2 || mem.sat || mem.group == ui->group->currentData().toInt())) if (ui->table->item(n,columnNum) != NULL && ui->table->item(n,columnNum)->text().toInt() == mem.channel &&
(rigCaps->memGroups < 2 || mem.sat || mem.group == ui->group->currentData().toInt()))
{ {
row = n; row = n;
break; break;
@ -961,8 +983,10 @@ void memories::receiveMemory(memoryType mem)
row=ui->table->rowCount()-1; row=ui->table->rowCount()-1;
QPushButton* recall = new QPushButton("Recall"); QPushButton* recall = new QPushButton("Recall");
ui->table->setCellWidget(row,columnRecall,recall); ui->table->setCellWidget(row,columnRecall,recall);
connect(recall, &QPushButton::clicked, this, connect(recall, &QPushButton::clicked, this, [=]() {
[=]() { qInfo() << "Recalling" << mem.channel; emit recallMemory((quint32((ui->group->currentData().toUInt() << 16) | mem.channel)));}); qInfo() << "Recalling" << mem.channel;
queue->add(priorityImmediate,queueItem(funcMemoryMode,QVariant::fromValue<uint>(quint32((ui->group->currentData().toUInt() << 16) | mem.channel))));
});
} }
ui->table->model()->setData(ui->table->model()->index(row,columnNum),QString::number(mem.channel & 0xffff).rightJustified(3,'0')); ui->table->model()->setData(ui->table->model()->index(row,columnNum),QString::number(mem.channel & 0xffff).rightJustified(3,'0'));
@ -981,12 +1005,12 @@ void memories::receiveMemory(memoryType mem)
ui->table->model()->setData(ui->table->model()->index(row,columnFrequencyB),QString::number(double(mem.frequencyB.Hz/1000000.0),'f',3)); ui->table->model()->setData(ui->table->model()->index(row,columnFrequencyB),QString::number(double(mem.frequencyB.Hz/1000000.0),'f',3));
validData++; validData++;
for (uint i=0;i<rigCaps.modes.size();i++) for (uint i=0;i<rigCaps->modes.size();i++)
{ {
if (mem.mode == rigCaps.modes[i].reg) if (mem.mode == rigCaps->modes[i].reg)
validData += updateCombo(modes,row,columnMode,i); validData += updateCombo(modes,row,columnMode,i);
if (mem.modeB == rigCaps.modes[i].reg) if (mem.modeB == rigCaps->modes[i].reg)
validData += updateCombo(modes,row,columnModeB,i); validData += updateCombo(modes,row,columnModeB,i);
} }
@ -1094,10 +1118,11 @@ void memories::receiveMemory(memoryType mem)
if (validData < visibleColumns) { if (validData < visibleColumns) {
qInfo(logRig()) << "Memory" << mem.channel << "Received valid data for" << validData << "columns, " << "expected" << visibleColumns << "requesting again"; qInfo(logRig()) << "Memory" << mem.channel << "Received valid data for" << validData << "columns, " << "expected" << visibleColumns << "requesting again";
if (mem.sat) if (mem.sat) {
emit getSatMemory(mem.channel & 0xffff); queue->add(priorityImmediate,queueItem(funcSatelliteMemory,QVariant::fromValue<ushort>(mem.channel & 0xffff)));
else } else {
emit getMemory(quint32((ui->group->currentData().toInt())<<16) | (mem.channel & 0xffff)); queue->add(priorityImmediate,queueItem(funcMemoryContents,QVariant::fromValue<uint>(mem.channel & 0xffff)));
}
retries++; retries++;
} }
@ -1155,14 +1180,15 @@ bool memories::checkASCII(QString str)
void memories::timeout() void memories::timeout()
{ {
if (timeoutCount < 10 ) if (timeoutCount < 10 )
{ {
qInfo(logRig()) << "Timeout receiving memory:" << (lastMemoryRequested & 0xffff) << "in group" << (lastMemoryRequested >> 16 & 0xffff); qInfo(logRig()) << "Timeout receiving memory:" << (lastMemoryRequested & 0xffff) << "in group" << (lastMemoryRequested >> 16 & 0xffff);
if (ui->group->currentData().toInt() == MEMORY_SATGROUP) if (ui->group->currentData().toInt() == MEMORY_SATGROUP) {
emit getSatMemory(lastMemoryRequested); queue->add(priorityImmediate,queueItem(funcSatelliteMemory,QVariant::fromValue<ushort>(lastMemoryRequested & 0xffff)));
else } else {
emit getMemory(lastMemoryRequested); queue->add(priorityImmediate,queueItem(funcMemoryContents,QVariant::fromValue<uint>(lastMemoryRequested)));
}
timeoutTimer.start(MEMORY_TIMEOUT); timeoutTimer.start(MEMORY_TIMEOUT);
timeoutCount++; timeoutCount++;
} else { } else {
@ -1241,8 +1267,10 @@ void memories::on_csvImport_clicked()
ui->table->insertRow(rownum); ui->table->insertRow(rownum);
QPushButton* recall = new QPushButton("Recall"); QPushButton* recall = new QPushButton("Recall");
ui->table->setCellWidget(rownum,columnRecall,recall); ui->table->setCellWidget(rownum,columnRecall,recall);
connect(recall, &QPushButton::clicked, this, connect(recall, &QPushButton::clicked, this, [=]() {
[=]() { qInfo() << "Recalling" << row[0].toInt(); emit recallMemory((quint32((ui->group->currentData().toUInt() << 16) | row[0].toInt())));}); qInfo() << "Recalling" << row[0].toInt();
queue->add(priorityImmediate,queueItem(funcMemoryMode,QVariant::fromValue<uint>(quint32((ui->group->currentData().toUInt() << 16) | row[0].toInt()))));
});
} }
// rownum is now the row we need to work on. // rownum is now the row we need to work on.

Wyświetl plik

@ -14,6 +14,7 @@
#include "tablewidget.h" #include "tablewidget.h"
#include "wfviewtypes.h" #include "wfviewtypes.h"
#include "rigidentities.h" #include "rigidentities.h"
#include "cachingqueue.h"
#define MEMORY_TIMEOUT 1000 #define MEMORY_TIMEOUT 1000
#define MEMORY_SLOWLOAD 500 #define MEMORY_SLOWLOAD 500
@ -29,7 +30,7 @@ class memories : public QWidget
Q_OBJECT Q_OBJECT
public: public:
explicit memories(rigCapabilities rigCaps,bool slowLoad=false,QWidget *parent = nullptr); explicit memories(bool slowLoad=false,QWidget *parent = nullptr);
~memories(); ~memories();
void populate(); void populate();
@ -64,6 +65,7 @@ private slots:
void timeout(); void timeout();
private: private:
cachingQueue* queue;
quint32 groupMemories=0; quint32 groupMemories=0;
quint32 lastMemoryRequested=0; quint32 lastMemoryRequested=0;
QTimer timeoutTimer; QTimer timeoutTimer;
@ -175,7 +177,7 @@ private:
tableEditor* r1EditorB = Q_NULLPTR; tableEditor* r1EditorB = Q_NULLPTR;
tableEditor* r2EditorB = Q_NULLPTR; tableEditor* r2EditorB = Q_NULLPTR;
rigCapabilities rigCaps; rigCapabilities* rigCaps = Q_NULLPTR;
Ui::memories *ui; Ui::memories *ui;
bool extended = false; bool extended = false;

Wyświetl plik

@ -16,6 +16,12 @@
pttyHandler::pttyHandler(QString pty, QObject* parent) : QObject(parent) pttyHandler::pttyHandler(QString pty, QObject* parent) : QObject(parent)
{ {
//constructor //constructor
this->setObjectName("pttyHandler");
queue = cachingQueue::getInstance(this);
connect(queue, SIGNAL(rigCapsUpdated(rigCapabilities*)), this, SLOT(receiveRigCaps(rigCapabilities*)));
rigCaps = queue->getRigCaps();
if (pty == "" || pty.toLower() == "none") if (pty == "" || pty.toLower() == "none")
{ {
// Just return if pty is not configured. // Just return if pty is not configured.
@ -222,7 +228,7 @@ void pttyHandler::receiveDataIn(int fd) {
qInfo(logSerial()) << "pty remote CI-V changed:" << QString("0x%1").arg((quint8)civId,0,16); qInfo(logSerial()) << "pty remote CI-V changed:" << QString("0x%1").arg((quint8)civId,0,16);
} }
// filter C-IV transceive command before forwarding on. // filter C-IV transceive command before forwarding on.
if (inPortData.contains(rigCaps.transceiveCommand)) if (rigCaps != Q_NULLPTR && inPortData.contains(rigCaps->transceiveCommand))
{ {
//qInfo(logSerial()) << "Filtered transceive command"; //qInfo(logSerial()) << "Filtered transceive command";
//printHex(inPortData, false, true); //printHex(inPortData, false, true);
@ -337,10 +343,12 @@ void pttyHandler::printHex(const QByteArray& pdata, bool printVert, bool printHo
qDebug(logSerial()) << "----- End hex dump -----"; qDebug(logSerial()) << "----- End hex dump -----";
} }
void pttyHandler::receiveFoundRigID(rigCapabilities rigCaps) {
this->rigCaps = rigCaps;
qInfo(logSerial) << "Received rigCapabilities for" << rigCaps.modelName;
void pttyHandler::receiveRigCaps(rigCapabilities* caps)
{
if (caps != Q_NULLPTR) {
qInfo(logSerial()) << "Got rigcaps for:" << caps->modelName;
}
this->rigCaps = caps;
} }

Wyświetl plik

@ -11,6 +11,7 @@
#include "rigidentities.h" #include "rigidentities.h"
#include "wfviewtypes.h" #include "wfviewtypes.h"
#include "cachingqueue.h"
// This class abstracts the comm port in a useful way and connects to // This class abstracts the comm port in a useful way and connects to
// the command creator and command parser. // the command creator and command parser.
@ -30,7 +31,7 @@ private slots:
void receiveDataIn(int fd); // from physical port void receiveDataIn(int fd); // from physical port
void receiveDataFromRigToPtty(const QByteArray& data); void receiveDataFromRigToPtty(const QByteArray& data);
void debugThis(); void debugThis();
void receiveFoundRigID(rigCapabilities rigCaps); void receiveRigCaps(rigCapabilities* rigCaps);
signals: signals:
void haveTextMessage(QString message); // status, debug only void haveTextMessage(QString message); // status, debug only
@ -73,7 +74,8 @@ private:
bool disableTransceive = false; bool disableTransceive = false;
QSocketNotifier *ptReader = Q_NULLPTR; QSocketNotifier *ptReader = Q_NULLPTR;
quint8 civId=0; quint8 civId=0;
rigCapabilities rigCaps; rigCapabilities* rigCaps = Q_NULLPTR;
cachingQueue* queue = Q_NULLPTR;
}; };
#endif // PTTYHANDLER_H #endif // PTTYHANDLER_H

Wyświetl plik

@ -95,8 +95,6 @@ void rigCommander::commSetup(QHash<unsigned char,QString> rigList, unsigned char
connect(this, SIGNAL(getMoreDebug()), comm, SLOT(debugThis())); connect(this, SIGNAL(getMoreDebug()), comm, SLOT(debugThis()));
connect(this, SIGNAL(getMoreDebug()), ptty, SLOT(debugThis())); connect(this, SIGNAL(getMoreDebug()), ptty, SLOT(debugThis()));
connect(this, SIGNAL(discoveredRigID(rigCapabilities)), ptty, SLOT(receiveFoundRigID(rigCapabilities)));
commonSetup(); commonSetup();
} }
@ -170,8 +168,6 @@ void rigCommander::commSetup(QHash<unsigned char,QString> rigList, unsigned char
connect(ptty, SIGNAL(havePortError(errorType)), this, SLOT(handlePortError(errorType))); connect(ptty, SIGNAL(havePortError(errorType)), this, SLOT(handlePortError(errorType)));
connect(this, SIGNAL(getMoreDebug()), ptty, SLOT(debugThis())); connect(this, SIGNAL(getMoreDebug()), ptty, SLOT(debugThis()));
connect(this, SIGNAL(discoveredRigID(rigCapabilities)), ptty, SLOT(receiveFoundRigID(rigCapabilities)));
connect(udp, SIGNAL(requestRadioSelection(QList<radio_cap_packet>)), this, SLOT(radioSelection(QList<radio_cap_packet>))); connect(udp, SIGNAL(requestRadioSelection(QList<radio_cap_packet>)), this, SLOT(radioSelection(QList<radio_cap_packet>)));
connect(udp, SIGNAL(setRadioUsage(quint8, bool, quint8, QString, QString)), this, SLOT(radioUsage(quint8, bool, quint8, QString, QString))); connect(udp, SIGNAL(setRadioUsage(quint8, bool, quint8, QString, QString)), this, SLOT(radioUsage(quint8, bool, quint8, QString, QString)));
connect(this, SIGNAL(selectedRadio(quint8)), udp, SLOT(setCurrentRadio(quint8))); connect(this, SIGNAL(selectedRadio(quint8)), udp, SLOT(setCurrentRadio(quint8)));

Wyświetl plik

@ -310,7 +310,9 @@ void rigCtlD::stopServer()
void rigCtlClient::receiveRigCaps(rigCapabilities* caps) void rigCtlClient::receiveRigCaps(rigCapabilities* caps)
{ {
qInfo(logRigCtlD()) << "Got rigcaps for:" << caps->modelName; if (caps != Q_NULLPTR) {
qInfo(logRigCtlD()) << "Got rigcaps for:" << caps->modelName;
}
this->rigCaps = caps; this->rigCaps = caps;
} }

Wyświetl plik

@ -278,7 +278,6 @@ public:
int startServer(qint16 port); int startServer(qint16 port);
void stopServer(); void stopServer();
rigCapabilities* rigCaps;
signals: signals:
void onStarted(); void onStarted();
@ -342,7 +341,7 @@ protected:
private: private:
cachingQueue* queue; cachingQueue* queue;
rigCapabilities* rigCaps; rigCapabilities* rigCaps=Q_NULLPTR;
rigCtlD* parent; rigCtlD* parent;
bool chkVfoEecuted=false; bool chkVfoEecuted=false;
unsigned long crcTable[256]; unsigned long crcTable[256];

Wyświetl plik

@ -33,11 +33,6 @@ transceiverAdjustments::transceiverAdjustments(QWidget *parent) :
transceiverAdjustments::~transceiverAdjustments() transceiverAdjustments::~transceiverAdjustments()
{ {
rigCaps.inputs.clear();
rigCaps.preamps.clear();
rigCaps.attenuators.clear();
rigCaps.antennas.clear();
delete ui; delete ui;
} }

Wyświetl plik

@ -1235,7 +1235,7 @@ void usbController::sendRequest(USBDEVICE *dev, usbFeatureType feature, int val,
{ {
myImage.save(&butBuffer, "BMP"); myImage.save(&butBuffer, "BMP");
quint16 payloadLen = dev->type.maxPayload - sizeof(streamdeck_v1_image_header); quint16 payloadLen = dev->type.maxPayload - quint16(sizeof(streamdeck_v1_image_header));
if (dev->type.model == usbDeviceType::StreamDeckOriginal) { if (dev->type.model == usbDeviceType::StreamDeckOriginal) {
// Special case for buttons on original StreamDeck // Special case for buttons on original StreamDeck

Wyświetl plik

@ -88,7 +88,6 @@ wfmain::wfmain(const QString settingsFile, const QString logFile, bool debugMode
cal = new calibrationWindow(); cal = new calibrationWindow();
rpt = new repeaterSetup(); rpt = new repeaterSetup();
sat = new satelliteSetup(); sat = new satelliteSetup();
trxadj = new transceiverAdjustments();
cw = new cwSender(); cw = new cwSender();
abtBox = new aboutbox(); abtBox = new aboutbox();
selRad = new selectRadio(); selRad = new selectRadio();
@ -141,8 +140,6 @@ wfmain::wfmain(const QString settingsFile, const QString logFile, bool debugMode
qRegisterMetaType<centerSpanData>(); qRegisterMetaType<centerSpanData>();
qRegisterMetaType<bandStackType>(); qRegisterMetaType<bandStackType>();
haveRigCaps = false;
this->setObjectName("wfmain"); this->setObjectName("wfmain");
queue = cachingQueue::getInstance(this); queue = cachingQueue::getInstance(this);
@ -214,6 +211,8 @@ wfmain::wfmain(const QString settingsFile, const QString logFile, bool debugMode
ConnectionTimer.setSingleShot(true); ConnectionTimer.setSingleShot(true);
connect(&ConnectionTimer,SIGNAL(timeout()), this,SLOT(connectionTimeout())); connect(&ConnectionTimer,SIGNAL(timeout()), this,SLOT(connectionTimeout()));
// Make sure we know about any changes to rigCaps
connect(queue, SIGNAL(rigCapsUpdated(rigCapabilities*)), this, SLOT(receiveRigCaps(rigCapabilities*)));
setupKeyShortcuts(); setupKeyShortcuts();
@ -485,7 +484,7 @@ void wfmain::makeRig()
connect(this, SIGNAL(sendChangeLatency(quint16)), rig, SLOT(changeLatency(quint16))); connect(this, SIGNAL(sendChangeLatency(quint16)), rig, SLOT(changeLatency(quint16)));
connect(this, SIGNAL(getRigCIV()), rig, SLOT(findRigs())); connect(this, SIGNAL(getRigCIV()), rig, SLOT(findRigs()));
connect(this, SIGNAL(setRigID(unsigned char)), rig, SLOT(setRigID(unsigned char))); connect(this, SIGNAL(setRigID(unsigned char)), rig, SLOT(setRigID(unsigned char)));
connect(rig, SIGNAL(discoveredRigID(rigCapabilities)), this, SLOT(receiveFoundRigID(rigCapabilities)));
connect(rig, SIGNAL(commReady()), this, SLOT(receiveCommReady())); connect(rig, SIGNAL(commReady()), this, SLOT(receiveCommReady()));
@ -512,7 +511,7 @@ void wfmain::makeRig()
//connect(this, SIGNAL(getSatMemory(quint32)), rig, SLOT(getSatMemory(quint32))); //connect(this, SIGNAL(getSatMemory(quint32)), rig, SLOT(getSatMemory(quint32)));
//connect(this, SIGNAL(setMemory(memoryType)), rig, SLOT(setMemory(memoryType))); //connect(this, SIGNAL(setMemory(memoryType)), rig, SLOT(setMemory(memoryType)));
//connect(this, SIGNAL(clearMemory(quint32)), rig, SLOT(clearMemory(quint32))); //connect(this, SIGNAL(clearMemory(quint32)), rig, SLOT(clearMemory(quint32)));
//connect(this, SIGNAL(recallMemory(quint32)), rig, SLOT(recallMemory(quint32))); //connect(this, SIGNAL(rigCaps->ry(quint32)), rig, SLOT(rigCaps->ry(quint32)));
connect(this->rpt, &repeaterSetup::setDuplexMode, this->rig, connect(this->rpt, &repeaterSetup::setDuplexMode, this->rig,
[=](const duplexMode_t &t) { queue->add(priorityImmediate,queueItem(funcSplitStatus,QVariant::fromValue<duplexMode_t>(t),false));}); [=](const duplexMode_t &t) { queue->add(priorityImmediate,queueItem(funcSplitStatus,QVariant::fromValue<duplexMode_t>(t),false));});
@ -550,7 +549,7 @@ void wfmain::makeRig()
connect(this->rpt, &repeaterSetup::getRptAccessMode, this->rig, connect(this->rpt, &repeaterSetup::getRptAccessMode, this->rig,
[=]() { [=]() {
if (rigCaps.commands.contains(funcToneSquelchType)) { if (rigCaps->commands.contains(funcToneSquelchType)) {
queue->add(priorityImmediate,funcToneSquelchType,false,false); queue->add(priorityImmediate,funcToneSquelchType,false,false);
} else { } else {
queue->add(priorityImmediate,funcRepeaterTone,false,false); queue->add(priorityImmediate,funcRepeaterTone,false,false);
@ -565,7 +564,7 @@ void wfmain::makeRig()
connect(this->rpt, &repeaterSetup::setRptAccessMode, this->rig, connect(this->rpt, &repeaterSetup::setRptAccessMode, this->rig,
[=](const rptrAccessData &rd) { [=](const rptrAccessData &rd) {
if (rigCaps.commands.contains(funcToneSquelchType)) { if (rigCaps->commands.contains(funcToneSquelchType)) {
queue->add(priorityImmediate,queueItem(funcToneSquelchType,QVariant::fromValue<rptrAccessData>(rd),false)); queue->add(priorityImmediate,queueItem(funcToneSquelchType,QVariant::fromValue<rptrAccessData>(rd),false));
} else { } else {
if(rd.accessMode == ratrTN) { if(rd.accessMode == ratrTN) {
@ -747,21 +746,6 @@ void wfmain::receiveCommReady()
} }
} }
void wfmain::receiveFoundRigID(rigCapabilities rigCaps)
{
// Entry point for unknown rig being identified at the start of the program.
//now we know what the rig ID is:
//qInfo(logSystem()) << "In wfview, we now have a reply to our request for rig identity sent to CIV BROADCAST.";
receiveRigID(rigCaps);
initPeriodicCommands();
getInitialRigState();
return;
}
void wfmain::receivePortError(errorType err) void wfmain::receivePortError(errorType err)
{ {
if (err.alert) { if (err.alert) {
@ -1027,7 +1011,7 @@ void wfmain::setServerToPrefs()
emit initServer(); emit initServer();
connect(this, SIGNAL(sendRigCaps(rigCapabilities)), udp, SLOT(receiveRigCaps(rigCapabilities))); //connect(this, SIGNAL(sendRigCaps(rigCapabilities)), udp, SLOT(receiveRigCaps(rigCapabilities)));
ui->statusBar->showMessage(QString("Server enabled"), 1000); ui->statusBar->showMessage(QString("Server enabled"), 1000);
@ -1053,7 +1037,7 @@ void wfmain::configureVFOs()
vfos.clear(); vfos.clear();
} }
for(uchar i=0;i<rigCaps.numVFO;i++) for(uchar i=0;i<rigCaps->numVFO;i++)
{ {
spectrumScope* vfo = new spectrumScope; spectrumScope* vfo = new spectrumScope;
@ -1222,7 +1206,7 @@ void wfmain::setupKeyShortcuts()
// Alternate for plus: // Alternate for plus:
keyK = new QShortcut(this); keyK = new QShortcut(this);
keyK->setKey(Qt::Key_K); keyK->setKey(Qt::Key_K);
connect(keyK, &QShortcut::activated, connect(keyK, &QShortcut::activated, this,
[=]() { [=]() {
if (freqLock) return; if (freqLock) return;
this->shortcutPlus(); this->shortcutPlus();
@ -1231,7 +1215,7 @@ void wfmain::setupKeyShortcuts()
// Alternate for minus: // Alternate for minus:
keyJ = new QShortcut(this); keyJ = new QShortcut(this);
keyJ->setKey(Qt::Key_J); keyJ->setKey(Qt::Key_J);
connect(keyJ, &QShortcut::activated, connect(keyJ, &QShortcut::activated, this,
[=]() { [=]() {
if (freqLock) return; if (freqLock) return;
this->shortcutMinus(); this->shortcutMinus();
@ -1239,7 +1223,7 @@ void wfmain::setupKeyShortcuts()
keyShiftK = new QShortcut(this); keyShiftK = new QShortcut(this);
keyShiftK->setKey(Qt::SHIFT | Qt::Key_K); keyShiftK->setKey(Qt::SHIFT | Qt::Key_K);
connect(keyShiftK, &QShortcut::activated, connect(keyShiftK, &QShortcut::activated, this,
[=]() { [=]() {
if (freqLock) return; if (freqLock) return;
this->shortcutShiftPlus(); this->shortcutShiftPlus();
@ -1248,7 +1232,7 @@ void wfmain::setupKeyShortcuts()
keyShiftJ = new QShortcut(this); keyShiftJ = new QShortcut(this);
keyShiftJ->setKey(Qt::SHIFT | Qt::Key_J); keyShiftJ->setKey(Qt::SHIFT | Qt::Key_J);
connect(keyShiftJ, &QShortcut::activated, connect(keyShiftJ, &QShortcut::activated, this,
[=]() { [=]() {
if (freqLock) return; if (freqLock) return;
this->shortcutShiftMinus(); this->shortcutShiftMinus();
@ -1256,7 +1240,7 @@ void wfmain::setupKeyShortcuts()
keyControlK = new QShortcut(this); keyControlK = new QShortcut(this);
keyControlK->setKey(Qt::CTRL | Qt::Key_K); keyControlK->setKey(Qt::CTRL | Qt::Key_K);
connect(keyControlK, &QShortcut::activated, connect(keyControlK, &QShortcut::activated, this,
[=]() { [=]() {
if (freqLock) return; if (freqLock) return;
this->shortcutControlPlus(); this->shortcutControlPlus();
@ -1265,7 +1249,7 @@ void wfmain::setupKeyShortcuts()
keyControlJ = new QShortcut(this); keyControlJ = new QShortcut(this);
keyControlJ->setKey(Qt::CTRL | Qt::Key_J); keyControlJ->setKey(Qt::CTRL | Qt::Key_J);
connect(keyControlJ, &QShortcut::activated, connect(keyControlJ, &QShortcut::activated, this,
[=]() { [=]() {
if (freqLock) return; if (freqLock) return;
this->shortcutControlMinus(); this->shortcutControlMinus();
@ -1274,7 +1258,7 @@ void wfmain::setupKeyShortcuts()
// H = Down // H = Down
keyH = new QShortcut(this); keyH = new QShortcut(this);
keyH->setKey(Qt::Key_H); keyH->setKey(Qt::Key_H);
connect(keyH, &QShortcut::activated, connect(keyH, &QShortcut::activated, this,
[=]() { [=]() {
if (freqLock) return; if (freqLock) return;
@ -1289,7 +1273,7 @@ void wfmain::setupKeyShortcuts()
// L = Up // L = Up
keyL = new QShortcut(this); keyL = new QShortcut(this);
keyL->setKey(Qt::Key_L); keyL->setKey(Qt::Key_L);
connect(keyL, &QShortcut::activated, connect(keyL, &QShortcut::activated, this,
[=]() { [=]() {
if (freqLock) return; if (freqLock) return;
@ -1391,31 +1375,31 @@ void wfmain::buttonControl(const COMMAND* cmd)
switch (cmd->command) { switch (cmd->command) {
case funcBandStackReg: case funcBandStackReg:
if (cmd->value == 100) { if (cmd->value == 100) {
for (size_t i = 0; i < rigCaps.bands.size(); i++) { for (size_t i = 0; i < rigCaps->bands.size(); i++) {
if (rigCaps.bands[i].band == lastRequestedBand) if (rigCaps->bands[i].band == lastRequestedBand)
{ {
if (i > 0) { if (i > 0) {
//issueCmd(cmdGetBandStackReg, rigCaps.bands[i - 1].band); //issueCmd(cmdGetBandStackReg, rigCaps->bands[i - 1].band);
} }
else { else {
//issueCmd(cmdGetBandStackReg, rigCaps.bands[rigCaps.bands.size() - 1].band); //issueCmd(cmdGetBandStackReg, rigCaps->bands[rigCaps->bands.size() - 1].band);
} }
} }
} }
} else if (cmd->value == -100) { } else if (cmd->value == -100) {
for (size_t i = 0; i < rigCaps.bands.size(); i++) { for (size_t i = 0; i < rigCaps->bands.size(); i++) {
if (rigCaps.bands[i].band == lastRequestedBand) if (rigCaps->bands[i].band == lastRequestedBand)
{ {
if (i + 1 < rigCaps.bands.size()) { if (i + 1 < rigCaps->bands.size()) {
//issueCmd(cmdGetBandStackReg, rigCaps.bands[i + 1].band); //issueCmd(cmdGetBandStackReg, rigCaps->bands[i + 1].band);
} }
else { else {
//issueCmd(cmdGetBandStackReg, rigCaps.bands[0].band); //issueCmd(cmdGetBandStackReg, rigCaps->bands[0].band);
} }
} }
} }
} else { } else {
for (auto &band: rigCaps.bands) for (auto &band: rigCaps->bands)
{ {
if (band.band == cmd->value) if (band.band == cmd->value)
{ {
@ -1426,26 +1410,26 @@ void wfmain::buttonControl(const COMMAND* cmd)
break; break;
case funcModeSet: case funcModeSet:
if (cmd->value == 100) { if (cmd->value == 100) {
for (size_t i = 0; i < rigCaps.modes.size(); i++) { for (size_t i = 0; i < rigCaps->modes.size(); i++) {
if (rigCaps.modes[i].mk == currentModeInfo.mk) if (rigCaps->modes[i].mk == currentModeInfo.mk)
{ {
if (i + 1 < rigCaps.modes.size()) { if (i + 1 < rigCaps->modes.size()) {
changeMode(rigCaps.modes[i + 1].mk); changeMode(rigCaps->modes[i + 1].mk);
} }
else { else {
changeMode(rigCaps.modes[0].mk); changeMode(rigCaps->modes[0].mk);
} }
} }
} }
} else if (cmd->value == -100) { } else if (cmd->value == -100) {
for (size_t i = 0; i < rigCaps.modes.size(); i++) { for (size_t i = 0; i < rigCaps->modes.size(); i++) {
if (rigCaps.modes[i].mk == currentModeInfo.mk) if (rigCaps->modes[i].mk == currentModeInfo.mk)
{ {
if (i>0) { if (i>0) {
changeMode(rigCaps.modes[i - 1].mk); changeMode(rigCaps->modes[i - 1].mk);
} }
else { else {
changeMode(rigCaps.modes[rigCaps.modes.size()-1].mk); changeMode(rigCaps->modes[rigCaps->modes.size()-1].mk);
} }
} }
} }
@ -3284,7 +3268,7 @@ void wfmain::on_tuningStepCombo_currentIndexChanged(int index)
tsWfScrollHz = ui->tuningStepCombo->itemData(index).toUInt(); tsWfScrollHz = ui->tuningStepCombo->itemData(index).toUInt();
tsKnobHz = ui->tuningStepCombo->itemData(index).toUInt(); tsKnobHz = ui->tuningStepCombo->itemData(index).toUInt();
for (auto &s: rigCaps.steps) { for (auto &s: rigCaps->steps) {
if (tsWfScrollHz == s.hz) if (tsWfScrollHz == s.hz)
{ {
foreach (auto vfo, vfos) foreach (auto vfo, vfos)
@ -3509,25 +3493,25 @@ void wfmain:: getInitialRigState()
queue->del(funcTransceiverId); // This command is no longer required queue->del(funcTransceiverId); // This command is no longer required
/* /*
queue->add(priorityImmediate,(rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqGet),false); queue->add(priorityImmediate,(rigCaps->commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqGet),false);
queue->add(priorityImmediate,(rigCaps.commands.contains(funcSelectedMode)?funcSelectedMode:funcModeGet),false); queue->add(priorityImmediate,(rigCaps->commands.contains(funcSelectedMode)?funcSelectedMode:funcModeGet),false);
queue->add(priorityImmediate,(rigCaps.commands.contains(funcUnselectedFreq)?funcUnselectedFreq:funcNone),false,true); queue->add(priorityImmediate,(rigCaps->commands.contains(funcUnselectedFreq)?funcUnselectedFreq:funcNone),false,true);
queue->add(priorityImmediate,(rigCaps.commands.contains(funcUnselectedMode)?funcUnselectedMode:funcNone),false,true); queue->add(priorityImmediate,(rigCaps->commands.contains(funcUnselectedMode)?funcUnselectedMode:funcNone),false,true);
// From left to right in the UI: // From left to right in the UI:
if (rigCaps.hasTransmit) if (rigCaps->hasTransmit)
{ {
queue->add(priorityImmediate,funcDataModeWithFilter); queue->add(priorityImmediate,funcDataModeWithFilter);
queue->add(priorityImmediate,(rigCaps.commands.contains(funcDATAOffMod)?funcDATAOffMod:funcNone),false); queue->add(priorityImmediate,(rigCaps->commands.contains(funcDATAOffMod)?funcDATAOffMod:funcNone),false);
queue->add(priorityImmediate,(rigCaps.commands.contains(funcDATA1Mod)?funcDATA1Mod:funcNone),false); queue->add(priorityImmediate,(rigCaps->commands.contains(funcDATA1Mod)?funcDATA1Mod:funcNone),false);
queue->add(priorityImmediate,(rigCaps.commands.contains(funcDATA2Mod)?funcDATA2Mod:funcNone),false); queue->add(priorityImmediate,(rigCaps->commands.contains(funcDATA2Mod)?funcDATA2Mod:funcNone),false);
queue->add(priorityImmediate,(rigCaps.commands.contains(funcDATA3Mod)?funcDATA3Mod:funcNone),false); queue->add(priorityImmediate,(rigCaps->commands.contains(funcDATA3Mod)?funcDATA3Mod:funcNone),false);
queue->add(priorityImmediate,(rigCaps.commands.contains(funcRFPower)?funcRFPower:funcNone),false); queue->add(priorityImmediate,(rigCaps->commands.contains(funcRFPower)?funcRFPower:funcNone),false);
queue->add(priorityImmediate,getInputTypeCommand(currentModDataOffSrc.type),false); queue->add(priorityImmediate,getInputTypeCommand(currentModDataOffSrc.type),false);
queue->add(priorityImmediate,getInputTypeCommand(currentModData1Src.type),false); queue->add(priorityImmediate,getInputTypeCommand(currentModData1Src.type),false);
if (rigCaps.commands.contains(funcDATA2Mod)) if (rigCaps->commands.contains(funcDATA2Mod))
queue->add(priorityImmediate,getInputTypeCommand(currentModData2Src.type),false); queue->add(priorityImmediate,getInputTypeCommand(currentModData2Src.type),false);
if (rigCaps.commands.contains(funcDATA3Mod)) if (rigCaps->commands.contains(funcDATA3Mod))
queue->add(priorityImmediate,getInputTypeCommand(currentModData3Src.type),false); queue->add(priorityImmediate,getInputTypeCommand(currentModData3Src.type),false);
} }
@ -3540,21 +3524,21 @@ void wfmain:: getInitialRigState()
queue->add(priorityImmediate,funcMonitorGain,false); queue->add(priorityImmediate,funcMonitorGain,false);
*/ */
if(rigCaps.hasSpectrum) if(rigCaps->hasSpectrum)
{ {
queue->add(priorityImmediate,queueItem(funcScopeOnOff,QVariant::fromValue(quint8(1)),false)); queue->add(priorityImmediate,queueItem(funcScopeOnOff,QVariant::fromValue(quint8(1)),false));
queue->add(priorityImmediate,queueItem(funcScopeDataOutput,QVariant::fromValue(quint8(1)),false)); queue->add(priorityImmediate,queueItem(funcScopeDataOutput,QVariant::fromValue(quint8(1)),false));
// Find the scope ref limits // Find the scope ref limits
auto mr = rigCaps.commands.find(funcScopeMainRef); auto mr = rigCaps->commands.find(funcScopeMainRef);
if (mr != rigCaps.commands.end()) if (mr != rigCaps->commands.end())
{ {
vfos[0]->setRefLimits(mr.value().minVal,mr.value().maxVal); vfos[0]->setRefLimits(mr.value().minVal,mr.value().maxVal);
queue->add(priorityImmediate,(funcScopeMainRef),false,false); queue->add(priorityImmediate,(funcScopeMainRef),false,false);
} }
auto sr = rigCaps.commands.find(funcScopeSubRef); auto sr = rigCaps->commands.find(funcScopeSubRef);
if (sr != rigCaps.commands.end()) if (sr != rigCaps->commands.end())
{ {
if (vfos.size()>1) if (vfos.size()>1)
vfos[1]->setRefLimits(sr.value().minVal,sr.value().maxVal); vfos[1]->setRefLimits(sr.value().minVal,sr.value().maxVal);
@ -3564,14 +3548,14 @@ void wfmain:: getInitialRigState()
// Only show settingsgroup if rig has sub // Only show settingsgroup if rig has sub
ui->scopeSettingsGroup->setVisible(rigCaps.commands.contains(funcScopeSubWaveData)); ui->scopeSettingsGroup->setVisible(rigCaps->commands.contains(funcScopeSubWaveData));
ui->scopeDualBtn->setVisible(rigCaps.commands.contains(funcScopeSingleDual)); ui->scopeDualBtn->setVisible(rigCaps->commands.contains(funcScopeSingleDual));
ui->antennaGroup->setVisible(rigCaps.commands.contains(funcAntenna)); ui->antennaGroup->setVisible(rigCaps->commands.contains(funcAntenna));
ui->preampAttGroup->setVisible(rigCaps.commands.contains(funcPreamp)); ui->preampAttGroup->setVisible(rigCaps->commands.contains(funcPreamp));
quint64 start=UINT64_MAX; quint64 start=UINT64_MAX;
quint64 end=0; quint64 end=0;
for (auto &band: rigCaps.bands) for (auto &band: rigCaps->bands)
{ {
if (start > band.lowFreq) if (start > band.lowFreq)
start = band.lowFreq; start = band.lowFreq;
@ -3580,60 +3564,60 @@ void wfmain:: getInitialRigState()
} }
foreach (auto vfo, vfos) foreach (auto vfo, vfos)
{ {
vfo->enableScope(this->rigCaps.commands.contains(funcScopeMainMode)); vfo->enableScope(this->rigCaps->commands.contains(funcScopeMainMode));
vfo->displaySettings(0, start, end, 1,(FctlUnit)prefs.frequencyUnits,&rigCaps.bands); vfo->displaySettings(0, start, end, 1,(FctlUnit)prefs.frequencyUnits,&rigCaps->bands);
} }
/* /*
if (rigCaps.commands.contains(funcFilterWidth)) if (rigCaps->commands.contains(funcFilterWidth))
queue->add(priorityHigh,funcFilterWidth,false); queue->add(priorityHigh,funcFilterWidth,false);
if (rigCaps.commands.contains(funcSplitStatus)) if (rigCaps->commands.contains(funcSplitStatus))
queue->add(priorityHigh,funcSplitStatus,false); queue->add(priorityHigh,funcSplitStatus,false);
if(rigCaps.commands.contains(funcTuningStep)) if(rigCaps->commands.contains(funcTuningStep))
queue->add(priorityImmediate,funcTuningStep,false); queue->add(priorityImmediate,funcTuningStep,false);
if(rigCaps.commands.contains(funcRepeaterTone)) if(rigCaps->commands.contains(funcRepeaterTone))
{ {
queue->add(priorityImmediate,funcRepeaterTone,false); queue->add(priorityImmediate,funcRepeaterTone,false);
queue->add(priorityImmediate,funcRepeaterTSQL,false); queue->add(priorityImmediate,funcRepeaterTSQL,false);
} }
if(rigCaps.commands.contains(funcRepeaterDTCS)) if(rigCaps->commands.contains(funcRepeaterDTCS))
queue->add(priorityImmediate,funcRepeaterDTCS,false); queue->add(priorityImmediate,funcRepeaterDTCS,false);
if(rigCaps.commands.contains(funcToneSquelchType)) if(rigCaps->commands.contains(funcToneSquelchType))
queue->add(priorityImmediate,funcToneSquelchType,false); queue->add(priorityImmediate,funcToneSquelchType,false);
if(rigCaps.commands.contains(funcAntenna)) if(rigCaps->commands.contains(funcAntenna))
queue->add(priorityImmediate,funcAntenna,false); queue->add(priorityImmediate,funcAntenna,false);
if(rigCaps.commands.contains(funcAttenuator)) if(rigCaps->commands.contains(funcAttenuator))
queue->add(priorityImmediate,funcAttenuator,false); queue->add(priorityImmediate,funcAttenuator,false);
if(rigCaps.commands.contains(funcPreamp)) if(rigCaps->commands.contains(funcPreamp))
queue->add(priorityImmediate,funcPreamp,false); queue->add(priorityImmediate,funcPreamp,false);
if (rigCaps.commands.contains(funcRitStatus)) if (rigCaps->commands.contains(funcRitStatus))
{ {
queue->add(priorityImmediate,funcRITFreq,false); queue->add(priorityImmediate,funcRITFreq,false);
queue->add(priorityImmediate,funcRitStatus,false); queue->add(priorityImmediate,funcRitStatus,false);
} }
if(rigCaps.commands.contains(funcIFShift)) if(rigCaps->commands.contains(funcIFShift))
queue->add(priorityImmediate,funcIFShift,false); queue->add(priorityImmediate,funcIFShift,false);
if(rigCaps.commands.contains(funcPBTInner) && rigCaps.commands.contains(funcPBTOuter)) if(rigCaps->commands.contains(funcPBTInner) && rigCaps->commands.contains(funcPBTOuter))
{ {
queue->add(priorityImmediate,funcPBTInner,false); queue->add(priorityImmediate,funcPBTInner,false);
queue->add(priorityImmediate,funcPBTOuter,false); queue->add(priorityImmediate,funcPBTOuter,false);
} }
if(rigCaps.commands.contains(funcTunerStatus)) if(rigCaps->commands.contains(funcTunerStatus))
queue->add(priorityImmediate,funcTunerStatus,false); queue->add(priorityImmediate,funcTunerStatus,false);
*/ */
@ -3791,223 +3775,6 @@ void wfmain::setDefaultColors(int presetNumber)
//ui->colorPresetCombo->setItemText(presetNumber, *(p->presetName)); //ui->colorPresetCombo->setItemText(presetNumber, *(p->presetName));
} }
void wfmain::receiveRigID(rigCapabilities rigCaps)
{
// We have heard from the rig, so if the connection is pending, stop the timer immediately
ConnectionTimer.stop();
// Note: We intentionally request rigID several times
// because without rigID, we can't do anything with the waterfall.
bandbtns->acceptRigCaps(rigCaps);
if(haveRigCaps)
{
// Note: This line makes it difficult to accept a different radio connecting.
return;
} else {
showStatusBarText(QString("Found radio at address 0x%1 of name %2 and model ID %3.").arg(rigCaps.civ,2,16).arg(rigCaps.modelName).arg(rigCaps.modelID));
qDebug(logSystem()) << "Rig name: " << rigCaps.modelName;
qDebug(logSystem()) << "Has LAN capabilities: " << rigCaps.hasLan;
qDebug(logSystem()) << "Rig ID received into wfmain: spectLenMax: " << rigCaps.spectLenMax;
qDebug(logSystem()) << "Rig ID received into wfmain: spectAmpMax: " << rigCaps.spectAmpMax;
qDebug(logSystem()) << "Rig ID received into wfmain: spectSeqMax: " << rigCaps.spectSeqMax;
qDebug(logSystem()) << "Rig ID received into wfmain: hasSpectrum: " << rigCaps.hasSpectrum;
this->rigCaps = rigCaps;
configureVFOs(); // Now we have a rig connection, need to configure the VFOs
rigName->setText(rigCaps.modelName);
if (serverConfig.enabled) {
serverConfig.rigs.first()->modelName = rigCaps.modelName;
serverConfig.rigs.first()->rigName = rigCaps.modelName;
serverConfig.rigs.first()->civAddr = rigCaps.civ;
serverConfig.rigs.first()->baudRate = rigCaps.baudRate;
}
setWindowTitle(rigCaps.modelName);
if(rigCaps.hasSpectrum)
{
foreach (auto vfo, vfos)
{
vfo->prepareScope(rigCaps.spectAmpMax, rigCaps.spectLenMax);
}
}
haveRigCaps = true;
if (rigCaps.bands.size() > 0) {
lastRequestedBand = rigCaps.bands[0].band;
}
// Added so that server receives rig capabilities.
emit sendRigCaps(rigCaps);
rpt->setRig(rigCaps);
trxadj->setRig(rigCaps);
foreach (auto vfo, vfos) {
// Setup various combo box up for each VFO:
vfo->clearMode();
for (auto &m: rigCaps.modes)
{
//ui->modeSelectCombo->addItem(m.name, m.mk);
vfo->addMode("Mode "+m.name,QVariant::fromValue(m));
}
vfo->clearFilter();
for (auto& f: rigCaps.filters)
{
vfo->addFilter(f.name,f.num);
}
vfo->clearData();
vfo->addData("Data Off",0);
if (rigCaps.commands.contains(funcDATA1Mod))
{
setupui->updateModSourceList(1, rigCaps.inputs);
if (!rigCaps.commands.contains(funcDATA2Mod))
{
vfo->addData("Data On", 2);
}
}
if (rigCaps.commands.contains(funcDATA2Mod))
{
setupui->updateModSourceList(2, rigCaps.inputs);
vfo->addData("Data 1", 2);
vfo->addData("Data 2", 2);
}
if (rigCaps.commands.contains(funcDATA3Mod))
{
setupui->updateModSourceList(3, rigCaps.inputs);
vfo->addData("Data 3", 3);
}
vfo->clearSpans();
if(rigCaps.hasSpectrum)
{
for(unsigned int i=0; i < rigCaps.scopeCenterSpans.size(); i++)
{
vfo->addSpan(rigCaps.scopeCenterSpans.at(i).name, QVariant::fromValue(rigCaps.scopeCenterSpans.at(i)));
}
vfo->setRange(prefs.mainPlotFloor, prefs.mainPlotCeiling);
}
}
// Set the tuning step combo box up:
ui->tuningStepCombo->blockSignals(true);
ui->tuningStepCombo->clear();
for (auto &s: rigCaps.steps)
{
ui->tuningStepCombo->addItem(s.name, s.hz);
}
ui->tuningStepCombo->setCurrentIndex(2);
ui->tuningStepCombo->blockSignals(false);
setupui->updateModSourceList(0, rigCaps.inputs);
ui->attSelCombo->clear();
if(rigCaps.commands.contains(funcAttenuator))
{
ui->attSelCombo->setDisabled(false);
for (auto &att: rigCaps.attenuators)
{
ui->attSelCombo->addItem(((att == 0) ? QString("0 dB") : QString("-%1 dB").arg(att)),att);
}
} else {
ui->attSelCombo->setDisabled(true);
}
ui->preampSelCombo->clear();
if(rigCaps.commands.contains(funcPreamp))
{
ui->preampSelCombo->setDisabled(false);
for (auto &pre: rigCaps.preamps)
{
ui->preampSelCombo->addItem(pre.name, pre.num);
}
} else {
ui->preampSelCombo->setDisabled(true);
}
ui->antennaSelCombo->clear();
if(rigCaps.commands.contains(funcAntenna))
{
ui->antennaSelCombo->setDisabled(false);
for (auto &ant: rigCaps.antennas)
{
ui->antennaSelCombo->addItem(ant.name,ant.num);
}
} else {
ui->antennaSelCombo->setDisabled(true);
}
ui->rxAntennaCheck->setEnabled(rigCaps.commands.contains(funcRXAntenna));
ui->rxAntennaCheck->setChecked(false);
//ui->scopeBWCombo->blockSignals(true);
//ui->scopeBWCombo->clear();
ui->tuneEnableChk->setEnabled(rigCaps.commands.contains(funcTunerStatus));
ui->tuneNowBtn->setEnabled(rigCaps.commands.contains(funcTunerStatus));
ui->memoriesBtn->setEnabled(rigCaps.commands.contains(funcMemoryContents));
//ui->useRTSforPTTchk->setChecked(prefs.forceRTSasPTT);
// ui->audioSystemCombo->setEnabled(false);
//ui->audioSystemServerCombo->setEnabled(false);
ui->connectBtn->setText("Disconnect from Radio"); // We must be connected now.
connStatus = connConnected;
if(usingLAN)
{
ui->afGainSlider->setValue(prefs.localAFgain);
emit sendLevel(funcAfGain,prefs.localAFgain);
}
// Adding these here because clearly at this point we have valid
// rig comms. In the future, we should establish comms and then
// do all the initial grabs. For now, this hack of adding them here and there:
// recalculate command timing now that we know the rig better:
if(prefs.polling_ms != 0)
{
changePollTiming(prefs.polling_ms, true);
} else {
calculateTimingParameters();
}
// Set the second meter here as I suspect we need to be connected for it to work?
changeMeterType(prefs.meter2Type, 2);
changeMeterType(prefs.meter3Type, 3);
ui->meter2Widget->blockMeterType(prefs.meter3Type);
ui->meter3Widget->blockMeterType(prefs.meter2Type);
ui->meter2Widget->setCompReverse(prefs.compMeterReverse);
ui->meter3Widget->setCompReverse(prefs.compMeterReverse);
// for (int i = 0; i < ui->meter2selectionCombo->count(); i++)
// {
// if (static_cast<meter_t>(ui->meter2selectionCombo->itemData(i).toInt()) == prefs.meter2Type)
// {
// // I thought that setCurrentIndex() would call the activated() function for the combobox
// // but it doesn't, so call it manually.
// //ui->meter2selectionCombo->setCurrentIndex(i);
// changeMeter2Type(i);
// }
// }
}
}
void wfmain::initPeriodicCommands() void wfmain::initPeriodicCommands()
{ {
// This function places periodic polling commands into the queue. // This function places periodic polling commands into the queue.
@ -4017,9 +3784,9 @@ void wfmain::initPeriodicCommands()
queue->clear(); queue->clear();
foreach (auto cap, rigCaps.periodic) { foreach (auto cap, rigCaps->periodic) {
if (cap.vfo == -1) { if (cap.vfo == -1) {
for (uchar v=0;v<rigCaps.numVFO;v++) for (uchar v=0;v<rigCaps->numVFO;v++)
{ {
qDebug(logSystem()) << "Inserting command" << funcString[cap.func] << "priority" << cap.priority << "on VFO" << QString::number(v); qDebug(logSystem()) << "Inserting command" << funcString[cap.func] << "priority" << cap.priority << "on VFO" << QString::number(v);
queue->add(queuePriority(cap.prioVal),cap.func,true,v); queue->add(queuePriority(cap.prioVal),cap.func,true,v);
@ -4034,11 +3801,11 @@ void wfmain::initPeriodicCommands()
/* /*
queue->add(priorityMedium,funcSelectedFreq,true,false); queue->add(priorityMedium,funcSelectedFreq,true,false);
queue->add(priorityMedium,funcSelectedMode,true,false); queue->add(priorityMedium,funcSelectedMode,true,false);
//queue->add(priorityMedium,(rigCaps.commands.contains(funcSelectedMode)?funcNone:funcDataModeWithFilter),true,false); //queue->add(priorityMedium,(rigCaps->commands.contains(funcSelectedMode)?funcNone:funcDataModeWithFilter),true,false);
queue->add(priorityMedium,funcUnselectedFreq,true,true); queue->add(priorityMedium,funcUnselectedFreq,true,true);
queue->add(priorityMedium,funcUnselectedMode,true,true); queue->add(priorityMedium,funcUnselectedMode,true,true);
if (rigCaps.hasSpectrum) if (rigCaps->hasSpectrum)
{ {
queue->add(priorityHigh,funcOverflowStatus,true,false); queue->add(priorityHigh,funcOverflowStatus,true,false);
queue->add(priorityMediumHigh,funcScopeMainMode,true,false); queue->add(priorityMediumHigh,funcScopeMainMode,true,false);
@ -4054,7 +3821,7 @@ void wfmain::initPeriodicCommands()
queue->add(priorityMedium,funcVFODualWatch,true,false); queue->add(priorityMedium,funcVFODualWatch,true,false);
} }
if(rigCaps.hasTransmit) { if(rigCaps->hasTransmit) {
queue->add(priorityHigh,funcTransceiverStatus,true,false); queue->add(priorityHigh,funcTransceiverStatus,true,false);
queue->add(priorityMediumHigh,funcDATAOffMod,true,false); queue->add(priorityMediumHigh,funcDATAOffMod,true,false);
queue->add(priorityMediumHigh,funcDATA1Mod,true,false); queue->add(priorityMediumHigh,funcDATA1Mod,true,false);
@ -4189,7 +3956,7 @@ void wfmain::changeMode(rigMode_t mode)
void wfmain::changeMode(rigMode_t mode, unsigned char data) void wfmain::changeMode(rigMode_t mode, unsigned char data)
{ {
for (modeInfo &mi: rigCaps.modes) for (modeInfo &mi: rigCaps->modes)
{ {
if (mi.mk == mode) if (mi.mk == mode)
{ {
@ -4199,8 +3966,8 @@ void wfmain::changeMode(rigMode_t mode, unsigned char data)
m.VFO=selVFO_t::activeVFO; m.VFO=selVFO_t::activeVFO;
if((m.mk != currentModeInfo.mk) && prefs.automaticSidebandSwitching) if((m.mk != currentModeInfo.mk) && prefs.automaticSidebandSwitching)
{ {
queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedMode)?funcSelectedMode:funcModeGet),QVariant::fromValue<modeInfo>(m),false)); queue->add(priorityImmediate,queueItem((rigCaps->commands.contains(funcSelectedMode)?funcSelectedMode:funcModeGet),QVariant::fromValue<modeInfo>(m),false));
if (!rigCaps.commands.contains(funcSelectedMode)) if (!rigCaps->commands.contains(funcSelectedMode))
queue->add(priorityImmediate,queueItem(funcDataModeWithFilter,QVariant::fromValue<modeInfo>(m),false)); queue->add(priorityImmediate,queueItem(funcDataModeWithFilter,QVariant::fromValue<modeInfo>(m),false));
} }
usingDataMode = data; usingDataMode = data;
@ -4208,7 +3975,7 @@ void wfmain::changeMode(rigMode_t mode, unsigned char data)
} }
} }
queue->add(priorityImmediate,(rigCaps.commands.contains(funcSelectedMode)?funcSelectedMode:funcModeGet),false); queue->add(priorityImmediate,(rigCaps->commands.contains(funcSelectedMode)?funcSelectedMode:funcModeGet),false);
} }
void wfmain::on_freqDial_valueChanged(int value) void wfmain::on_freqDial_valueChanged(int value)
@ -4361,7 +4128,6 @@ void wfmain::on_monitorLabel_linkActivated(const QString&)
void wfmain::receiveIFShift(unsigned char level) void wfmain::receiveIFShift(unsigned char level)
{ {
trxadj->updateIFShift(level);
emit sendLevel(funcIFShift,level); emit sendLevel(funcIFShift,level);
} }
@ -4703,7 +4469,7 @@ void wfmain::receiveTuningStep(unsigned char step)
{ {
if (step > 0) if (step > 0)
{ {
for (auto &s: rigCaps.steps) for (auto &s: rigCaps->steps)
{ {
if (step == s.num && ui->tuningStepCombo->currentData().toUInt() != s.hz) { if (step == s.num && ui->tuningStepCombo->currentData().toUInt() != s.hz) {
qInfo(logSystem()) << QString("Received new Tuning Step %0").arg(s.name); qInfo(logSystem()) << QString("Received new Tuning Step %0").arg(s.name);
@ -4926,7 +4692,7 @@ void wfmain::calculateTimingParameters()
if(msMinTiming < 25) if(msMinTiming < 25)
msMinTiming = 25; msMinTiming = 25;
if(haveRigCaps && rigCaps.hasFDcomms) if(rigCaps != Q_NULLPTR && rigCaps->hasFDcomms)
{ {
delayedCommand->setInterval( msMinTiming); // 20 byte message delayedCommand->setInterval( msMinTiming); // 20 byte message
queue->interval(msMinTiming); queue->interval(msMinTiming);
@ -5159,10 +4925,10 @@ void wfmain::enableRigCtl(bool enabled)
// Start rigctld // Start rigctld
rigCtl = new rigCtlD(this); rigCtl = new rigCtlD(this);
rigCtl->startServer(prefs.rigCtlPort); rigCtl->startServer(prefs.rigCtlPort);
if (rig != Q_NULLPTR) { //if (rig != Q_NULLPTR) {
// We are already connected to a rig. // // We are already connected to a rig.
emit sendRigCaps(rigCaps); // emit sendRigCaps(rigCaps);
} //}
} }
} }
@ -5387,7 +5153,7 @@ void wfmain::connectionHandler(bool connect)
{ {
queue->clear(); queue->clear();
emit sendCloseComm(); emit sendCloseComm();
haveRigCaps = false;
rigName->setText("NONE"); rigName->setText("NONE");
connStatus = connDisconnected; connStatus = connDisconnected;
@ -5432,10 +5198,10 @@ void wfmain::on_cwButton_clicked()
void wfmain::on_memoriesBtn_clicked() void wfmain::on_memoriesBtn_clicked()
{ {
if (haveRigCaps) { if (rigCaps != Q_NULLPTR) {
if (memWindow == Q_NULLPTR) { if (memWindow == Q_NULLPTR) {
// Add slowload option for background loading. // Add slowload option for background loading.
memWindow = new memories(rigCaps,false); memWindow = new memories(false);
this->memWindow->connect(this, SIGNAL(haveMemory(memoryType)), memWindow, SLOT(receiveMemory(memoryType))); this->memWindow->connect(this, SIGNAL(haveMemory(memoryType)), memWindow, SLOT(receiveMemory(memoryType)));
this->memWindow->connect(this->memWindow, &memories::getMemory, rig,[=](const quint32 &mem) { this->memWindow->connect(this->memWindow, &memories::getMemory, rig,[=](const quint32 &mem) {
@ -5768,13 +5534,13 @@ void wfmain::receiveValue(cacheItem val){
queue->add(priorityImmediate,queueItem(funcSelectedFreq,QVariant::fromValue<freqt>(bsr.freq),false)); queue->add(priorityImmediate,queueItem(funcSelectedFreq,QVariant::fromValue<freqt>(bsr.freq),false));
for (auto &md: rigCaps.modes) for (auto &md: rigCaps->modes)
{ {
if (md.reg == bsr.mode) { if (md.reg == bsr.mode) {
md.filter=bsr.filter; md.filter=bsr.filter;
md.data=bsr.data; md.data=bsr.data;
queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedMode)?funcSelectedMode:funcModeSet),QVariant::fromValue<modeInfo>(md),false)); queue->add(priorityImmediate,queueItem((rigCaps->commands.contains(funcSelectedMode)?funcSelectedMode:funcModeSet),QVariant::fromValue<modeInfo>(md),false));
queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedMode)?funcNone:funcDataModeWithFilter),QVariant::fromValue<modeInfo>(md),false)); queue->add(priorityImmediate,queueItem((rigCaps->commands.contains(funcSelectedMode)?funcNone:funcDataModeWithFilter),QVariant::fromValue<modeInfo>(md),false));
break; break;
} }
@ -6085,6 +5851,205 @@ void wfmain::receiveElapsed(bool sub, qint64 us)
mainElapsed = us; mainElapsed = us;
} }
void wfmain::receiveRigCaps(rigCapabilities* caps)
{
this->rigCaps = caps;
// Convenient place to stop the connection timer as rigCaps has changed.
ConnectionTimer.stop();
//bandbtns->acceptRigCaps(rigCaps);
if(caps == Q_NULLPTR)
{
// Note: This line makes it difficult to accept a different radio connecting.
return;
} else {
showStatusBarText(QString("Found radio at address 0x%1 of name %2 and model ID %3.").arg(rigCaps->civ,2,16).arg(rigCaps->modelName).arg(rigCaps->modelID));
qDebug(logSystem()) << "Rig name: " << rigCaps->modelName;
qDebug(logSystem()) << "Has LAN capabilities: " << rigCaps->hasLan;
qDebug(logSystem()) << "Rig ID received into wfmain: spectLenMax: " << rigCaps->spectLenMax;
qDebug(logSystem()) << "Rig ID received into wfmain: spectAmpMax: " << rigCaps->spectAmpMax;
qDebug(logSystem()) << "Rig ID received into wfmain: spectSeqMax: " << rigCaps->spectSeqMax;
qDebug(logSystem()) << "Rig ID received into wfmain: hasSpectrum: " << rigCaps->hasSpectrum;
configureVFOs(); // Now we have a rig connection, need to configure the VFOs
rigName->setText(rigCaps->modelName);
if (serverConfig.enabled) {
serverConfig.rigs.first()->modelName = rigCaps->modelName;
serverConfig.rigs.first()->rigName = rigCaps->modelName;
serverConfig.rigs.first()->civAddr = rigCaps->civ;
serverConfig.rigs.first()->baudRate = rigCaps->baudRate;
}
setWindowTitle(rigCaps->modelName);
if(rigCaps->hasSpectrum)
{
foreach (auto vfo, vfos)
{
vfo->prepareScope(rigCaps->spectAmpMax, rigCaps->spectLenMax);
}
}
if (rigCaps->bands.size() > 0) {
lastRequestedBand = rigCaps->bands[0].band;
}
// Added so that server receives rig capabilities.
//emit sendRigCaps(rigCaps);
//rpt->setRig(rigCaps);
foreach (auto vfo, vfos) {
// Setup various combo box up for each VFO:
vfo->clearMode();
for (auto &m: rigCaps->modes)
{
//ui->modeSelectCombo->addItem(m.name, m.mk);
vfo->addMode("Mode "+m.name,QVariant::fromValue(m));
}
vfo->clearFilter();
for (auto& f: rigCaps->filters)
{
vfo->addFilter(f.name,f.num);
}
vfo->clearData();
vfo->addData("Data Off",0);
if (rigCaps->commands.contains(funcDATA1Mod))
{
setupui->updateModSourceList(1, rigCaps->inputs);
if (!rigCaps->commands.contains(funcDATA2Mod))
{
vfo->addData("Data On", 2);
}
}
if (rigCaps->commands.contains(funcDATA2Mod))
{
setupui->updateModSourceList(2, rigCaps->inputs);
vfo->addData("Data 1", 2);
vfo->addData("Data 2", 2);
}
if (rigCaps->commands.contains(funcDATA3Mod))
{
setupui->updateModSourceList(3, rigCaps->inputs);
vfo->addData("Data 3", 3);
}
vfo->clearSpans();
if(rigCaps->hasSpectrum)
{
for(unsigned int i=0; i < rigCaps->scopeCenterSpans.size(); i++)
{
vfo->addSpan(rigCaps->scopeCenterSpans.at(i).name, QVariant::fromValue(rigCaps->scopeCenterSpans.at(i)));
}
vfo->setRange(prefs.mainPlotFloor, prefs.mainPlotCeiling);
}
}
// Set the tuning step combo box up:
ui->tuningStepCombo->blockSignals(true);
ui->tuningStepCombo->clear();
for (auto &s: rigCaps->steps)
{
ui->tuningStepCombo->addItem(s.name, s.hz);
}
ui->tuningStepCombo->setCurrentIndex(2);
ui->tuningStepCombo->blockSignals(false);
setupui->updateModSourceList(0, rigCaps->inputs);
ui->attSelCombo->clear();
if(rigCaps->commands.contains(funcAttenuator))
{
ui->attSelCombo->setDisabled(false);
for (auto &att: rigCaps->attenuators)
{
ui->attSelCombo->addItem(((att == 0) ? QString("0 dB") : QString("-%1 dB").arg(att)),att);
}
} else {
ui->attSelCombo->setDisabled(true);
}
ui->preampSelCombo->clear();
if(rigCaps->commands.contains(funcPreamp))
{
ui->preampSelCombo->setDisabled(false);
for (auto &pre: rigCaps->preamps)
{
ui->preampSelCombo->addItem(pre.name, pre.num);
}
} else {
ui->preampSelCombo->setDisabled(true);
}
ui->antennaSelCombo->clear();
if(rigCaps->commands.contains(funcAntenna))
{
ui->antennaSelCombo->setDisabled(false);
for (auto &ant: rigCaps->antennas)
{
ui->antennaSelCombo->addItem(ant.name,ant.num);
}
} else {
ui->antennaSelCombo->setDisabled(true);
}
ui->rxAntennaCheck->setEnabled(rigCaps->commands.contains(funcRXAntenna));
ui->rxAntennaCheck->setChecked(false);
//ui->scopeBWCombo->blockSignals(true);
//ui->scopeBWCombo->clear();
ui->tuneEnableChk->setEnabled(rigCaps->commands.contains(funcTunerStatus));
ui->tuneNowBtn->setEnabled(rigCaps->commands.contains(funcTunerStatus));
ui->memoriesBtn->setEnabled(rigCaps->commands.contains(funcMemoryContents));
//ui->useRTSforPTTchk->setChecked(prefs.forceRTSasPTT);
// ui->audioSystemCombo->setEnabled(false);
//ui->audioSystemServerCombo->setEnabled(false);
ui->connectBtn->setText("Disconnect from Radio"); // We must be connected now.
connStatus = connConnected;
if(usingLAN)
{
ui->afGainSlider->setValue(prefs.localAFgain);
emit sendLevel(funcAfGain,prefs.localAFgain);
}
// Adding these here because clearly at this point we have valid
// rig comms. In the future, we should establish comms and then
// do all the initial grabs. For now, this hack of adding them here and there:
// recalculate command timing now that we know the rig better:
if(prefs.polling_ms != 0)
{
changePollTiming(prefs.polling_ms, true);
} else {
calculateTimingParameters();
}
// Set the second meter here as I suspect we need to be connected for it to work?
changeMeterType(prefs.meter2Type, 2);
changeMeterType(prefs.meter3Type, 3);
ui->meter2Widget->blockMeterType(prefs.meter3Type);
ui->meter3Widget->blockMeterType(prefs.meter2Type);
ui->meter2Widget->setCompReverse(prefs.compMeterReverse);
ui->meter3Widget->setCompReverse(prefs.compMeterReverse);
}
initPeriodicCommands();
getInitialRigState();
}
/* USB Hotplug support added at the end of the file for convenience */ /* USB Hotplug support added at the end of the file for convenience */
#ifdef USB_HOTPLUG #ifdef USB_HOTPLUG

Wyświetl plik

@ -35,7 +35,7 @@
#include "calibrationwindow.h" #include "calibrationwindow.h"
#include "repeatersetup.h" #include "repeatersetup.h"
#include "satellitesetup.h" #include "satellitesetup.h"
#include "transceiveradjustments.h" //#include "transceiveradjustments.h"
#include "cwsender.h" #include "cwsender.h"
#include "bandbuttons.h" #include "bandbuttons.h"
#include "frequencyinputwidget.h" #include "frequencyinputwidget.h"
@ -406,8 +406,7 @@ private slots:
void receivePreamp(unsigned char pre, uchar vfo); void receivePreamp(unsigned char pre, uchar vfo);
void receiveAttenuator(unsigned char att, uchar vfo); void receiveAttenuator(unsigned char att, uchar vfo);
void receiveAntennaSel(unsigned char ant, bool rx,uchar vfo); void receiveAntennaSel(unsigned char ant, bool rx,uchar vfo);
void receiveRigID(rigCapabilities rigCaps);
void receiveFoundRigID(rigCapabilities rigCaps);
void receivePortError(errorType err); void receivePortError(errorType err);
void receiveStatusUpdate(networkStatus status); void receiveStatusUpdate(networkStatus status);
void receiveNetworkAudioLevels(networkAudioLevels l); void receiveNetworkAudioLevels(networkAudioLevels l);
@ -498,6 +497,8 @@ private slots:
void receiveElapsed(bool sub, qint64 us); void receiveElapsed(bool sub, qint64 us);
void connectionTimeout(); void connectionTimeout();
void receiveRigCaps(rigCapabilities* caps);
private: private:
Ui::wfmain *ui; // Main UI Ui::wfmain *ui; // Main UI
@ -712,7 +713,7 @@ private:
int oldFreqDialVal; int oldFreqDialVal;
QHash<unsigned char,QString> rigList; QHash<unsigned char,QString> rigList;
rigCapabilities rigCaps; rigCapabilities* rigCaps = Q_NULLPTR;
rigInput currentModSrc[4]; rigInput currentModSrc[4];
@ -728,7 +729,7 @@ private:
calibrationWindow *cal = Q_NULLPTR; calibrationWindow *cal = Q_NULLPTR;
repeaterSetup *rpt = Q_NULLPTR; repeaterSetup *rpt = Q_NULLPTR;
satelliteSetup *sat = Q_NULLPTR; satelliteSetup *sat = Q_NULLPTR;
transceiverAdjustments *trxadj = Q_NULLPTR; //transceiverAdjustments *trxadj = Q_NULLPTR;
cwSender *cw = Q_NULLPTR; cwSender *cw = Q_NULLPTR;
controllerSetup* usbWindow = Q_NULLPTR; controllerSetup* usbWindow = Q_NULLPTR;
aboutbox *abtBox = Q_NULLPTR; aboutbox *abtBox = Q_NULLPTR;

Wyświetl plik

@ -287,7 +287,7 @@ SOURCES += main.cpp\
rigctld.cpp \ rigctld.cpp \
usbcontroller.cpp \ usbcontroller.cpp \
controllersetup.cpp \ controllersetup.cpp \
transceiveradjustments.cpp \ # transceiveradjustments.cpp \
selectradio.cpp \ selectradio.cpp \
tcpserver.cpp \ tcpserver.cpp \
cluster.cpp \ cluster.cpp \
@ -345,7 +345,7 @@ HEADERS += wfmain.h \
ulaw.h \ ulaw.h \
usbcontroller.h \ usbcontroller.h \
controllersetup.h \ controllersetup.h \
transceiveradjustments.h \ # transceiveradjustments.h \
audiotaper.h \ audiotaper.h \
selectradio.h \ selectradio.h \
tcpserver.h \ tcpserver.h \
@ -368,7 +368,7 @@ FORMS += wfmain.ui \
selectradio.ui \ selectradio.ui \
repeatersetup.ui \ repeatersetup.ui \
settingswidget.ui \ settingswidget.ui \
transceiveradjustments.ui \ # transceiveradjustments.ui \
controllersetup.ui \ controllersetup.ui \
aboutbox.ui aboutbox.ui