Initial work on 8600 memories

translations
Phil Taylor 2024-11-01 11:33:55 +00:00
rodzic 87bb43c726
commit 3dc4fe53a1
5 zmienionych plików z 356 dodań i 88 usunięć

Wyświetl plik

@ -92,8 +92,8 @@ void cachingQueue::run()
it--;
auto item = it.value();
emit haveCommand(item.command,item.param,item.receiver);
//it=queue.erase(it);
queue.remove(prio,it.value());
it=queue.erase(it);
//queue.remove(prio,it.value()); // Will remove ALL matching commands which breaks some things (memory bulk write)
if (item.recurring && prio != priorityImmediate) {
queue.insert(prio,item);
}

Wyświetl plik

@ -1510,7 +1510,7 @@ void icomCommander::determineRigCaps()
// Setup memory formats.
static QRegularExpression memFmtEx("%(?<flags>[-+#0])?(?<pos>\\d+|\\*)?(?:\\.(?<width>\\d+|\\*))?(?<spec>[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ])");
static QRegularExpression memFmtEx("%(?<flags>[-+#0])?(?<pos>\\d+|\\*)?(?:\\.(?<width>\\d+|\\*))?(?<spec>[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+])");
QRegularExpressionMatchIterator i = memFmtEx.globalMatch(rigCaps.memFormat);
while (i.hasNext()) {
QRegularExpressionMatch qmatch = i.next();
@ -2129,7 +2129,7 @@ bool icomCommander::parseMemory(QVector<memParserFormat>* memParser, memoryType*
payloadIn.insert(0,"**");
for (auto &parse: *memParser) {
// non-existant memory is short so send what we have so far.
if (payloadIn.size() < (parse.pos+1+parse.len)) {
if (payloadIn.size() < (parse.pos+1+parse.len) && parse.spec != 'Z') {
return true;
}
QByteArray data = payloadIn.mid(parse.pos+1,parse.len);
@ -2151,10 +2151,17 @@ bool icomCommander::parseMemory(QVector<memParserFormat>* memParser, memoryType*
case 'c':
mem->scan = data[0];
break;
case 'C':
mem->skip = data[0] >> 4 & 0xf;
mem->scan = data[0] & 0xf;
break;
case 'd': // combined split and scan
mem->split = quint8(data[0] >> 4 & 0x0f);
mem->scan = quint8(data[0] & 0x0f);
break;
case 'D': // duplex only (used for IC-R8600)
mem->duplex = quint8(data[0] & 0x0f);
break;
case 'e':
mem->vfo=data[0];
break;
@ -2263,15 +2270,33 @@ bool icomCommander::parseMemory(QVector<memParserFormat>* memParser, memoryType*
break;
case 'v':
memcpy(mem->R2,data.data(),qMin(int(sizeof mem->R2),data.size()));
break;
break;
case 'V':
memcpy(mem->R2B,data.data(),qMin(int(sizeof mem->R2B),data.size()));
break;
case 'w': // Tuning step
if (bool(data[0])) { // Only set if enabled.
mem->tuningStep = quint8(data[1]);
mem->progTs = bcdHexToUInt(data[2],data[3]);
}
break;
case 'x': // Attenuator & Preamp
mem->atten = bcdHexToUChar(data[0]);
mem->preamp = bcdHexToUChar(data[1]);
break;
case 'y': // Antenna
mem->antenna = bcdHexToUChar(data[0]);
break;
case '+': // IP Plus
mem->ipplus=bool(data[0] & 0x0f);
break;
case 'z':
if (mem->scan == 0xfe)
mem->scan = 0;
memcpy(mem->name,data.data(),qMin(int(sizeof mem->name),data.size()));
break;
case 'Z': // Special mode dependant features (I have no idea how to make these work!)
break;
default:
qInfo() << "Parser didn't match!" << "spec:" << parse.spec << "pos:" << parse.pos << "len" << parse.len;
break;
@ -2391,7 +2416,7 @@ void icomCommander::receiveCommand(funcs func, QVariant value, uchar receiver)
if (func == funcMemoryContents || func == funcMemoryClear || func == funcMemoryWrite || func == funcMemoryMode)
{
// Strip out group number from memory for validation purposes.
qInfo(logRig()) << "Memory Command" << funcString[func] << "with valuetype " << QString(value.typeName());
qDebug(logRig()) << "Memory Command" << funcString[func] << "with valuetype " << QString(value.typeName());
val = val & 0xffff;
}
}
@ -2541,8 +2566,8 @@ void icomCommander::receiveCommand(funcs func, QVariant value, uchar receiver)
}
else if (!strcmp(value.typeName(),"uint") && (func == funcMemoryContents || func == funcMemoryMode))
{
qInfo(logRig()) << "Get Memory Contents" << (value.value<uint>() & 0xffff);
qInfo(logRig()) << "Get Memory Group (if exists)" << (value.value<uint>() >> 16 & 0xffff);
qDebug(logRig()) << "Get Memory Contents" << (value.value<uint>() & 0xffff);
qDebug(logRig()) << "Get Memory Group (if exists)" << (value.value<uint>() >> 16 & 0xffff);
// Format is different for all radios!
if (func == funcMemoryContents) {
for (auto &parse: rigCaps.memParser) {
@ -2604,9 +2629,22 @@ void icomCommander::receiveCommand(funcs func, QVariant value, uchar receiver)
payload.append(mem.scan);
}
break;
case 'C':
// Are we deleting the memory?
if (mem.del) {
payload.append(ffchar);
finished=true;
break;
} else {
payload.append(mem.scan);
}
break;
case 'd': // combined split and scan
payload.append(quint8((mem.split << 4 & 0xf0) | (mem.scan & 0x0f)));
break;
case 'D': // Duplex only
payload.append(mem.duplex);
break;
case 'e':
payload.append(mem.vfo);
break;
@ -2725,9 +2763,26 @@ void icomCommander::receiveCommand(funcs func, QVariant value, uchar receiver)
case 'V':
payload.append(QByteArray(mem.R2B).leftJustified(parse.len,' ',true));
break;
case 'w': // Tuning step
payload.append(quint8(mem.tuningStep!=0?true:false));
payload.append(quint8(mem.tuningStep));
payload.append(bcdEncodeInt(mem.progTs));
break;
case 'x': // Attenuator & Preamp
payload.append(bcdEncodeChar(mem.atten));
payload.append(bcdEncodeChar(mem.preamp));
break;
case 'y': // Antenna
payload.append(bcdEncodeChar(mem.antenna));
break;
case '+': // IP Plus
payload.append(bcdEncodeChar(mem.ipplus));
break;
case 'z':
payload.append(QByteArray(mem.name).leftJustified(parse.len,' ',true));
break;
case 'Z': // Special mode dependant features (I have no idea how to make these work!)
break;
default:
break;
}

Wyświetl plik

@ -33,19 +33,30 @@ memories::memories(bool isAdmin, bool slowLoad, QWidget *parent) :
progress->setRange(rigCaps->memStart,rigCaps->memories);
if (!rigCaps->commands.contains(funcScanning))
{
ui->scanButton->setVisible(false);
} else {
ui->scanButton->setCheckable(true);
}
QStringList headers;
/*
columnRecall=0, columnNum,columnSplit,columnScan,columnFrequency,columnMode,columnFilter,columnData,columnDuplex,columnToneMode,columnDSQL,columnTone,columnTSQL,columnDTCS,
columnDTCSPolarity,columnDVSquelch,columnOffset,columnUR,columnR1,columnR2,columnFrequencyB,columnModeB,columnFilterB,columnDataB,columnDuplexB,columnToneModeB, columnDSQLB
columnToneB,columnTSQLB,columnDTCSB,columnDTCSPolarityB,columnDVSquelchB,columnOffsetB,columnURB,columnR1B,columnR2B,columnName,
columnRecall=0, columnNum,columnSplit,columnSkip,columnScan,columnFrequency,columnMode,columnFilter,columnData,columnDuplex,columnToneMode,
columnTuningStep, columnCustomTuningStep, columnAttenuator, columnPreamplifier, columnAntenna, columnIPPlus,columnDSQL,columnTone,columnTSQL,columnDTCS,
columnDTCSPolarity,columnDVSquelch,columnOffset,columnUR,columnR1,columnR2,columnFrequencyB,columnModeB,columnFilterB,columnDataB,columnDuplexB,columnToneModeB,
columnTuningStepB, columnCustomTuningStepB, columnAttenuatorB, columnPreamplifierB, columnAntennaB, columnIPPlusB, columnDSQLB
columnToneB,columnTSQLB,columnDTCSB,columnDTCSPolarityB,columnDVSquelchB,columnOffsetB,columnURB,columnR1B,columnR2B,columnName,
*/
headers << "" << "Num" << "Name" << "Split" << "Scan" << "VFO" << "Freq" << "Mode" << "Filter" << "Data" <<"Duplex" << "Tn Mode" << "DSQL" << "Tone" << "TSQL" <<
"DTCS" << "DTCS Pol" << "DV Sql" << "Offset" << "UR" << "R1" << "R2" << "VFO B" << "Freq B" << "Mode B" << "Filter B" << "Data B" << "Duplex B" <<
"Tn Mode B" << "DSQL B" << "Tone B" << "TSQL B" << "DTCS B" << "DTCSP B" << "DV Sql B" << "Offset B" << "UR B" << "R1 B" << "R2 B";
headers << "" << "Num" << "Name" << "Split" << "Skip" << "Scan" << "VFO" << "Freq" << "Mode" << "Filter" << "Data" <<"Duplex" << "Tn Mode" <<
"Step" << "Prog Step" << "Atten" << "Preamp" << "Ant" << "IP Plus" << "DSQL" << "Tone" << "TSQL" << "DTCS" << "DTCS Pol" << "DV Sql" <<
"Offset" << "UR" << "R1" << "R2" << "VFO B" << "Freq B" << "Mode B" << "Filter B" << "Data B" << "Duplex B" << "Tn Mode B" << "Step B" <<
"Prog Step B" << "Atten B" << "Preamp B" << "Ant B" << "IP Plus B" << "DSQL B" << "Tone B" << "TSQL B" << "DTCS B" << "DTCSP B" <<
"DV Sql B" << "Offset B" << "UR B" << "R1 B" << "R2 B";
skip << "OFF" << "SKIP" << "PSKIP";
scan << "OFF" << "*1" << "*2" << "*3";
split << "OFF" << "ON";
@ -80,14 +91,37 @@ memories::memories(bool isAdmin, bool slowLoad, QWidget *parent) :
dtcsp << "BOTH N" << "N/R" << "R/N" << "BOTH R";
ipplus << "OFF" << "ON";
// We can populate the other comboboxes from RigCaps (ensuring they are valid)
tuningSteps << "None";
for (const auto &step: rigCaps->steps)
{
if (step.num)
{
tuningSteps.append(step.name);
}
}
for (const auto &atten: rigCaps->attenuators) {
attenuators.append(QString("%0").arg(atten));
}
for (const auto &preamp: rigCaps->preamps) {
preamps.append(preamp.name);
}
for (const auto &ant: rigCaps->antennas) {
antennas.append(ant.name);
}
ui->table->setHorizontalHeaderLabels(headers);
ui->group->hide();
ui->vfoMode->hide();
ui->memoryMode->hide();
ui->loadingMemories->setVisible(false);
ui->loadingMemories->setStyleSheet("QLabel {color: #ff0000}");
//ui->loadingMemories->setVisible(false);
//ui->loadingMemories->setStyleSheet("QLabel {color: #ff0000}");
ui->group->blockSignals(true);
ui->group->addItem("Memory Group",-1);
@ -208,11 +242,26 @@ void memories::rowAdded(int row)
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:
if (ui->table->item(row,columnSplit) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnSplit),split[0]);
if (ui->table->item(row,columnSkip) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnSkip),skip[0]);
if (ui->table->item(row,columnScan) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnScan),scan[0]);
if (ui->table->item(row,columnData) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnData),dataModes[0]);
if (ui->table->item(row,columnFilter) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnFilter),filters[0]);
if (ui->table->item(row,columnDuplex) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnDuplex),duplexModes[0]);
if (ui->table->item(row,columnToneMode) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnToneMode),toneModes[0]);
if (ui->table->item(row,columnTuningStep) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnTuningStep),tuningSteps[0]);
if (ui->table->item(row,columnCustomTuningStep) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnCustomTuningStep),"0.000");
if (ui->table->item(row,columnAttenuator) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnAttenuator),attenuators[0]);
if (ui->table->item(row,columnPreamplifier) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnPreamplifier),preamps[0]);
if (ui->table->item(row,columnAntenna) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnAntenna),antennas[0]);
if (ui->table->item(row,columnIPPlus) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnIPPlus),ipplus[0]);
/* columnTuningStep,
columnCustomTuningStep,
columnAttenuator,
columnPreamplifier,
columnAntenna,
columnIPPlus,
*/
if (ui->table->item(row,columnDSQL) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnDSQL),dsql[0]);
if (ui->table->item(row,columnTone) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnTone),tones[0]);
if (ui->table->item(row,columnTSQL) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnTSQL),tones[0]);
@ -226,6 +275,12 @@ void memories::rowAdded(int row)
if (ui->table->item(row,columnDataB) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnDataB),dataModes[0]);
if (ui->table->item(row,columnFilterB) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnFilterB),filters[0]);
if (ui->table->item(row,columnToneModeB) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnToneModeB),toneModes[0]);
if (ui->table->item(row,columnTuningStepB) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnTuningStepB),tuningSteps[0]);
if (ui->table->item(row,columnCustomTuningStepB) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnCustomTuningStepB),"0.000");
if (ui->table->item(row,columnAttenuatorB) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnAttenuatorB),attenuators[0]);
if (ui->table->item(row,columnPreamplifierB) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnPreamplifierB),preamps[0]);
if (ui->table->item(row,columnAntennaB) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnAntennaB),antennas[0]);
if (ui->table->item(row,columnIPPlusB) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnIPPlusB),ipplus[0]);
if (ui->table->item(row,columnDSQLB) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnDSQLB),dsql[0]);
if (ui->table->item(row,columnToneB) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnToneB),tones[0]);
if (ui->table->item(row,columnTSQLB) == NULL) ui->table->model()->setData(ui->table->model()->index(row,columnTSQLB),tones[0]);
@ -327,6 +382,10 @@ void memories::on_table_cellChanged(int row, int col)
currentMemory.split = split.indexOf(ui->table->item(row,columnSplit)->text().toUpper());
}
if (!ui->table->isColumnHidden(columnSkip) && ui->table->item(row,columnSkip) != NULL) {
currentMemory.skip = skip.indexOf(ui->table->item(row,columnSkip)->text().toUpper());
}
if (!ui->table->isColumnHidden(columnScan) && ui->table->item(row,columnScan) != NULL) {
currentMemory.scan = scan.indexOf(ui->table->item(row,columnScan)->text().toUpper());
}
@ -383,6 +442,54 @@ void memories::on_table_cellChanged(int row, int col)
currentMemory.tonemodeB = toneModes.indexOf(ui->table->item(row,columnToneModeB)->text().toUpper());
}
if (!ui->table->isColumnHidden(columnTuningStep) && ui->table->item(row,columnTuningStep) != NULL) {
currentMemory.tuningStep = tuningSteps.indexOf(ui->table->item(row,columnTuningStep)->text().toUpper());
}
if (!ui->table->isColumnHidden(columnTuningStepB) && ui->table->item(row,columnTuningStepB) != NULL) {
currentMemory.tuningStepB = tuningSteps.indexOf(ui->table->item(row,columnTuningStepB)->text().toUpper());
}
if (!ui->table->isColumnHidden(columnCustomTuningStep) && ui->table->item(row,columnCustomTuningStep) != NULL) {
currentMemory.progTs =(ui->table->item(row,columnCustomTuningStep) == NULL) ? 0 : int(ui->table->item(row,columnCustomTuningStep)->text().toUInt());
}
if (!ui->table->isColumnHidden(columnCustomTuningStepB) && ui->table->item(row,columnCustomTuningStepB) != NULL) {
currentMemory.progTsB =(ui->table->item(row,columnCustomTuningStepB) == NULL) ? 0 : int(ui->table->item(row,columnCustomTuningStepB)->text().toUInt());
}
if (!ui->table->isColumnHidden(columnAttenuator) && ui->table->item(row,columnAttenuator) != NULL) {
currentMemory.atten = (ui->table->item(row,columnAttenuator) == NULL) ? 0 : int(ui->table->item(row,columnAttenuator)->text().toUInt());
}
if (!ui->table->isColumnHidden(columnAttenuatorB) && ui->table->item(row,columnAttenuatorB) != NULL) {
currentMemory.attenB = (ui->table->item(row,columnAttenuatorB) == NULL) ? 0 : int(ui->table->item(row,columnAttenuatorB)->text().toUInt());
}
if (!ui->table->isColumnHidden(columnPreamplifier) && ui->table->item(row,columnPreamplifier) != NULL) {
currentMemory.preamp = preamps.indexOf(ui->table->item(row,columnPreamplifier)->text().toUpper());
}
if (!ui->table->isColumnHidden(columnPreamplifierB) && ui->table->item(row,columnPreamplifierB) != NULL) {
currentMemory.preampB = preamps.indexOf(ui->table->item(row,columnPreamplifierB)->text().toUpper());
}
if (!ui->table->isColumnHidden(columnAntenna) && ui->table->item(row,columnAntenna) != NULL) {
currentMemory.antenna = antennas.indexOf(ui->table->item(row,columnAntenna)->text().toUpper());
}
if (!ui->table->isColumnHidden(columnAntennaB) && ui->table->item(row,columnAntennaB) != NULL) {
currentMemory.antennaB = antennas.indexOf(ui->table->item(row,columnAntennaB)->text().toUpper());
}
if (!ui->table->isColumnHidden(columnIPPlus) && ui->table->item(row,columnIPPlus) != NULL) {
currentMemory.ipplus = ipplus.indexOf(ui->table->item(row,columnIPPlus)->text().toUpper());
}
if (!ui->table->isColumnHidden(columnIPPlusB) && ui->table->item(row,columnIPPlusB) != NULL) {
currentMemory.ipplusB = ipplus.indexOf(ui->table->item(row,columnIPPlusB)->text().toUpper());
}
if (!ui->table->isColumnHidden(columnDSQL) && ui->table->item(row,columnDSQL) != NULL) {
currentMemory.dsql = dsql.indexOf(ui->table->item(row,columnDSQL)->text().toUpper());
}
@ -439,7 +546,7 @@ void memories::on_table_cellChanged(int row, int col)
write=false;
}
if (write) {
queue->add(priorityImmediate,queueItem((currentMemory.sat?funcSatelliteMemory:funcMemoryContents),QVariant::fromValue<memoryType>(currentMemory)));
queue->add(priorityHighest,queueItem((currentMemory.sat?funcSatelliteMemory:funcMemoryContents),QVariant::fromValue<memoryType>(currentMemory)));
qInfo() << "Sending memory, group:" << currentMemory.group << "channel" << currentMemory.channel;
// 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));
@ -463,7 +570,7 @@ void memories::on_group_currentIndexChanged(int index)
else
groupMemories=rigCaps->memories;
ui->loadingMemories->setVisible(true);
//ui->loadingMemories->setVisible(true);
ui->table->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui->group->setEnabled(false);
@ -512,6 +619,20 @@ void memories::on_group_currentIndexChanged(int index)
ui->table->showColumn(columnNum);
visibleColumns++;
break;
#if defined __GNUC__
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
#endif
case 'C':
if (skipList != Q_NULLPTR)
delete skipList;
skipList = new tableCombobox(createModel(skipModel, skip),false,ui->table);
ui->table->setItemDelegateForColumn(columnSkip, skipList);
ui->table->showColumn(columnSkip);
visibleColumns++;
// Fallthrough to add Scanlist column as well.
scan.clear();
scan << "OFF" << "*1" << "*2" << "*3" << "*4" << "*5" << "*6" << "*7" << "*8" << "*9";
case 'c':
if (scanList != Q_NULLPTR)
delete scanList;
@ -521,6 +642,9 @@ void memories::on_group_currentIndexChanged(int index)
ui->table->showColumn(columnScan);
visibleColumns++;
break;
#if defined __GNUC__
#pragma GCC diagnostic pop
#endif
case 'd':
if (splitList != Q_NULLPTR)
delete splitList;
@ -538,7 +662,14 @@ void memories::on_group_currentIndexChanged(int index)
visibleColumns++;
visibleColumns++;
break;
case 'D': // Duplex only added for IC-R8600 (most rigs use j for duplex+tone)
if (duplexList != Q_NULLPTR)
delete duplexList;
duplexList = new tableCombobox(createModel(duplexModel, duplexModes),false,ui->table);
ui->table->setItemDelegateForColumn(columnDuplex, duplexList);
ui->table->showColumn(columnDuplex);
visibleColumns++;
break;
case 'e':
if (vfoList != Q_NULLPTR)
delete vfoList;
@ -889,6 +1020,53 @@ void memories::on_group_currentIndexChanged(int index)
ui->table->showColumn(columnR2B);
visibleColumns++;
break;
case 'w':
if (tuningStepsList != Q_NULLPTR)
delete tuningStepsList;
tuningStepsList = new tableCombobox(createModel(tuningStepsModel, tuningSteps),false,ui->table);
ui->table->setItemDelegateForColumn(columnTuningStep, tuningStepsList);
ui->table->showColumn(columnTuningStep);
visibleColumns++;
if (tuningStepEditor != Q_NULLPTR)
delete tuningStepEditor;
tuningStepEditor = new tableEditor("0000",ui->table);
ui->table->setItemDelegateForColumn(columnCustomTuningStep, tuningStepEditor);
ui->table->showColumn(columnCustomTuningStep);
visibleColumns++;
break;
case 'x':
if (attenuatorsList != Q_NULLPTR)
delete attenuatorsList;
attenuatorsList = new tableCombobox(createModel(attenuatorsModel, attenuators),false,ui->table);
ui->table->setItemDelegateForColumn(columnAttenuator, attenuatorsList);
ui->table->showColumn(columnAttenuator);
visibleColumns++;
if (preampsList != Q_NULLPTR)
delete preampsList;
preampsList = new tableCombobox(createModel(preampsModel, preamps),false,ui->table);
ui->table->setItemDelegateForColumn(columnPreamplifier, preampsList);
ui->table->showColumn(columnPreamplifier);
visibleColumns++;
break;
case 'y':
if (antennasList != Q_NULLPTR)
delete antennasList;
antennasList = new tableCombobox(createModel(antennasModel, antennas),false,ui->table);
ui->table->setItemDelegateForColumn(columnAntenna, antennasList);
ui->table->showColumn(columnAntenna);
visibleColumns++;
break;
case '+':
if (ipplusList != Q_NULLPTR)
delete ipplusList;
ipplusList = new tableCombobox(createModel(ipplusModel, ipplus),false,ui->table);
ui->table->setItemDelegateForColumn(columnIPPlus, ipplusList);
ui->table->showColumn(columnIPPlus);
visibleColumns++;
break;
case 'z':
if (nameEditor != Q_NULLPTR)
delete nameEditor;
@ -898,6 +1076,8 @@ void memories::on_group_currentIndexChanged(int index)
ui->table->showColumn(columnName);
visibleColumns++;
break;
case 'Z':
break;
default:
break;
}
@ -939,7 +1119,7 @@ void memories::on_group_currentIndexChanged(int index)
queue->add(priorityImmediate,queueItem(funcMemoryContents,QVariant::fromValue<uint>(lastMemoryRequested)));
}
}
ui->loadingMemories->setText(QString("Loading Memory %0/%1 (this may take a while!)").arg(lastMemoryRequested&0xffff,3,10,QLatin1Char('0')).arg(rigCaps->memories,3,10,QLatin1Char('0')));
//ui->loadingMemories->setText(QString("Loading Memory %0/%1 (this may take a while!)").arg(lastMemoryRequested&0xffff,3,10,QLatin1Char('0')).arg(rigCaps->memories,3,10,QLatin1Char('0')));
}
void memories::on_vfoMode_clicked()
@ -962,7 +1142,7 @@ void memories::on_memoryMode_clicked()
void memories::receiveMemory(memoryType mem)
{
ui->loadingMemories->setText(QString("Loading Memory %0/%1 (this may take a while!)").arg(lastMemoryRequested&0xffff,3,10,QLatin1Char('0')).arg(rigCaps->memories,3,10,QLatin1Char('0')));
//ui->loadingMemories->setText(QString("Loading Memory %0/%1 (this may take a while!)").arg(lastMemoryRequested&0xffff,3,10,QLatin1Char('0')).arg(rigCaps->memories,3,10,QLatin1Char('0')));
progress->setValue(lastMemoryRequested & 0xffff);
// First, do we need to request the next memory?
if ((lastMemoryRequested & 0xffff) < groupMemories)
@ -978,7 +1158,7 @@ void memories::receiveMemory(memoryType mem)
{
timeoutTimer.stop();
ui->group->setEnabled(true);
ui->loadingMemories->setVisible(false);
//ui->loadingMemories->setVisible(false);
if (!ui->disableEditing->isChecked())
{
ui->table->setEditTriggers(QAbstractItemView::DoubleClicked);
@ -1026,6 +1206,8 @@ void memories::receiveMemory(memoryType mem)
validData += updateCombo(split,row,columnSplit,mem.split);
validData += updateCombo(skip,row,columnSkip,mem.skip);
validData += updateCombo(scan,row,columnScan,mem.scan);
@ -1045,43 +1227,54 @@ void memories::receiveMemory(memoryType mem)
}
validData += updateCombo(dataModes,row,columnData,mem.datamode);
validData += updateCombo(dataModes,row,columnDataB,mem.datamodeB);
validData += updateCombo(toneModes,row,columnToneMode,mem.tonemode);
validData += updateCombo(toneModes,row,columnToneModeB,mem.tonemodeB);
validData += updateCombo(filters,row,columnFilter,mem.filter-1);
validData += updateCombo(filters,row,columnFilterB,mem.filterB-1);
validData += updateCombo(duplexModes,row,columnDuplex,mem.duplex);
validData += updateCombo(duplexModes,row,columnDuplexB,mem.duplexB);
validData += updateCombo(dsql,row,columnDSQL,mem.dsql);
validData += updateCombo(dsql,row,columnDSQLB,mem.dsqlB);
validData += updateCombo(tones,row,columnTone,QString::number((float)mem.tone/10,'f',1));
validData += updateCombo(tones,row,columnToneB,QString::number((float)mem.toneB/10,'f',1));
validData += updateCombo(tones,row,columnTSQL,QString::number((float)mem.tsql/10,'f',1));
validData += updateCombo(tuningSteps,row,columnTuningStep,mem.tuningStep);
validData += updateCombo(tuningSteps,row,columnTuningStepB,mem.tuningStepB);
ui->table->model()->setData(ui->table->model()->index(row,columnCustomTuningStep),QString::number(mem.progTs));
validData++;
ui->table->model()->setData(ui->table->model()->index(row,columnCustomTuningStepB),QString::number(mem.progTsB));
validData++;
validData += updateCombo(attenuators,row,columnAttenuator,mem.atten);
validData += updateCombo(attenuators,row,columnAttenuatorB,mem.attenB);
validData += updateCombo(attenuators,row,columnPreamplifier,mem.preamp);
validData += updateCombo(attenuators,row,columnPreamplifierB,mem.preampB);
validData += updateCombo(antennas,row,columnAntenna,mem.antenna);
validData += updateCombo(antennas,row,columnAntennaB,mem.antennaB);
validData += updateCombo(ipplus,row,columnIPPlus,mem.ipplus);
validData += updateCombo(ipplus,row,columnIPPlusB,mem.ipplusB);
validData += updateCombo(tones,row,columnTSQL,QString::number((float)mem.tsql/10,'f',1));
validData += updateCombo(tones,row,columnTSQLB,QString::number((float)mem.tsqlB/10,'f',1));
validData += updateCombo(dvsql,row,columnDVSquelch,QString::number(mem.dvsql).rightJustified(2,'0'));
validData += updateCombo(dvsql,row,columnDVSquelchB,QString::number(mem.dvsqlB).rightJustified(2,'0'));
validData += updateCombo(dtcsp,row,columnDTCSPolarity,mem.dtcsp);
validData += updateCombo(dtcsp,row,columnDTCSPolarityB,mem.dtcspB);
validData += updateCombo(dtcs,row,columnDTCS,QString::number(mem.dtcs).rightJustified(3,'0'));
validData += updateCombo(dtcs,row,columnDTCSB,QString::number(mem.dtcsB).rightJustified(3,'0'));
ui->table->model()->setData(ui->table->model()->index(row,columnOffset),QString::number(double(mem.duplexOffset.Hz/10000.0),'f',3));
@ -1160,7 +1353,7 @@ void memories::receiveMemory(memoryType mem)
else if (row != -1)
{
// Check if we already have this memory as it might have failed to write?
ui->loadingMemories->setStyleSheet("QLabel {color: #ff0000}");
//ui->loadingMemories->setStyleSheet("QLabel {color: #ff0000}");
ui->table->item(row,columnNum)->setBackground(Qt::red);
}
@ -1222,7 +1415,7 @@ void memories::timeout()
timeoutCount++;
} else {
timeoutCount=0;
ui->loadingMemories->setVisible(false);
//ui->loadingMemories->setVisible(false);
timeoutTimer.stop();
ui->group->setEnabled(true);
if (!ui->disableEditing->isChecked())
@ -1258,6 +1451,8 @@ void memories::on_csvImport_clicked()
if (!file.isEmpty())
{
ui->table->blockSignals(true);
ui->table->sortByColumn(0,Qt::AscendingOrder); // Force natural order
QFile data(file);
@ -1305,7 +1500,6 @@ void memories::on_csvImport_clicked()
int colnum=1;
ui->table->blockSignals(true);
for (int i=0; i<row.size();i++)
{
while (colnum < ui->table->columnCount() && ui->table->isColumnHidden(colnum)) {
@ -1353,14 +1547,18 @@ void memories::on_csvImport_clicked()
break;
}
if (colnum == lastcol)
ui->table->blockSignals(false);
ui->table->model()->setData(ui->table->model()->index(rownum,colnum),data);
if (colnum == lastcol) {
on_table_cellChanged(rownum,colnum); // store this row.
}
colnum++;
}
}
}
ui->table->blockSignals(false);
}
}
@ -1478,3 +1676,14 @@ void memories::on_disableEditing_toggled(bool dis)
ui->table->setEditTriggers(QAbstractItemView::DoubleClicked);
}
}
void memories::on_scanButton_toggled(bool scan)
{
if (scan) {
ui->scanButton->setText("Stop Scan");
} else {
ui->scanButton->setText("Start Scan");
}
queue->add(priorityImmediate,queueItem(funcScanning,QVariant::fromValue<uchar>(uchar(scan))));
}

Wyświetl plik

@ -43,6 +43,7 @@ private slots:
void on_memoryMode_clicked();
void on_csvImport_clicked();
void on_csvExport_clicked();
void on_scanButton_toggled(bool scan);
void on_disableEditing_toggled(bool dis);
bool readCSVRow (QTextStream &in, QStringList *row);
@ -69,6 +70,7 @@ private:
QStringList split;
QStringList scan;
QStringList skip;
QStringList vfos;
QStringList duplexModes;
QStringList modes;
@ -80,6 +82,11 @@ private:
QStringList dtcsp;
QStringList dsql;
QStringList dvsql;
QStringList tuningSteps;
QStringList preamps;
QStringList attenuators;
QStringList antennas;
QStringList ipplus;
/*
columnFrequencyB,
@ -98,6 +105,7 @@ private:
columnR2B,
*/
QStandardItemModel* splitModel = Q_NULLPTR;
QStandardItemModel* skipModel = Q_NULLPTR;
QStandardItemModel* scanModel = Q_NULLPTR;
QStandardItemModel* filterModel = Q_NULLPTR;
QStandardItemModel* vfoModel = Q_NULLPTR;
@ -111,6 +119,11 @@ private:
QStandardItemModel* dtcspModel = Q_NULLPTR;
QStandardItemModel* dtcsModel = Q_NULLPTR;
QStandardItemModel* dvsqlModel = Q_NULLPTR;
QStandardItemModel* tuningStepsModel = Q_NULLPTR;
QStandardItemModel* preampsModel = Q_NULLPTR;
QStandardItemModel* attenuatorsModel = Q_NULLPTR;
QStandardItemModel* antennasModel = Q_NULLPTR;
QStandardItemModel* ipplusModel = Q_NULLPTR;
QStandardItemModel* vfoModelB = Q_NULLPTR;
QStandardItemModel* modesModelB = Q_NULLPTR;
@ -124,11 +137,17 @@ private:
QStandardItemModel* duplexModelB = Q_NULLPTR;
QStandardItemModel* dtcsModelB = Q_NULLPTR;
QStandardItemModel* dvsqlModelB = Q_NULLPTR;
// I don't know of any radio that uses these!
QStandardItemModel* tuningStepsModelB = Q_NULLPTR;
QStandardItemModel* preampsModelB = Q_NULLPTR;
QStandardItemModel* attenuatorsModelB = Q_NULLPTR;
QStandardItemModel* antennasModelB = Q_NULLPTR;
QStandardItemModel* ipplusModelB = Q_NULLPTR;
tableEditor* numEditor = Q_NULLPTR;
tableCombobox* splitList = Q_NULLPTR;
tableCombobox* scanList = Q_NULLPTR;
tableCombobox* skipList = Q_NULLPTR;
tableCombobox* vfoList = Q_NULLPTR;
tableEditor* nameEditor = Q_NULLPTR;
tableEditor* freqEditor = Q_NULLPTR;
@ -147,6 +166,12 @@ private:
tableEditor* urEditor = Q_NULLPTR;
tableEditor* r1Editor = Q_NULLPTR;
tableEditor* r2Editor = Q_NULLPTR;
tableCombobox* tuningStepsList = Q_NULLPTR;
tableEditor* tuningStepEditor = Q_NULLPTR;
tableCombobox* preampsList = Q_NULLPTR;
tableCombobox* attenuatorsList = Q_NULLPTR;
tableCombobox* antennasList = Q_NULLPTR;
tableCombobox* ipplusList = Q_NULLPTR;
tableCombobox* vfoListB = Q_NULLPTR;
tableEditor* freqEditorB = Q_NULLPTR;
@ -165,6 +190,12 @@ private:
tableEditor* urEditorB = Q_NULLPTR;
tableEditor* r1EditorB = Q_NULLPTR;
tableEditor* r2EditorB = Q_NULLPTR;
tableCombobox* tuningStepsListB = Q_NULLPTR;
tableEditor* tuningStepEditorB = Q_NULLPTR;
tableCombobox* preampsListB = Q_NULLPTR;
tableCombobox* attenuatorsListB = Q_NULLPTR;
tableCombobox* antennasListB = Q_NULLPTR;
tableCombobox* ipplusListBB = Q_NULLPTR;
rigCapabilities* rigCaps = Q_NULLPTR;
@ -179,6 +210,7 @@ private:
columnNum,
columnName,
columnSplit,
columnSkip,
columnScan,
columnVFO,
columnFrequency,
@ -187,6 +219,12 @@ private:
columnData,
columnDuplex,
columnToneMode,
columnTuningStep,
columnCustomTuningStep,
columnAttenuator,
columnPreamplifier,
columnAntenna,
columnIPPlus,
columnDSQL,
columnTone,
columnTSQL,
@ -204,6 +242,12 @@ private:
columnDataB,
columnDuplexB,
columnToneModeB,
columnTuningStepB,
columnCustomTuningStepB,
columnAttenuatorB,
columnPreamplifierB,
columnAntennaB,
columnIPPlusB,
columnDSQLB,
columnToneB,
columnTSQLB,

Wyświetl plik

@ -17,7 +17,7 @@
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="sizeConstraint">
<enum>QLayout::SetMaximumSize</enum>
<enum>QLayout::SizeConstraint::SetMaximumSize</enum>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
@ -27,7 +27,7 @@
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -50,7 +50,7 @@
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -61,56 +61,16 @@
</spacer>
</item>
<item>
<widget class="QLabel" name="loadingMemories">
<property name="enabled">
<bool>true</bool>
</property>
<property name="palette">
<palette>
<active>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>0</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</active>
<inactive>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>0</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</inactive>
<disabled>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>120</red>
<green>120</green>
<blue>120</blue>
</color>
</brush>
</colorrole>
</disabled>
</palette>
</property>
<widget class="QPushButton" name="scanButton">
<property name="text">
<string>Loading Memories (this may take a while!)</string>
<string>Start Scan</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -137,7 +97,7 @@
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -169,10 +129,10 @@
<bool>true</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
<enum>QAbstractItemView::SelectionMode::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectItems</enum>
<enum>QAbstractItemView::SelectionBehavior::SelectItems</enum>
</property>
<property name="sortingEnabled">
<bool>true</bool>