From 258e152b4f267ac4e8205fce0178fd66ebe52bc8 Mon Sep 17 00:00:00 2001 From: Phil Taylor Date: Mon, 15 May 2023 10:53:52 +0100 Subject: [PATCH] Lots more changes --- cachingqueue.cpp | 147 ++- cachingqueue.h | 55 +- debugwindow.cpp | 185 +++ debugwindow.h | 43 + debugwindow.ui | 280 +++++ rigcommander.cpp | 1251 ++++++++----------- rigcommander.h | 26 +- rigcreator.cpp | 23 +- rigcreator.ui | 21 +- rigidentities.h | 21 +- rigs/IC-705.rig | 226 ++-- rigs/IC-7100.rig | 242 ++-- rigs/IC-7300.rig | 244 ++-- rigs/IC-785x.rig | 1007 +++++++-------- rigs/IC-9700.rig | 146 ++- rigs/ic-7610.rig | 968 +++++++-------- transceiveradjustments.cpp | 44 +- transceiveradjustments.h | 12 +- transceiveradjustments.ui | 8 +- usbcontroller.cpp | 232 ++-- usbcontroller.h | 6 +- wfmain.cpp | 2365 +++++++++++++++++------------------- wfmain.h | 143 +-- wfmain.ui | 477 +++++++- wfview.pro | 3 + wfviewtypes.h | 117 +- 26 files changed, 4454 insertions(+), 3838 deletions(-) create mode 100644 debugwindow.cpp create mode 100644 debugwindow.h create mode 100644 debugwindow.ui diff --git a/cachingqueue.cpp b/cachingqueue.cpp index c680ad4..b17b949 100644 --- a/cachingqueue.cpp +++ b/cachingqueue.cpp @@ -42,13 +42,12 @@ void cachingQueue::run() QDeadlineTimer deadline(queueInterval); QMutexLocker locker(&mutex); - int counter=0; + quint64 counter=0; // Will run for many years! while (!aborted) { if (!waiting.wait(&mutex, deadline.remainingTime())) { // Time to process the queue - mutex is locked - //qInfo("Deadline!"); queuePriority prio = priorityImmediate; // priorityNone=0, priorityImmediate=1, priorityHighest=2, priorityHigh=3, priorityMediumHigh=5, priorityMedium=7, priorityMediumLow=11, priorityLow=19, priorityLowest=23 @@ -69,12 +68,12 @@ void cachingQueue::run() prio = priorityLow; else if (counter % priorityLowest == 0) prio = priorityLowest; - } + } counter++; auto it = queue.find(prio); if (it != queue.end()) { - queueItem item = it.value(); + auto item = it.value(); emit haveCommand(item.type, item.command,item.param); @@ -82,8 +81,10 @@ void cachingQueue::run() while (it.key()==prio) it++; // Add it back into the queue - if (item.recurring) + if (item.recurring) { queue.insert(it,prio,item); + updateCache(false,item.command); + } } QCoreApplication::processEvents(); @@ -91,8 +92,10 @@ void cachingQueue::run() } else if (!aborted) { - // We have been woken by a command that needs immediate attention (mutex is locked) - qInfo("Message Received"); + // Mutex is locked + while (!items.isEmpty()) { + emit sendValue(items.dequeue()); + } } } } @@ -106,24 +109,53 @@ void cachingQueue::interval(quint64 val) void cachingQueue::add(queuePriority prio ,funcs func, bool recurring) { - QMutexLocker locker(&mutex); - queue.insert(prio, queueItem(func,recurring)); - if (recurring) qInfo() << "adding" << funcString[func] << "recurring" << recurring << "priority" << prio; + queueItem q(func,recurring); + add(prio,q); } void cachingQueue::add(queuePriority prio ,queueItem item) { - QMutexLocker locker(&mutex); - queue.insert(prio, item); - if (item.recurring) qInfo() << "adding" << funcString[item.command] << "recurring" << item.recurring << "priority" << prio; + if (item.command != funcNone) + { + QMutexLocker locker(&mutex); + if (!item.recurring || isRecurring(item.command) != prio) + { + if (item.recurring && prio == queuePriority::priorityImmediate) { + qWarning() << "Warning, cannot add recurring command with immediate priority!" << funcString[item.command]; + } else { + queue.insert(prio, item); + updateCache(false,item.command,item.param); + if (item.recurring) qInfo() << "adding" << funcString[item.command] << "recurring" << item.recurring << "priority" << prio; + } + } + } } +void cachingQueue::addUnique(queuePriority prio ,funcs func, bool recurring) +{ + queueItem q(func,recurring); + addUnique(prio,q); +} + + + void cachingQueue::addUnique(queuePriority prio ,queueItem item) { - QMutexLocker locker(&mutex); - queue.erase(std::remove_if(queue.begin(), queue.end(), [item](const queueItem& c) { return (c.command == item.command); }), queue.end()); - queue.insert(prio, item); - if (item.recurring) qInfo() << "adding" << funcString[item.command] << "recurring" << item.recurring << "priority" << prio; + if (item.command != funcNone) + { + QMutexLocker locker(&mutex); + if (!item.recurring || isRecurring(item.command) != prio) + { + if (item.recurring && prio == queuePriority::priorityImmediate) { + qWarning() << "Warning, cannot add unique recurring command with immediate priority!" << funcString[item.command]; + } else { + queue.erase(std::remove_if(queue.begin(), queue.end(), [item](const queueItem& c) { return (c.command == item.command && c.recurring == item.recurring); }), queue.end()); + queue.insert(prio, item); + updateCache(false,item.command,item.param); + if (item.recurring) qInfo() << "adding" << funcString[item.command] << "recurring" << item.recurring << "priority" << prio; + } + } + } } void cachingQueue::del(funcs func) @@ -133,6 +165,17 @@ void cachingQueue::del(funcs func) qInfo() << "deleting" << funcString[func]; } +queuePriority cachingQueue::isRecurring(funcs func) +{ + // Does NOT lock the mutex + auto rec = std::find_if(queue.begin(), queue.end(), [func](const queueItem& c) { return (c.command == func && c.recurring); }); + if (rec != queue.end()) + { + return rec.value().priority; + } + return queuePriority::priorityNone; +} + void cachingQueue::clear() { QMutexLocker locker(&mutex); @@ -144,49 +187,67 @@ void cachingQueue::message(QString msg) waiting.wakeOne(); } - -void cachingQueue::setCache(funcs func, QVariant val) +void cachingQueue::receiveValue(funcs func, QVariant value) { - QMutexLocker locker = QMutexLocker(&mutex); - cache.insert(func,val); + QMutexLocker locker(&mutex); + cacheItem c = cacheItem(func,value); + items.enqueue(c); + updateCache(true,func,value); + waiting.wakeOne(); +} + +void cachingQueue::updateCache(bool reply, funcs func, QVariant value) +{ + // Mutex MUST be locked by the calling function. + auto cv = cache.find(func); + if (cv != cache.end()) { + if (reply) { + cv->reply = QDateTime::currentDateTime(); + cv->value = value; + } else { + cv->req = QDateTime::currentDateTime(); + } + return; + } + + cacheItem c; + c.command = func; + if (reply) { + c.reply = QDateTime::currentDateTime(); + c.value = value; + } else { + c.req = QDateTime::currentDateTime(); + } + cache.insert(func,c); } -QVariant cachingQueue::getCache(funcs func) +cacheItem cachingQueue::getCache(funcs func) { - QMutexLocker locker = QMutexLocker(&mutex); + QMutexLocker locker(&mutex); auto it = cache.find(func); if (it != cache.end()) { return it.value(); } - return NULL; + return cacheItem(); } -bool cachingQueue::getCache(funcs func, quint8& val) +//Calling function MUST call unlockMutex() once finished with data +QMap cachingQueue::getCacheItems() { - QVariant variant = getCache(func); - if (variant.isNull()) - return false; - val=variant.toUInt(); - return true; + mutex.lock(); + return cache; } -bool cachingQueue::getCache(funcs func, quint16& val) +//Calling function MUST call unlockMutex() once finished with data +QMultiMap cachingQueue::getQueueItems() { - QVariant variant = getCache(func); - if (variant.isNull()) - return false; - val=variant.toUInt(); - return true; + mutex.lock(); + return queue; } -bool cachingQueue::getCache(funcs func, quint32& val) +void cachingQueue::unlockMutex() { - QVariant variant = getCache(func); - if (variant.isNull()) - return false; - val=variant.toUInt(); - return true; + mutex.unlock(); } - diff --git a/cachingqueue.h b/cachingqueue.h index cf944b7..07d11e5 100644 --- a/cachingqueue.h +++ b/cachingqueue.h @@ -5,14 +5,17 @@ #include #include #include +#include #include #include +#include #include #include #include +#include #include "wfviewtypes.h" - +#include "rigidentities.h" enum queuePriority { // Use prime numbers for priority, so that each queue is processed @@ -31,38 +34,58 @@ struct queueItem { queueItem (funcs command) : type(queueCommandGet), command(command) {}; queueItem (funcs command, QVariant param) : type(queueCommandSet), command(command), param(param) {}; queueItem (queueItemType type, funcs command, QVariant param) : type(type), command(command), param(param) {}; - + queuePriority priority; queueItemType type = queueCommandNone; funcs command = funcNone; - QVariant param; + QVariant param=QVariant(); bool recurring = false; }; +struct cacheItem { + cacheItem () {}; + cacheItem (funcs command, QVariant value) : command(command), value(value) {}; + + funcs command = funcNone; + QDateTime req=QDateTime(); + QDateTime reply=QDateTime(); + QVariant value=QVariant(); +}; + class cachingQueue : public QThread { Q_OBJECT signals: void haveCommand(queueItemType type, funcs func, QVariant param); + void sendValue(cacheItem item); + +public slots: + // Can be called directly or via emit. + void receiveValue(funcs func, QVariant value); private: + static cachingQueue *instance; + static QMutex mutex; + QMultiMap queue; - QHash cache; + QMap cache; + QQueue items; // Command to set cache value void setCache(funcs func, QVariant val); - // Various commands to get cache value - QVariant getCache(funcs func); - bool getCache(funcs func, quint8& val); - bool getCache(funcs func, quint16& val); - bool getCache(funcs func, quint32& val); + queuePriority isRecurring(funcs func); + + + // Various other values std::atomic aborted=false; QWaitCondition waiting; - void run(); quint64 queueInterval=0; // Don't start the timer! + // Functions + void run(); + protected: cachingQueue(QObject* parent = Q_NULLPTR) : QThread(parent) {}; ~cachingQueue(); @@ -74,11 +97,19 @@ public: static cachingQueue *getInstance(QObject* parent = Q_NULLPTR); void message(QString msg); void add(queuePriority prio ,funcs func, bool recurring=false); - void add(queuePriority,queueItem); - void addUnique(queuePriority,queueItem); + void add(queuePriority prio,queueItem item); + void addUnique(queuePriority prio ,funcs func, bool recurring=false); + void addUnique(queuePriority prio,queueItem item); void del(funcs func); void clear(); void interval(quint64 val); + void updateCache(bool reply, funcs func, QVariant value=QVariant()); + + cacheItem getCache(funcs func); + + QMap getCacheItems(); + QMultiMap getQueueItems(); + void unlockMutex(); }; #endif // CACHINGQUEUE_H diff --git a/debugwindow.cpp b/debugwindow.cpp new file mode 100644 index 0000000..c693e38 --- /dev/null +++ b/debugwindow.cpp @@ -0,0 +1,185 @@ +#include "debugwindow.h" +#include "ui_debugwindow.h" + +#include "logcategories.h" + +debugWindow::debugWindow(QWidget *parent) : + QDialog(parent), + ui(new Ui::debugWindow) +{ + ui->setupUi(this); + qDebug() << "debugWindow() Creating new window"; + queue = cachingQueue::getInstance(); + ui->cacheView->setColumnWidth(0,20); + ui->queueView->setColumnWidth(0,20); + ui->cacheView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + ui->queueView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + //QTimer::singleShot(100, this, &debugWindow::getCache); + //QTimer::singleShot(300, this, &debugWindow::getQueue); + cacheTimer.setInterval(ui->cacheInterval->text().toInt()); + queueTimer.setInterval(ui->queueInterval->text().toInt()); + connect(&cacheTimer,SIGNAL(timeout()),this,SLOT(getCache())); + connect(&queueTimer,SIGNAL(timeout()),this,SLOT(getQueue())); + cacheTimer.start(); + queueTimer.start(); +} + +debugWindow::~debugWindow() +{ + qDebug() << "debugWindow() destroying window"; + cacheTimer.stop(); + queueTimer.stop(); + delete ui; +} + +void debugWindow::getCache() +{ + QMap cacheItems = queue->getCacheItems(); + ui->cacheLabel->setText(QString("Current cache items in cachingView(%0)").arg(cacheItems.size())); + int c=0; + QMap::const_iterator i = cacheItems.constBegin(); + while (i != cacheItems.constEnd()) + { + if (c >= ui->cacheView->rowCount()) + { + ui->cacheView->insertRow(ui->cacheView->rowCount()); + for (int j=0;j< ui->cacheView->columnCount();j++) + { + ui->cacheView->setItem(c,j,new QTableWidgetItem()); + } + } + //QString::number(i.value().command).rightJustified(3,'0')); + ui->cacheView->item(c,0)->setText(QString::number(i.value().command).rightJustified(3,'0')); + ui->cacheView->item(c,1)->setText(funcString[i.value().command]); + ui->cacheView->item(c,2)->setText(getValue(i.value().value)); + ui->cacheView->item(c,3)->setText((i.value().req.isValid()?i.value().req.toString("hh:mm:ss.zzz"):"")); + ui->cacheView->item(c,4)->setText((i.value().reply.isValid()?i.value().reply.toString("hh:mm:ss.zzz"):"")); + c++; + i++; + } + if (ui->cacheView->rowCount() > c) + ui->cacheView->model()->removeRows(c,ui->cacheView->rowCount()); + queue->unlockMutex(); +} + +void debugWindow::getQueue() +{ + QMultiMap queueItems = queue->getQueueItems(); + ui->queueLabel->setText(QString("Current queue items in cachingView(%0)").arg(queueItems.size())); + int c=0; + QMultiMap::const_iterator i = queueItems.constBegin(); + while (i != queueItems.constEnd()) + { + if (c >= ui->queueView->rowCount()) + { + ui->queueView->insertRow(ui->queueView->rowCount()); + for (int j=0;j< ui->queueView->columnCount();j++) + { + ui->queueView->setItem(c,j,new QTableWidgetItem()); + } + + } + ui->queueView->item(c,0)->setText(QString::number(i.value().command).rightJustified(3,'0')); + ui->queueView->item(c,1)->setText(funcString[i.value().command]); + ui->queueView->item(c,2)->setText(QString::number(i.key())); + ui->queueView->item(c,3)->setText((i.value().param.isValid()?"Set":"Get")); + ui->queueView->item(c,4)->setText(getValue(i.value().param)); + ui->queueView->item(c,5)->setText((i.value().recurring?"True":"False")); + c++; + i++; + } + ui->queueView->model()->removeRows(c,ui->queueView->rowCount()); + queue->unlockMutex(); +} + + +QString debugWindow::getValue(QVariant val) +{ + QString value=""; + if (val.isValid()) { + if (!strcmp(val.typeName(),"bool")) + { + value = (val.value()?"True":"False"); + } + else if (!strcmp(val.typeName(),"uchar")) + { + value = QString("uchar: %0").arg(val.value()); + } + else if (!strcmp(val.typeName(),"ushort")) + { + value = QString("ushort: %0").arg(val.value()); + } + else if (!strcmp(val.typeName(),"short")) + { + value = QString("short: %0").arg(val.value()); + } + else if (!strcmp(val.typeName(),"uint")) + { + value = QString("Gr: %0 Me: %1").arg(val.value() >> 16 & 0xffff).arg(val.value() & 0xffff); + } + else if (!strcmp(val.typeName(),"mode_info")) + { + mode_info mi = val.value(); + value = QString("%0(V:%1) D:%2 F%3").arg(mi.name).arg(mi.VFO).arg(mi.data).arg(mi.filter); + } + else if(!strcmp(val.typeName(),"freqt")) + { + freqt f = val.value(); + value = QString("(V:%0) %1 Mhz").arg(f.VFO).arg(f.MHzDouble); + } + else if(!strcmp(val.typeName(),"scopeData")) + { + scopeData s = val.value(); + value = QString("(V:%0) %1").arg(s.mainSub).arg((s.valid?"Valid":"Invalid")); + } + else if (!strcmp(val.typeName(),"antennaInfo")) + { + antennaInfo a = val.value(); + value = QString("Ant: %0 RX: %1").arg(a.antenna).arg(a.rx); + } + else if (!strcmp(val.typeName(),"memoryType")) + { + memoryType m = val.value(); + value = QString("Mem:%0 G:%1 %2").arg(m.name).arg(m.group).arg(m.channel); + } + else if (!strcmp(val.typeName(),"rigInput")) + { + rigInput i = val.value(); + value = QString("Input:%0 R:%1 (%2)").arg(i.name).arg(i.reg).arg(i.type); + } + else + { + value = QString("%0: ").arg(val.typeName()); + } + + } + return value; +} + + +void debugWindow::on_cachePause_clicked(bool checked) +{ + if (checked) + cacheTimer.stop(); + else + cacheTimer.start(); +} + +void debugWindow::on_queuePause_clicked(bool checked) +{ + if (checked) + queueTimer.stop(); + else + queueTimer.start(); +} + + +void debugWindow::on_cacheInterval_textChanged(QString text) +{ + cacheTimer.setInterval(text.toInt()); +} + +void debugWindow::on_queueInterval_textChanged(QString text) +{ + queueTimer.setInterval(text.toInt()); +} diff --git a/debugwindow.h b/debugwindow.h new file mode 100644 index 0000000..b8f1d4e --- /dev/null +++ b/debugwindow.h @@ -0,0 +1,43 @@ +#ifndef DEBUGWINDOW_H +#define DEBUGWINDOW_H + +#include +#include +#include +#include +#include +#include + +#include "cachingqueue.h" + +namespace Ui { +class debugWindow; +} + +class debugWindow : public QDialog +{ + Q_OBJECT + +private slots: + void getCache(); + void getQueue(); + void on_cachePause_clicked(bool checked); + void on_queuePause_clicked(bool checked); + void on_cacheInterval_textChanged(QString text); + void on_queueInterval_textChanged(QString text); + +public: + explicit debugWindow(QWidget *parent = nullptr); + ~debugWindow(); + +private: + Ui::debugWindow *ui; + cachingQueue* queue = Q_NULLPTR; + QMultiMap queueItems; + QMap cacheItems; + QString getValue(QVariant val); + QTimer cacheTimer; + QTimer queueTimer; +}; + +#endif // DEBUGWINDOW_H diff --git a/debugwindow.ui b/debugwindow.ui new file mode 100644 index 0000000..c9548d1 --- /dev/null +++ b/debugwindow.ui @@ -0,0 +1,280 @@ + + + debugWindow + + + + 0 + 0 + 896 + 575 + + + + Dialog + + + + + + + + Current cache items in cachingView() + + + Qt::AlignCenter + + + + + + + Current queue items in cachingView() + + + Qt::AlignCenter + + + + + + + + + + + + + QAbstractItemView::NoEditTriggers + + + true + + + true + + + 95 + + + true + + + false + + + + ID + + + + + Function + + + + + Value + + + + + Request + + + + + Reply + + + + + + + + QAbstractItemView::NoEditTriggers + + + 80 + + + + ID + + + + + Function + + + + + Priority + + + + + Get/Set + + + + + Value + + + + + Recurring + + + + + + + + + + + + Pause refresh + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Refresh Interval (ms) + + + + + + + 99999 + + + 500 + + + + + + + Pause refresh + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Refresh Interval (ms) + + + + + + + + 0 + 0 + + + + 99999 + + + 1000 + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + debugWindow + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + debugWindow + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/rigcommander.cpp b/rigcommander.cpp index 8bda7da..72c48fc 100644 --- a/rigcommander.cpp +++ b/rigcommander.cpp @@ -217,6 +217,7 @@ void rigCommander::commonSetup() lookingForRig = true; foundRig = false; + // Add the below commands so we can get a response until we have received rigCaps rigCaps.commands.clear(); rigCaps.commandsReverse.clear(); rigCaps.commands.insert(funcTransceiverId,funcType(funcTransceiverId, QString("Transceiver ID"),QByteArrayLiteral("\x19\x00"),0,0)); @@ -224,7 +225,7 @@ void rigCommander::commonSetup() queue = cachingQueue::getInstance(this); connect(queue,SIGNAL(haveCommand(queueItemType,funcs,QVariant)),this,SLOT(receiveCommand(queueItemType, funcs,QVariant))); - + connect(this,SIGNAL(haveReceivedValue(funcs,QVariant)),queue,SLOT(receiveValue(funcs,qVariant))); oldScopeMode = spectModeUnknown; pttAllowed = true; // This is for developing, set to false for "safe" debugging. Set to true for deployment. @@ -622,16 +623,24 @@ void rigCommander::getSpectrumMode() void rigCommander::setFrequency(unsigned char vfo, freqt freq) { QByteArray payload; - if (getCommand(funcMainSubFreq,payload,vfo)) + if (vfo == activeVFO) { - payload.append(vfo); - payload.append(makeFreqPayload(freq)); - prepDataAndSend(payload); - } - else if (getCommand(funcFreqSet,payload)) - { - payload.append(makeFreqPayload(freq)); - prepDataAndSend(payload); + if (getCommand(funcSelectedFreq,payload)) + { + payload.append(makeFreqPayload(freq)); + prepDataAndSend(payload); + } + else if (getCommand(funcFreqSet,payload)) + { + payload.append(makeFreqPayload(freq)); + prepDataAndSend(payload); + } + } else { + if (getCommand(funcSelectedFreq,payload)) + { + payload.append(makeFreqPayload(freq)); + prepDataAndSend(payload); + } } } @@ -794,19 +803,29 @@ void rigCommander::setMode(mode_info m) } QByteArray payload; - if (getCommand(funcMainSubMode,payload,m.VFO)) + if (m.VFO == activeVFO) { - payload.append(static_cast(m.VFO)); - payload.append(m.reg); - payload.append(static_cast(m.data)); - payload.append(m.filter); - prepDataAndSend(payload); - } - else if (getCommand(funcModeSet,payload)) - { - payload.append(m.reg); - payload.append(m.filter); - prepDataAndSend(payload); + if (getCommand(funcSelectedMode,payload)) + { + payload.append(m.reg); + payload.append(static_cast(m.data)); + payload.append(m.filter); + prepDataAndSend(payload); + } + else if (getCommand(funcModeSet,payload)) + { + payload.append(m.reg); + payload.append(m.filter); + prepDataAndSend(payload); + } + } else { + if (getCommand(funcUnselectedMode,payload)) + { + payload.append(m.reg); + payload.append(static_cast(m.data)); + payload.append(m.filter); + prepDataAndSend(payload); + } } } @@ -844,14 +863,21 @@ void rigCommander::getFrequency() void rigCommander::getFrequency(unsigned char vfo) { QByteArray payload; - if (getCommand(funcMainSubFreq,payload,vfo)) + if (vfo == activeVFO) { - payload.append(vfo); - prepDataAndSend(payload); - } - else if (getCommand(funcFreqSet,payload)) - { - prepDataAndSend(payload); + if (getCommand(funcSelectedFreq,payload)) + { + prepDataAndSend(payload); + } + else if (getCommand(funcFreqSet,payload)) + { + prepDataAndSend(payload); + } + } else { + if (getCommand(funcSelectedFreq,payload)) + { + prepDataAndSend(payload); + } } } @@ -862,7 +888,7 @@ void rigCommander::getMode() void rigCommander::getMode(unsigned char vfo) { QByteArray payload; - if (getCommand(funcMainSubMode,payload,vfo)) + if (getCommand(funcSelectedMode,payload)) { payload.append(vfo); prepDataAndSend(payload); @@ -1199,36 +1225,30 @@ QByteArray rigCommander::encodeTone(quint16 tone, bool tinv, bool rinv) return enct; } -quint16 rigCommander::decodeTone(QByteArray eTone) -{ - bool t; - bool r; - return decodeTone(eTone, t, r); -} -quint16 rigCommander::decodeTone(QByteArray eTone, bool &tinv, bool &rinv) +toneInfo rigCommander::decodeTone(QByteArray eTone) { // index: 00 01 02 03 04 // CTCSS: 1B 01 00 12 73 = PL 127.3, decode as 1273 // D(T)CS: 1B 01 TR 01 23 = T/R Invert bits + DCS code 123 + toneInfo t; + if (eTone.length() < 5) { - return 0; + return t; } - tinv = false; rinv = false; - quint16 result = 0; if((eTone.at(2) & 0x01) == 0x01) - tinv = true; + t.tinv = true; if((eTone.at(2) & 0x10) == 0x10) - rinv = true; + t.rinv = true; - result += (eTone.at(4) & 0x0f); - result += ((eTone.at(4) & 0xf0) >> 4) * 10; - result += (eTone.at(3) & 0x0f) * 100; - result += ((eTone.at(3) & 0xf0) >> 4) * 1000; + t.tone += (eTone.at(4) & 0x0f); + t.tone += ((eTone.at(4) & 0xf0) >> 4) * 10; + t.tone += (eTone.at(3) & 0x0f) * 100; + t.tone += ((eTone.at(3) & 0xf0) >> 4) * 1000; - return result; + return t; } void rigCommander::getTone() @@ -1411,7 +1431,7 @@ void rigCommander::getSatMemory(quint32 mem) } -void rigCommander::setMemory(memoryType mem) +QByteArray rigCommander::setMemory(memoryType mem) { bool finished=false; @@ -1420,16 +1440,13 @@ void rigCommander::setMemory(memoryType mem) uchar ffchar = 0xff; QVector parser; - if (mem.sat && getCommand(funcSatelliteMemory,payload,mem.channel)) + if (mem.sat) { parser = rigCaps.satParser; } - else if (!mem.sat && getCommand(funcMemoryContents,payload,mem.channel)) + else { parser = rigCaps.memParser; - } else { - // No supported commands - return; } // Format is different for all radios! @@ -1588,12 +1605,7 @@ void rigCommander::setMemory(memoryType mem) if (finished) break; } - prepDataAndSend(payload); - - if (mem.del) - qInfo(logRig()) << "Deleting memory:" << mem.channel; - else - qInfo(logRig()) << "Storing memory:" << mem.channel << "Name:" << mem.name; + return payload; } void rigCommander::clearMemory(quint32 mem) @@ -1983,54 +1995,50 @@ void rigCommander::parseCommand() return; } + freqt test; QVector memParser; - + QVariant value; switch (func) { case funcFreqGet: case funcfreqTR: case funcReadTXFreq: - parseFrequency(); + { + value.setValue(parseFrequency()); break; + } case funcVFODualWatch: // Not currently used, but will report the current dual-watch status break; - case funcMainSubFreq: - emit haveFrequency(parseFrequency(payloadIn, 5)); + case funcSelectedFreq: + case funcUnselectedFreq: + { + value.setValue(parseFrequency(payloadIn,5)); break; + } case funcModeGet: case funcModeTR: { - quint8 mode = payloadIn[1]; - quint8 filter=0; + mode_info m; + m = parseMode(payloadIn[1], m.filter); if(payloadIn[2] != '\xFD') { - filter = payloadIn[2]; + m.filter = payloadIn[2]; } else { - filter = 0; + m.filter = 0; } - parseMode(mode, filter); - emit haveMode(mode, filter); - state.set(MODE,mode,false); - state.set(FILTER, filter, false); - + value.setValue(m); break; } - case funcMainSubMode: + case funcSelectedMode: + case funcUnselectedMode: { + mode_info m; // New format payload with mode+datamode+filter - quint8 mode = payloadIn[2]; - quint8 filter = (unsigned char)payloadIn[4]; - - if((int)payloadIn[1] == 0) // VFOA only currently - { - emit haveDataMode((bool)payloadIn[03]); - state.set(DATAMODE, (quint8)payloadIn[3], false); - } - parseMode(mode, filter); - emit haveMode(mode, filter); - state.set(MODE,mode,false); - state.set(FILTER, filter, false); + m = parseMode(uchar(payloadIn[2]), uchar(payloadIn[4])); + m.data = bool(payloadIn[3]); + m.VFO = selVFO_t(payloadIn[1] & 0x01); + value.setValue(m); break; } #if defined __GNUC__ @@ -2048,173 +2056,11 @@ void rigCommander::parseCommand() } else { mem.sat=true; } - // Parse the memory entry into a memoryType, set some defaults so we don't get an unitialized warning. - mem.frequency.Hz=0; - mem.frequency.VFO=activeVFO; - mem.frequency.MHzDouble=0.0; - mem.frequencyB = mem.frequency; - mem.duplexOffset = mem.frequency; - mem.duplexOffsetB = mem.frequency; - mem.scan = 0xfe; - memset(mem.UR, 0x0, sizeof(mem.UR)); - memset(mem.URB, 0x0, sizeof(mem.UR)); - memset(mem.R1, 0x0, sizeof(mem.R1)); - memset(mem.R1B, 0x0, sizeof(mem.R1B)); - memset(mem.R2, 0x0, sizeof(mem.R2)); - memset(mem.R2B, 0x0, sizeof(mem.R2B)); - memset(mem.name, 0x0, sizeof(mem.name)); - foreach (auto parse, memParser) { - // non-existant memory is short so send what we have so far. - if (payloadIn.size() < (parse.pos+1+parse.len)) { - emit haveMemory(mem); - return; - } - QByteArray data = payloadIn.mid(parse.pos+1,parse.len); - switch (parse.spec) - { - case 'a': - if (parse.len == 1) { - mem.group = bcdHexToUChar(data[0]); - } - else - { - mem.group = bcdHexToUChar(data[0],data[1]); - } - break; - case 'b': - mem.channel = bcdHexToUChar(data[0],data[1]); - break; - case 'c': - mem.scan = data[0]; - break; - case 'd': // combined split and scan - mem.split = quint8(data[0] >> 4 & 0x0f); - mem.scan = quint8(data[0] & 0x0f); - break; - case 'e': - mem.vfo=data[0]; - break; - case 'E': - mem.vfoB=data[0]; - break; - case 'f': - mem.frequency.Hz = parseFreqDataToInt(data); - break; - case 'F': - mem.frequencyB.Hz = parseFreqDataToInt(data); - break; - case 'g': - mem.mode=data[0]; - break; - case 'G': - mem.modeB=data[0]; - break; - case 'h': - mem.filter=data[0]; - break; - case 'H': - mem.filterB=data[0]; - break; - case 'i': // single datamode - mem.datamode=data[0]; - break; - case 'I': // single datamode - mem.datamodeB=data[0]; - break; - case 'j': // combined duplex and tonemode - mem.duplex=duplexMode(quint8(data[0] >> 4 & 0x0f)); - mem.tonemode=quint8(quint8(data[0] & 0x0f)); - break; - case 'J': // combined duplex and tonemodeB - mem.duplexB=duplexMode((data[0] >> 4 & 0x0f)); - mem.tonemodeB=data[0] & 0x0f; - break; - case 'k': // combined datamode and tonemode - mem.datamode=(quint8(data[0] >> 4 & 0x0f)); - mem.tonemode=data[0] & 0x0f; - break; - case 'K': // combined datamode and tonemode - mem.datamodeB=(quint8(data[0] >> 4 & 0x0f)); - mem.tonemodeB=data[0] & 0x0f; - break; - case 'l': // tonemode - mem.tonemode=data[0] & 0x0f; - break; - case 'L': // tonemode - mem.tonemodeB=data[0] & 0x0f; - break; - case 'm': - mem.dsql = (quint8(data[0] >> 4 & 0x0f)); - break; - case 'M': - mem.dsqlB = (quint8(data[0] >> 4 & 0x0f)); - break; - case 'n': - mem.tone = bcdHexToUInt(data[1],data[2]); // First byte is not used - break; - case 'N': - mem.toneB = bcdHexToUInt(data[1],data[2]); // First byte is not used - break; - case 'o': - mem.tsql = bcdHexToUInt(data[1],data[2]); // First byte is not used - break; - case 'O': - mem.tsqlB = bcdHexToUInt(data[1],data[2]); // First byte is not used - break; - case 'p': - mem.dtcsp = (quint8(data[0] >> 3 & 0x02) | quint8(data[0] & 0x01)); - break; - case 'P': - mem.dtcspB = (quint8(data[0] >> 3 & 0x10) | quint8(data[0] & 0x01)); - break; - case 'q': - mem.dtcs = bcdHexToUInt(data[0],data[1]); - break; - case 'Q': - mem.dtcsB = bcdHexToUInt(data[0],data[1]); - break; - case 'r': - mem.dvsql = bcdHexToUInt(data[0],data[1]); - break; - case 'R': - mem.dvsqlB = bcdHexToUInt(data[0],data[1]); - break; - case 's': - mem.duplexOffset.Hz = parseFreqDataToInt(data); - break; - case 'S': - mem.duplexOffsetB.Hz = parseFreqDataToInt(data); - break; - case 't': - memcpy(mem.UR,data,sizeof(mem.UR)); - break; - case 'T': - memcpy(mem.URB,data,sizeof(mem.UR)); - break; - case 'u': - memcpy(mem.R1,data,sizeof(mem.R1)); - break; - case 'U': - memcpy(mem.R1B,data,sizeof(mem.R1)); - break; - case 'v': - memcpy(mem.R2,data,sizeof(mem.R2)); - break; - case 'V': - memcpy(mem.R2B,data,sizeof(mem.R2)); - break; - case 'z': - if (mem.scan == 0xfe) - mem.scan = 0; - memcpy(mem.name,data,sizeof(mem.name)); - break; - default: - qInfo() << "Parser didn't match!" << "spec:" << parse.spec << "pos:" << parse.pos << "len" << parse.len; - break; - } + if (parseMemory(&memParser,&mem)) { + value.setValue(mem); } - emit haveMemory(mem); + break; } #if defined __GNUC__ #pragma GCC diagnostic pop @@ -2227,244 +2073,93 @@ void rigCommander::parseCommand() case funcScanning: break; case funcReadFreqOffset: - emit haveRptOffsetFrequency(parseFrequencyRptOffset(payloadIn)); + value.setValue(parseFrequencyRptOffset(payloadIn)); break; + // These return a single byte that we convert to a uchar (0-99) case funcSplitStatus: case funcDuplexStatus: - emit haveDuplexMode((duplexMode)(unsigned char)payloadIn[1]); - state.set(DUPLEX, (duplexMode)(unsigned char)payloadIn[1], false); - break; case funcTuningStep: - // We could use this to update the current tuning step from the radio - // although we use many more different steps! - emit haveTuningStep((unsigned char)payloadIn[1]); - break; case funcAttenuator: - emit haveAttenuator((unsigned char)payloadIn.at(1)); - state.set(ATTENUATOR, (quint8)payloadIn[1], false); + value.setValue(uchar(payloadIn[1])); break; case funcAntenna: - emit haveAntenna((unsigned char)payloadIn.at(1), (bool)payloadIn.at(2)); - state.set(ANTENNA, (quint8)payloadIn[1], false); - state.set(RXANTENNA, (bool)payloadIn[2], false); + { + antennaInfo ant; + ant.antenna = static_cast(payloadIn[1]); + ant.rx = static_cast(payloadIn[2]); + value.setValue(ant); break; // Register 13 (speech) has no get values // Register 14 (levels) starts here: - case funcAfGain: + } + case funcAfGain: if (udp == Q_NULLPTR) { - emit haveAfGain(bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(AFGAIN, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - } else { - state.set(AFGAIN, localVolume, false); + value.setValue(bcdHexToUChar(payloadIn[2],payloadIn[3])); } break; - case funcRfGain: - emit haveRfGain(bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(RFGAIN, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcSquelch: - emit haveSql(bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(SQUELCH, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcAPFLevel: - break; - case funcNRLevel: - emit haveNRLevel(bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(NR, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcPBTInner: - emit haveTPBFInner(bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(PBTIN, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcPBTOuter: - emit haveTPBFOuter(bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(PBTOUT, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcIFShift: - emit haveIFShift(bcdHexToUChar(payloadIn[2],payloadIn[3])); - break; - case funcCwPitch: - emit haveCwPitch(bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(CWPITCH, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcRFPower: - emit haveTxPower(bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(RFPOWER, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcMicGain: - emit haveNRLevel(bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(MICGAIN, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcKeySpeed: - emit haveKeySpeed(bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(KEYSPD, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcNotchFilter: - state.set(NOTCHF, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - // Not implemented - // emit haveNotch(bcdHexToUChar(payloadIn[2],payloadIn[3])); - break; - case funcCompressorLevel: - emit haveCompLevel(bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(COMPLEVEL, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcBreakInDelay: - break; - case funcNBLevel: - emit haveNBLevel(bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(NB, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcDigiSelShift: - break; - case funcDriveGain: - break; - case funcMonitorGain: - emit haveMonitorGain(bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(MONITORLEVEL, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcVoxGain: - emit haveVoxGain(bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(VOXGAIN, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcAntiVoxGain: - emit haveAntiVoxGain(bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(ANTIVOXGAIN, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - // 0x15 Meters - case funcSMeterSqlStatus: - break; - case funcSMeter: - emit haveMeter(meterS,bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(SMETER, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcVariousSql: - case funcOverflowStatus: - break; - case funcCenterMeter: - emit haveMeter(meterCenter,bcdHexToUChar(payloadIn[2],payloadIn[3])); - break; - case funcPowerMeter: - emit haveMeter(meterPower,bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(POWERMETER, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcSWRMeter: - emit haveMeter(meterSWR,bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(SWRMETER, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcALCMeter: - emit haveMeter(meterALC,bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(ALCMETER, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcCompMeter: - emit haveMeter(meterComp,bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(COMPMETER, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcVdMeter: - emit haveMeter(meterVoltage,bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(VOLTAGEMETER, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - case funcIdMeter: - emit haveMeter(meterCurrent,bcdHexToUChar(payloadIn[2],payloadIn[3])); - state.set(CURRENTMETER, bcdHexToUChar(payloadIn[2],payloadIn[3]), false); - break; - // 0x16 enable/disable functions: - case funcPreamp: - emit havePreamp((unsigned char)payloadIn.at(2)); - state.set(PREAMP, (quint8)payloadIn.at(2), false); - break; + // The following group are 2 bytes converted to uchar (0-255) case funcAGCTime: - state.set(AGC, (quint8)payloadIn[2], false); + case funcRfGain: + case funcSquelch: + case funcAPFLevel: + case funcNRLevel: + case funcPBTInner: + case funcPBTOuter: + case funcIFShift: + case funcCwPitch: + case funcRFPower: + case funcMicGain: + case funcKeySpeed: + case funcNotchFilter: + case funcCompressorLevel: + case funcBreakInDelay: + case funcNBLevel: + case funcDigiSelShift: + case funcDriveGain: + case funcMonitorGain: + case funcVoxGain: + case funcAntiVoxGain: + // 0x15 Meters + case funcSMeter: + case funcCenterMeter: + case funcPowerMeter: + case funcSWRMeter: + case funcALCMeter: + case funcCompMeter: + case funcVdMeter: + case funcIdMeter: + value.setValue(bcdHexToUChar(payloadIn[2],payloadIn[3])); break; + + // The following group ALL return bool + case funcPreamp: case funcNoiseBlanker: - emit haveNB(payloadIn.at(2) != 0); - state.set(NBFUNC, payloadIn.at(2) != 0, false); - break; case funcAudioPeakFilter: - break; case funcNoiseReduction: - emit haveNR(payloadIn.at(2) != 0); - state.set(NRFUNC, payloadIn.at(2) != 0, false); - break; case funcAutoNotch: - state.set(ANFFUNC, payloadIn.at(2) != 0, false); - break; case funcRepeaterTone: - { - rptAccessTxRx ra; - if(payloadIn.at(2)==1) - { - ra = ratrTONEon; - } else { - ra = ratrTONEoff; - } - emit haveRptAccessMode(ra); - state.set(TONEFUNC, payloadIn.at(2) != 0, false); - break; - } case funcRepeaterTSQL: - { - rptAccessTxRx ra; - if(payloadIn.at(2)==1) - { - ra = ratrTSQLon; - } else { - ra = ratrTSQLoff; - } - emit haveRptAccessMode(ra); - state.set(TSQLFUNC, payloadIn.at(2) != 0, false); - break; - } case funcRepeaterDTCS: case funcRepeaterCSQL: - break; case funcCompressor: - emit haveComp(payloadIn.at(2) != 0); - state.set(COMPFUNC, payloadIn.at(2) != 0, false); - break; case funcMonitor: - emit haveMonitor(payloadIn.at(2) != 0); - state.set(MONFUNC, payloadIn.at(2) != 0, false); - break; case funcVox: - emit haveVox(payloadIn.at(2) != 0); - state.set(VOXFUNC, payloadIn.at(2) != 0, false); - break; - case funcBreakIn: - { - if (payloadIn.at(2) == '\00') { - state.set(FBKINFUNC, false, false); - state.set(SBKINFUNC, false, false); - } - else if (payloadIn.at(2) == '\01') { - state.set(FBKINFUNC, false, false); - state.set(SBKINFUNC, true, false); - - } - else if (payloadIn.at(2) == '\02') { - state.set(FBKINFUNC, true, false); - state.set(SBKINFUNC, false, false); - } - emit haveCWBreakMode(payloadIn.at(2)); - break; - } case funcManualNotch: - state.set(MNFUNC, payloadIn.at(2) != 0, false); - break; case funcDigiSel: - break; case funcTwinPeakFilter: - break; case funcDialLock: - state.set(LOCKFUNC, payloadIn.at(2) != 0, false); - break; + case funcOverflowStatus: + case funcSMeterSqlStatus: + case funcVariousSql: case funcRXAntenna: + value.setValue(static_cast(payloadIn[2])); break; case funcDSPIFFilter: break; case funcNotchWidth: break; case funcSSBBandwidth: - break; + break; case funcMainSubTracking: case funcToneSquelchType: emit haveRptAccessMode((rptAccessTxRx)payloadIn.at(2)); @@ -2474,6 +2169,7 @@ void rigCommander::parseCommand() // 0x17 is CW send and 0x18 is power control (no reply) // 0x19 it automatically added. case funcTransceiverId: + value.setValue(static_cast(payloadIn[2])); model = determineRadioModel(payloadIn[2]); // verify this is the model not the CIV rigCaps.modelID = payloadIn[2]; determineRigCaps(); @@ -2497,80 +2193,70 @@ void rigCommander::parseCommand() else { calc = 600 + ((pass - 10) * 100); } - emit havePassband(calc); - state.set(PASSBAND, calc, false); + value.setValue(calc); break; } case funcDataModeWithFilter: - emit haveDataMode((bool)payloadIn[03]); - state.set(DATAMODE, (quint8)payloadIn[3], false); + { + mode_info m; + m.data = static_cast(payloadIn[2]); + if (payloadIn[3] != '\xfd') + m.filter = static_cast(payloadIn[3]); + value.setValue(static_cast(m)); break; + } case funcAFMute: state.set(MUTEFUNC, (quint8)payloadIn[2], false); break; - // 0x1a 0x05 various registers! + // 0x1a 0x05 various registers below are 2 byte (0-255) as uchar case funcREFAdjust: - emit haveRefAdjustCourse(bcdHexToUChar(payloadIn[4],payloadIn[5])); - break; case funcREFAdjustFine: - emit haveRefAdjustFine(bcdHexToUChar(payloadIn[4],payloadIn[5])); - break; - case funcACC1ModLevel: - emit haveACCGain(bcdHexToUChar(payloadIn[4],payloadIn[5]),5); // This might need some work? - break; + case funcACCAModLevel: + case funcACCBModLevel: case funcUSBModLevel: - emit haveUSBGain(bcdHexToUChar(payloadIn[4],payloadIn[5])); - break; case funcLANModLevel: - emit haveLANGain(bcdHexToUChar(payloadIn[4],payloadIn[5])); + case funcSPDIFModLevel: + value.setValue(bcdHexToUChar(payloadIn[4],payloadIn[5])); break; + // Singla byte returned as uchar (0-99) case funcDATAOffMod: - emit haveModInput((inputTypes)bcdHexToUChar(payloadIn[4]),false); - break; case funcDATA1Mod: - emit haveModInput((inputTypes)bcdHexToUChar(payloadIn[4]),true); - break; case funcDATA2Mod: - break; case funcDATA3Mod: - break; - case funcDashRatio: - emit haveDashRatio(bcdHexToUChar(payloadIn[4])); - break; - // 0x1b register - case funcToneFreq: - emit haveTone(decodeTone(payloadIn)); - state.set(CTCSS, decodeTone(payloadIn), false); - break; - case funcTSQLFreq: - emit haveTSQL(decodeTone(payloadIn)); - state.set(TSQL, decodeTone(payloadIn), false); - break; - case funcDTCSCode: { - quint16 tone=0; - bool tinv = false; - bool rinv = false; - tone = decodeTone(payloadIn, tinv, rinv); - emit haveDTCS(tone, tinv, rinv); - state.set(DTCS, tone, false); + foreach (auto r, rigCaps.inputs) + { + if (r.reg == bcdHexToUChar(payloadIn[4])) + { + value.setValue(rigInput(r)); + break; + } + } break; } + case funcDashRatio: + value.setValue(bcdHexToUChar(payloadIn[4])); + break; + // 0x1b register (tones) + case funcToneFreq: + case funcTSQLFreq: + case funcDTCSCode: case funcCSQLCode: - emit haveTone(decodeTone(payloadIn)); - state.set(CSQL, decodeTone(payloadIn), false); + value.setValue(decodeTone(payloadIn)); break; - // 0x1c register + // 0x1c register (bool) + case funcRitStatus: case funcTransceiverStatus: - parsePTT(); + value.setValue(static_cast(payloadIn[2])); break; + // tuner is 0-2 case funcTunerStatus: - parseATU(); + value.setValue(bcdHexToUChar(payloadIn[2])); break; // 0x21 RIT: case funcRITFreq: { - int ritHz = 0; + short ritHz = 0; freqt f; QByteArray longfreq; longfreq = payloadIn.mid(2,2); @@ -2579,21 +2265,20 @@ void rigCommander::parseCommand() if(payloadIn.length() < 5) break; ritHz = f.Hz*((payloadIn.at(4)=='\x01')?-1:1); - emit haveRitFrequency(ritHz); - state.set(RITVALUE, ritHz, false); + value.setValue(ritHz); break; } - case funcRitStatus: - emit haveRitEnabled(static_cast(payloadIn.at(02))); - state.set(RITFUNC, static_cast(payloadIn.at(02)), false); - break; // 0x27 case funcScopeWaveData: - parseSpectrum(); + { + scopeData d; + if (parseSpectrum(d)) + value.setValue(d); break; + } case funcScopeOnOff: // confirming scope is on - state.set(SCOPEFUNC, (bool)payloadIn[2], true); + value.setValue(static_cast(payloadIn[2])); break; case funcScopeDataOutput: // confirming output enabled/disabled of wf data. @@ -2609,32 +2294,48 @@ void rigCommander::parseCommand() // [1] 0x14 // [2] 0x00 // [3] 0x00 (center), 0x01 (fixed), 0x02, 0x03 - emit haveSpectrumMode(static_cast((unsigned char)payloadIn[3])); + value.setValue(static_cast(uchar(payloadIn[3]))); + //emit haveSpectrumMode(static_cast((unsigned char)payloadIn[3])); break; case funcScopeCenterSpan: + { + freqt f = parseFrequency(payloadIn, 6); + f.VFO = static_cast(payloadIn[2]); + value.setValue(f); // read span in center mode // [1] 0x15 - // [2] to [8] is span encoded as a frequency - emit haveScopeSpan(parseFrequency(payloadIn, 6), static_cast(payloadIn.at(2))); + // [2] to [8] is spastatic_cast(payloadIn.at(2)n encoded as a frequency + //emit haveScopeSpan(parseFrequency(payloadIn, 6), static_cast(payloadIn.at(2))); break; + } case funcScopeEdgeNumber: // read edge mode center in edge mode // [1] 0x16 // [2] 0x01, 0x02, 0x03: Edge 1,2,3 - emit haveScopeEdge((char)payloadIn[2]); + value.setValue(bcdHexToUChar(payloadIn[2])); + //emit haveScopeEdge((char)payloadIn[2]); break; case funcScopeHold: // Hold status (only 9700?) + value.setValue(static_cast(payloadIn[2])); break; case funcScopeRef: + { // scope reference level // [1] 0x19 // [2] 0x00 // [3] 10dB digit, 1dB digit // [4] 0.1dB digit, 0 // [5] 0x00 = +, 0x01 = - - parseSpectrumRefLevel(); + unsigned char negative = payloadIn[5]; + short ref = bcdHexToUInt(payloadIn[3], payloadIn[4]); + ref = ref / 10; + if(negative){ + ref *= (-1*negative); + } + value.setValue(ref); break; + } case funcScopeSpeed: case funcScopeDuringTX: case funcScopeCenterType: @@ -2687,6 +2388,182 @@ void rigCommander::parseCommand() lastParseReport = QTime::currentTime(); } #endif + + if (value.isValid() && queue != Q_NULLPTR) { + queue->receiveValue(func,value); + } + +} + +bool rigCommander::parseMemory(QVector* memParser, memoryType* mem) +{ + // Parse the memory entry into a memoryType, set some defaults so we don't get an unitialized warning. + mem->frequency.Hz=0; + mem->frequency.VFO=activeVFO; + mem->frequency.MHzDouble=0.0; + mem->frequencyB = mem->frequency; + mem->duplexOffset = mem->frequency; + mem->duplexOffsetB = mem->frequency; + mem->scan = 0xfe; + memset(mem->UR, 0x0, sizeof(mem->UR)); + memset(mem->URB, 0x0, sizeof(mem->UR)); + memset(mem->R1, 0x0, sizeof(mem->R1)); + memset(mem->R1B, 0x0, sizeof(mem->R1B)); + memset(mem->R2, 0x0, sizeof(mem->R2)); + memset(mem->R2B, 0x0, sizeof(mem->R2B)); + memset(mem->name, 0x0, sizeof(mem->name)); + + foreach (auto parse, *memParser) { + // non-existant memory is short so send what we have so far. + if (payloadIn.size() < (parse.pos+1+parse.len)) { + return true; + } + QByteArray data = payloadIn.mid(parse.pos+1,parse.len); + switch (parse.spec) + { + case 'a': + if (parse.len == 1) { + mem->group = bcdHexToUChar(data[0]); + } + else + { + mem->group = bcdHexToUChar(data[0],data[1]); + } + break; + case 'b': + mem->channel = bcdHexToUChar(data[0],data[1]); + break; + case 'c': + mem->scan = data[0]; + break; + case 'd': // combined split and scan + mem->split = quint8(data[0] >> 4 & 0x0f); + mem->scan = quint8(data[0] & 0x0f); + break; + case 'e': + mem->vfo=data[0]; + break; + case 'E': + mem->vfoB=data[0]; + break; + case 'f': + mem->frequency.Hz = parseFreqDataToInt(data); + break; + case 'F': + mem->frequencyB.Hz = parseFreqDataToInt(data); + break; + case 'g': + mem->mode=data[0]; + break; + case 'G': + mem->modeB=data[0]; + break; + case 'h': + mem->filter=data[0]; + break; + case 'H': + mem->filterB=data[0]; + break; + case 'i': // single datamode + mem->datamode=data[0]; + break; + case 'I': // single datamode + mem->datamodeB=data[0]; + break; + case 'j': // combined duplex and tonemode + mem->duplex=duplexMode(quint8(data[0] >> 4 & 0x0f)); + mem->tonemode=quint8(quint8(data[0] & 0x0f)); + break; + case 'J': // combined duplex and tonemodeB + mem->duplexB=duplexMode((data[0] >> 4 & 0x0f)); + mem->tonemodeB=data[0] & 0x0f; + break; + case 'k': // combined datamode and tonemode + mem->datamode=(quint8(data[0] >> 4 & 0x0f)); + mem->tonemode=data[0] & 0x0f; + break; + case 'K': // combined datamode and tonemode + mem->datamodeB=(quint8(data[0] >> 4 & 0x0f)); + mem->tonemodeB=data[0] & 0x0f; + break; + case 'l': // tonemode + mem->tonemode=data[0] & 0x0f; + break; + case 'L': // tonemode + mem->tonemodeB=data[0] & 0x0f; + break; + case 'm': + mem->dsql = (quint8(data[0] >> 4 & 0x0f)); + break; + case 'M': + mem->dsqlB = (quint8(data[0] >> 4 & 0x0f)); + break; + case 'n': + mem->tone = bcdHexToUInt(data[1],data[2]); // First byte is not used + break; + case 'N': + mem->toneB = bcdHexToUInt(data[1],data[2]); // First byte is not used + break; + case 'o': + mem->tsql = bcdHexToUInt(data[1],data[2]); // First byte is not used + break; + case 'O': + mem->tsqlB = bcdHexToUInt(data[1],data[2]); // First byte is not used + break; + case 'p': + mem->dtcsp = (quint8(data[0] >> 3 & 0x02) | quint8(data[0] & 0x01)); + break; + case 'P': + mem->dtcspB = (quint8(data[0] >> 3 & 0x10) | quint8(data[0] & 0x01)); + break; + case 'q': + mem->dtcs = bcdHexToUInt(data[0],data[1]); + break; + case 'Q': + mem->dtcsB = bcdHexToUInt(data[0],data[1]); + break; + case 'r': + mem->dvsql = bcdHexToUInt(data[0],data[1]); + break; + case 'R': + mem->dvsqlB = bcdHexToUInt(data[0],data[1]); + break; + case 's': + mem->duplexOffset.Hz = parseFreqDataToInt(data); + break; + case 'S': + mem->duplexOffsetB.Hz = parseFreqDataToInt(data); + break; + case 't': + memcpy(mem->UR,data,sizeof(mem->UR)); + break; + case 'T': + memcpy(mem->URB,data,sizeof(mem->UR)); + break; + case 'u': + memcpy(mem->R1,data,sizeof(mem->R1)); + break; + case 'U': + memcpy(mem->R1B,data,sizeof(mem->R1)); + break; + case 'v': + memcpy(mem->R2,data,sizeof(mem->R2)); + break; + case 'V': + memcpy(mem->R2B,data,sizeof(mem->R2)); + break; + case 'z': + if (mem->scan == 0xfe) + mem->scan = 0; + memcpy(mem->name,data,sizeof(mem->name)); + break; + default: + qInfo() << "Parser didn't match!" << "spec:" << parse.spec << "pos:" << parse.pos << "len" << parse.len; + break; + } + } + + return true; } void rigCommander::parseLevels() @@ -2734,14 +2611,14 @@ void rigCommander::parseLevels() case '\x07': // Twin BPF Inner, or, IF-Shift level if(rigCaps.commands.contains(funcPBTInner)) - emit haveTPBFInner(level); + emit havePBTInner(level); else emit haveIFShift(level); state.set(PBTIN, level, false); break; case '\x08': // Twin BPF Outer - emit haveTPBFOuter(level); + emit havePBTOuter(level); state.set(PBTOUT, level, false); break; case '\x06': @@ -2878,7 +2755,7 @@ void rigCommander::setIFShift(unsigned char level) } } -void rigCommander::setTPBFInner(unsigned char level) +void rigCommander::setPBTInner(unsigned char level) { QByteArray payload; // Passband may be fixed? @@ -2899,7 +2776,7 @@ void rigCommander::setTPBFInner(unsigned char level) } } -void rigCommander::setTPBFOuter(unsigned char level) +void rigCommander::setPBTOuter(unsigned char level) { QByteArray payload; // Passband may be fixed? @@ -2962,7 +2839,7 @@ void rigCommander::setModInput(inputTypes input, bool dataOn) // inputACCA, // inputACCB}; - QByteArray payload; + QByteArray payload; funcs f=(dataOn) ? funcDATA1Mod :funcDATAOffMod; if (getCommand(f,payload,input)) @@ -3102,10 +2979,6 @@ void rigCommander::setModInputLevel(inputTypes input, unsigned char level) setACCGain(level, 1); break; - case inputACC: - setACCGain(level); - break; - case inputUSB: setUSBGain(level); break; @@ -3155,10 +3028,6 @@ void rigCommander::getModInputLevel(inputTypes input) getACCGain(1); break; - case inputACC: - getACCGain(); - break; - case inputUSB: getUSBGain(); break; @@ -3342,7 +3211,7 @@ void rigCommander::getACCGain() void rigCommander::getACCGain(unsigned char ab) { - funcs f=(ab == 0) ? funcACC1ModLevel :funcACC2ModLevel; + funcs f=(ab == 0) ? funcACCAModLevel :funcACCBModLevel; QByteArray payload; if (getCommand(f,payload)) { @@ -3358,7 +3227,7 @@ void rigCommander::setACCGain(unsigned char gain) void rigCommander::setACCGain(unsigned char gain, unsigned char ab) { - funcs f=(ab == 0) ? funcACC1ModLevel :funcACC2ModLevel; + funcs f=(ab == 0) ? funcACCAModLevel :funcACCBModLevel; QByteArray payload; if (getCommand(f,payload,gain)) { @@ -3461,7 +3330,7 @@ void rigCommander::getIFShift() } } -void rigCommander::getTPBFInner() +void rigCommander::getPBTInner() { // Passband may be fixed? unsigned char mode = state.getChar(MODE); @@ -3480,7 +3349,7 @@ void rigCommander::getTPBFInner() } } -void rigCommander::getTPBFOuter() +void rigCommander::getPBTOuter() { // Passband may be fixed? unsigned char mode = state.getChar(MODE); @@ -4101,125 +3970,10 @@ void rigCommander::parseRegisters1A() void rigCommander::parseRegister1B() { - quint16 tone=0; - bool tinv = false; - bool rinv = false; - - switch(payloadIn[01]) - { - case '\x00': - // "Repeater tone" - tone = decodeTone(payloadIn); - emit haveTone(tone); - state.set(CTCSS, tone, false); - break; - case '\x01': - // "TSQL tone" - tone = decodeTone(payloadIn); - emit haveTSQL(tone); - state.set(TSQL, tone, false); - break; - case '\x02': - // DTCS (DCS) - tone = decodeTone(payloadIn, tinv, rinv); - emit haveDTCS(tone, tinv, rinv); - state.set(DTCS, tone, false); - break; - case '\x07': - // "CSQL code (DV mode)" - tone = decodeTone(payloadIn); - state.set(CSQL, tone, false); - break; - default: - break; - } } void rigCommander::parseRegister16() { - //"INDEX: 00 01 02 03 " - //"DATA: 16 5d 00 fd " - // ^-- mode info here - rptAccessTxRx ra; - - switch(payloadIn.at(1)) - { - case '\x5d': - emit haveRptAccessMode((rptAccessTxRx)payloadIn.at(2)); - break; - case '\x02': - // Preamp - emit havePreamp((unsigned char)payloadIn.at(2)); - state.set(PREAMP, (quint8)payloadIn.at(2), false); - break; - case '\x22': - emit haveNB(payloadIn.at(2) != 0); - state.set(NBFUNC, payloadIn.at(2) != 0, false); - break; - case '\x40': - emit haveNR(payloadIn.at(2) != 0); - state.set(NRFUNC, payloadIn.at(2) != 0, false); - break; - case '\x41': // Auto notch - state.set(ANFFUNC, payloadIn.at(2) != 0, false); - break; - case '\x42': - state.set(TONEFUNC, payloadIn.at(2) != 0, false); - if(payloadIn.at(2)==1) - { - ra = ratrTONEon; - } else { - ra = ratrTONEoff; - } - emit haveRptAccessMode(ra); - break; - case '\x43': - state.set(TSQLFUNC, payloadIn.at(2) != 0, false); - if(payloadIn.at(2)==1) - { - ra = ratrTSQLon; - } else { - ra = ratrTSQLoff; - } - emit haveRptAccessMode(ra); - break; - case '\x44': - emit haveComp(payloadIn.at(2) != 0); - state.set(COMPFUNC, payloadIn.at(2) != 0, false); - break; - case '\x45': - emit haveMonitor(payloadIn.at(2) != 0); - state.set(MONFUNC, payloadIn.at(2) != 0, false); - break; - case '\x46': - emit haveVox(payloadIn.at(2) != 0); - state.set(VOXFUNC, payloadIn.at(2) != 0, false); - break; - case '\x47': - if (payloadIn.at(2) == '\00') { - state.set(FBKINFUNC, false, false); - state.set(SBKINFUNC, false, false); - } - else if (payloadIn.at(2) == '\01') { - state.set(FBKINFUNC, false, false); - state.set(SBKINFUNC, true, false); - - } - else if (payloadIn.at(2) == '\02') { - state.set(FBKINFUNC, true, false); - state.set(SBKINFUNC, false, false); - } - emit haveCWBreakMode(payloadIn.at(2)); - break; - case '\x48': // Manual Notch - state.set(MNFUNC, payloadIn.at(2) != 0, false); - break; - case '\x50': // Dial lock - state.set(LOCKFUNC, payloadIn.at(2) != 0, false); - break; - default: - break; - } } void rigCommander::parseBandStackReg() @@ -4516,65 +4270,6 @@ void rigCommander::parseDetailedRegisters1A05() void rigCommander::parseWFData() { - freqt freqSpan; - bool isSub; - switch(payloadIn[1]) - { - case 0: - // Chunk of spectrum - parseSpectrum(); - break; - case 0x10: - // confirming scope is on - state.set(SCOPEFUNC, (bool)payloadIn[2], true); - break; - case 0x11: - // confirming output enabled/disabled of wf data. - break; - case 0x14: - // fixed or center - emit haveSpectrumMode(static_cast((unsigned char)payloadIn[3])); - // [1] 0x14 - // [2] 0x00 - // [3] 0x00 (center), 0x01 (fixed), 0x02, 0x03 - break; - case 0x15: - // read span in center mode - // [1] 0x15 - // [2] to [8] is span encoded as a frequency - isSub = payloadIn.at(2)==0x01; - freqSpan = parseFrequency(payloadIn, 6); - emit haveScopeSpan(freqSpan, isSub); - //qInfo(logRig()) << "Received 0x15 center span data: for frequency " << freqSpan.Hz; - //printHex(payloadIn, false, true); - break; - case 0x16: - // read edge mode center in edge mode - emit haveScopeEdge((char)payloadIn[2]); - //qInfo(logRig()) << "Received 0x16 edge in center mode:"; - //printHex(payloadIn, false, true); - // [1] 0x16 - // [2] 0x01, 0x02, 0x03: Edge 1,2,3 - break; - case 0x17: - // Hold status (only 9700?) - qDebug(logRig()) << "Received 0x17 hold status - need to deal with this!"; - printHex(payloadIn, false, true); - break; - case 0x19: - // scope reference level - // [1] 0x19 - // [2] 0x00 - // [3] 10dB digit, 1dB digit - // [4] 0.1dB digit, 0 - // [5] 0x00 = +, 0x01 = - - parseSpectrumRefLevel(); - break; - default: - qInfo(logRig()) << "Unknown waveform data received: "; - printHex(payloadIn, false, true); - break; - } } @@ -4701,7 +4396,7 @@ void rigCommander::determineRigCaps() { settings->setArrayIndex(c); rigCaps.modes.push_back(mode_info(mode_kind(settings->value("Num", 0).toUInt()), - settings->value("Reg", 0).toString().toUInt(), settings->value("Name", "").toString(), settings->value("BW", 0).toBool())); + settings->value("Reg", 0).toString().toUInt(nullptr,16), settings->value("Name", "").toString(), settings->value("BW", 0).toBool())); } settings->endArray(); } @@ -4714,8 +4409,8 @@ void rigCommander::determineRigCaps() for (int c = 0; c < numSpans; c++) { settings->setArrayIndex(c); - rigCaps.scopeCenterSpans.push_back( - centerSpanData(centerSpansType(settings->value("Num", 0).toString().toUInt()), settings->value("Name", "").toString(), settings->value("Freq", 0).toUInt())); + rigCaps.scopeCenterSpans.push_back(centerSpanData(centerSpansType(settings->value("Num", 0).toUInt()), + settings->value("Name", "").toString(), settings->value("Freq", 0).toUInt())); } settings->endArray(); } @@ -4728,7 +4423,8 @@ void rigCommander::determineRigCaps() for (int c = 0; c < numInputs; c++) { settings->setArrayIndex(c); - rigCaps.inputs.append(rigInput((inputTypes)settings->value("Num", 0).toString().toUInt(nullptr,16),settings->value("Name", "").toString())); + rigCaps.inputs.append(rigInput(inputTypes(settings->value("Num", 0).toUInt()), + settings->value("Reg", 0).toString().toUInt(nullptr,16),settings->value("Name", "").toString())); } settings->endArray(); } @@ -4741,7 +4437,8 @@ void rigCommander::determineRigCaps() for (int c = 0; c < numSteps; c++) { settings->setArrayIndex(c); - rigCaps.steps.push_back(stepType(settings->value("Num", 0).toString().toUInt(),settings->value("Name", "").toString(),settings->value("Hz", 0ULL).toULongLong())); + rigCaps.steps.push_back(stepType(settings->value("Num", 0).toString().toUInt(), + settings->value("Name", "").toString(),settings->value("Hz", 0ULL).toULongLong())); } settings->endArray(); } @@ -5683,7 +5380,7 @@ void rigCommander::determineRigCaps() rigCaps.hasATU = true; rigCaps.hasDV = true; rigCaps.hasTBPF = true; - rigCaps.hasRepeaterModes = true; + rigCaps.hasRepeaterModes = true rigCaps.preamps.push_back('\x01'); rigCaps.preamps.push_back('\x02'); rigCaps.attenuators.insert(rigCaps.attenuators.end(),{ '\x20' }); @@ -5770,19 +5467,22 @@ void rigCommander::determineRigCaps() } } -void rigCommander::parseSpectrum() +bool rigCommander::parseSpectrum(scopeData& d) { + bool ret = false; + if(!haveRigCaps) { qDebug(logRig()) << "Spectrum received in rigCommander, but rigID is incomplete."; - return; + return ret; } if(rigCaps.spectSeqMax == 0) { // there is a chance this will happen with rigs that support spectrum. Once our RigID query returns, we will parse correctly. qInfo(logRig()) << "Warning: Spectrum sequence max was zero, yet spectrum was received."; - return; + return ret; } + // Here is what to expect: // payloadIn[00] = '\x27'; // payloadIn[01] = '\x00'; @@ -5818,17 +5518,11 @@ void rigCommander::parseSpectrum() freqt fStart; freqt fEnd; - unsigned char vfo = bcdHexToUChar(payloadIn[02]); + d.mainSub = bcdHexToUChar(payloadIn[02]); unsigned char sequence = bcdHexToUChar(payloadIn[03]); //unsigned char sequenceMax = bcdHexToDecimal(payloadIn[04]); - if (vfo == 1) - { - // This is for the second VFO! - return; - } - // unsigned char waveInfo = payloadIn[06]; // really just one byte? //qInfo(logRig()) << "Spectrum Data received: " << sequence << "/" << sequenceMax << " mode: " << scopeMode << " waveInfo: " << waveInfo << " length: " << payloadIn.length(); @@ -5858,12 +5552,12 @@ void rigCommander::parseSpectrum() if(payloadIn.length() >= 15) { - bool outOfRange = (bool)payloadIn[16]; - if(outOfRange != wasOutOfRange) + d.oor=(bool)payloadIn[16]; + if(d.oor != wasOutOfRange) { - emit haveScopeOutOfRange(outOfRange); - wasOutOfRange = outOfRange; - return; + emit haveScopeOutOfRange(d.oor); + wasOutOfRange = d.oor; + return false; } } @@ -5879,31 +5573,40 @@ void rigCommander::parseSpectrum() // "center" mode, start is actual center, end is bandwidth. spectrumStartFreq -= spectrumEndFreq; spectrumEndFreq = spectrumStartFreq + 2*(spectrumEndFreq); + d.startFreq = spectrumStartFreq; + d.endFreq = spectrumEndFreq; // emit haveSpectrumCenterSpan(span); } if (payloadIn.length() > 400) // Must be a LAN packet. { payloadIn.chop(1); - //spectrumLine.append(payloadIn.mid(17,475)); // write over the FD, last one doesn't, oh well. - spectrumLine.append(payloadIn.right(payloadIn.length()-17)); // write over the FD, last one doesn't, oh well. - emit haveSpectrumData(spectrumLine, spectrumStartFreq, spectrumEndFreq); + d.data.append(payloadIn.right(payloadIn.length()-17)); // write over the FD, last one doesn't, oh well. + ret = true; + //emit haveSpectrumData(spectrumLine, spectrumStartFreq, spectrumEndFreq); } - } else if ((sequence > 1) && (sequence < rigCaps.spectSeqMax)) + } + else if ((sequence > 1) && (sequence < rigCaps.spectSeqMax)) { // spectrum from index 05 to index 54, length is 55 per segment. Length is 56 total. Pixel data is 50 pixels. // sequence numbers 2 through 10, 50 pixels each. Total after sequence 10 is 450 pixels. payloadIn.chop(1); spectrumLine.insert(spectrumLine.length(), payloadIn.right(payloadIn.length() - 5)); // write over the FD, last one doesn't, oh well. + ret = true; //qInfo(logRig()) << "sequence: " << sequence << "spec index: " << (sequence-2)*55 << " payloadPosition: " << payloadIn.length() - 5 << " payload length: " << payloadIn.length(); } else if (sequence == rigCaps.spectSeqMax) { // last spectrum, a little bit different (last 25 pixels). Total at end is 475 pixels (7300). payloadIn.chop(1); spectrumLine.insert(spectrumLine.length(), payloadIn.right(payloadIn.length() - 5)); + d.data = spectrumLine; + ret = true; //qInfo(logRig()) << "sequence: " << sequence << " spec index: " << (sequence-2)*55 << " payloadPosition: " << payloadIn.length() - 5 << " payload length: " << payloadIn.length(); - emit haveSpectrumData(spectrumLine, spectrumStartFreq, spectrumEndFreq); + + //emit haveSpectrumData(spectrumLine, spectrumStartFreq, spectrumEndFreq); } + d.valid=ret; + return ret; } void rigCommander::parseSpectrumRefLevel() @@ -6013,7 +5716,7 @@ QByteArray rigCommander::bcdEncodeChar(unsigned char num) -void rigCommander::parseFrequency() +freqt rigCommander::parseFrequency() { freqt freq; freq.Hz = 0; @@ -6068,14 +5771,7 @@ void rigCommander::parseFrequency() freq.MHzDouble = frequencyMhz; - if (state.getChar(CURRENTVFO) == 0) { - state.set(VFOAFREQ, freq.Hz, false); - } - else { - state.set(VFOBFREQ, freq.Hz, false); - } - - emit haveFrequency(freq); + return freq; } freqt rigCommander::parseFrequencyRptOffset(QByteArray data) @@ -6168,86 +5864,100 @@ quint64 rigCommander::parseFreqDataToInt(QByteArray data) } -void rigCommander::parseMode(quint8 mode, quint8 filter) +mode_info rigCommander::parseMode(quint8 mode, quint8 filter) { - quint16 pass = 0; + mode_info mi; + bool found=false; + foreach (auto& m, rigCaps.modes) + { + if (m.reg == mode) + { + mi = mode_info(m); + found = true; + break; + } + } + if (!found) + qInfo(logRig()) << QString("parseMode() Couldn't find a matching mode %0 with filter %1").arg(mode).arg(filter); - if (!state.isValid(PASSBAND)) { + cacheItem item = queue->getCache(funcFilterWidth); + if (!item.value.isValid()) { /* We haven't got a valid passband from the rig so we need to create a 'fake' one from default values This will be replaced with a valid one if we get it */ - if (mode == 3 || mode == 7 || mode == 12 || mode == 17) { + if (mi.mk == modeCW || mi.mk == modeCW_R || mi.mk == modePSK || mi.mk == modePSK_R) { switch (filter) { case 1: - pass=1200; + mi.pass=1200; break; case 2: - pass=500; + mi.pass=500; break; case 3: - pass=250; + mi.pass=250; break; } } - else if (mode == 4 || mode == 8) + else if (mi.mk == modeRTTY || mi.mk == modeRTTY_R) { switch (filter) { case 1: - pass=2400; + mi.pass=2400; break; case 2: - pass=500; + mi.pass=500; break; case 3: - pass=250; + mi.pass=250; break; } } - else if (mode == 2) + else if (mi.mk == modeAM) { switch (filter) { case 1: - pass=9000; + mi.pass=9000; break; case 2: - pass=6000; + mi.pass=6000; break; case 3: - pass=3000; + mi.pass=3000; break; } } - else if (mode == 5) + else if (mi.mk == modeFM) { switch (filter) { case 1: - pass=15000; + mi.pass=15000; break; case 2: - pass=10000; + mi.pass=10000; break; case 3: - pass=7000; + mi.pass=7000; break; } } else { // SSB or unknown mode switch (filter) { case 1: - pass=3000; + mi.pass=3000; break; case 2: - pass=2400; + mi.pass=2400; break; case 3: - pass=1800; + mi.pass=1800; break; } } } - state.set(PASSBAND, pass, false); + + return mi; } @@ -7160,6 +6870,8 @@ uchar rigCommander::makeFilterWidth(ushort pass) void rigCommander::receiveCommand(queueItemType type, funcs func, QVariant value) { + Q_UNUSED(type) + //qInfo() << "Got command:" << funcString[func]; int val=INT_MIN; if (value.isValid()) { @@ -7218,25 +6930,36 @@ void rigCommander::receiveCommand(queueItemType type, funcs func, QVariant value if (func == funcDataModeWithFilter) { payload.append(value.value().data); - if (value.value().data) + if (value.value().data != 0) payload.append(value.value().filter); } else { payload.append(value.value().reg); + if (func == funcSelectedMode || func == funcUnselectedMode) + payload.append(value.value().data); payload.append(value.value().filter); } } else if(!strcmp(value.typeName(),"freqt")) { - if (func == funcMainSubFreq) { - payload.append(value.value().VFO); - } - if (func == funcSendFreqOffset) { payload.append(makeFreqPayload(value.value()).mid(1,3)); } else { payload.append(makeFreqPayload(value.value())); } } + else if(!strcmp(value.typeName(),"antennaInfo")) + { + payload.append(value.value().antenna); + payload.append(value.value().rx); + } + else if(!strcmp(value.typeName(),"rigInput")) + { + payload.append(bcdEncodeChar(value.value().reg)); + } + else if (!strcmp(value.typeName(),"memoryType")) + { + payload.append(setMemory(value.value())); + } else { qInfo(logRig()) << "Got unknown value type" << QString(value.typeName()); diff --git a/rigcommander.h b/rigcommander.h index a0ec5ab..1ec7d85 100644 --- a/rigcommander.h +++ b/rigcommander.h @@ -169,7 +169,6 @@ public slots: void setMemoryMode(); void getMemory(quint32 mem); void getSatMemory(quint32 mem); - void setMemory(memoryType mem); void clearMemory(quint32 mem); void recallMemory(quint32 mem); @@ -179,8 +178,8 @@ public slots: void getAfGain(); void getSql(); void getIFShift(); - void getTPBFInner(); - void getTPBFOuter(); + void getPBTInner(); + void getPBTOuter(); void getTxLevel(); void getMicGain(); void getCompLevel(); @@ -201,8 +200,8 @@ public slots: void setRfGain(unsigned char level); void setAfGain(unsigned char level); void setIFShift(unsigned char level); - void setTPBFInner(unsigned char level); - void setTPBFOuter(unsigned char level); + void setPBTInner(unsigned char level); + void setPBTOuter(unsigned char level); void setTxPower(unsigned char power); void setMicGain(unsigned char gain); void setUSBGain(unsigned char gain); @@ -348,8 +347,8 @@ signals: void haveRfGain(unsigned char level); void haveAfGain(unsigned char level); void haveSql(unsigned char level); - void haveTPBFInner(unsigned char level); - void haveTPBFOuter(unsigned char level); + void havePBTInner(unsigned char level); + void havePBTOuter(unsigned char level); void haveIFShift(unsigned char level); void haveTxPower(unsigned char level); void haveMicGain(unsigned char level); @@ -408,6 +407,7 @@ signals: void selectedRadio(quint8 radio); void getMoreDebug(); void finished(); + void haveReceivedValue(funcs func, QVariant value); private: void commonSetup(); @@ -419,18 +419,20 @@ private: unsigned int bcdHexToUInt(unsigned char hundreds, unsigned char tensunits); QByteArray bcdEncodeChar(unsigned char num); QByteArray bcdEncodeInt(unsigned int); - void parseFrequency(); + QByteArray setMemory(memoryType mem); + freqt parseFrequency(); freqt parseFrequency(QByteArray data, unsigned char lastPosition); // supply index where Mhz is found quint64 parseFreqDataToInt(QByteArray data); freqt parseFrequencyRptOffset(QByteArray data); + bool parseMemory(QVector* memParser, memoryType* mem); QByteArray makeFreqPayloadRptOffset(freqt freq); QByteArray makeFreqPayload(double frequency); QByteArray makeFreqPayload(freqt freq); QByteArray encodeTone(quint16 tone, bool tinv, bool rinv); QByteArray encodeTone(quint16 tone); unsigned char convertNumberToHex(unsigned char num); - quint16 decodeTone(QByteArray eTone); - quint16 decodeTone(QByteArray eTone, bool &tinv, bool &rinv); + toneInfo decodeTone(QByteArray eTone); + //quint16 decodeTone(QByteArray eTone, bool &tinv, bool &rinv); uchar makeFilterWidth(ushort width); @@ -439,8 +441,8 @@ private: unsigned char audioLevelTxMean[50]; unsigned char audioLevelTxPeak[50]; - void parseMode(quint8 mode, quint8 filter); - void parseSpectrum(); + mode_info parseMode(quint8 mode, quint8 filter); + bool parseSpectrum(scopeData& d); void parseWFData(); void parseSpectrumRefLevel(); void parseDetailedRegisters1A05(); diff --git a/rigcreator.cpp b/rigcreator.cpp index ad437e7..fcd5db7 100644 --- a/rigcreator.cpp +++ b/rigcreator.cpp @@ -166,9 +166,9 @@ void rigCreator::loadRigFile(QString file) { settings->setArrayIndex(c); ui->inputs->insertRow(ui->inputs->rowCount()); - ui->inputs->model()->setData(ui->inputs->model()->index(c,0),QString::number(settings->value("Num", 0).toUInt(),16).rightJustified(2,'0')); - ui->inputs->model()->setData(ui->inputs->model()->index(c,1),settings->value("Name", "").toString()); - + ui->inputs->model()->setData(ui->inputs->model()->index(c,0),QString::number(settings->value("Num", 0).toUInt()).rightJustified(2,'0')); + ui->inputs->model()->setData(ui->inputs->model()->index(c,1),QString::number(settings->value("Reg", 0).toUInt(),16).rightJustified(2,'0')); + ui->inputs->model()->setData(ui->inputs->model()->index(c,2),settings->value("Name", "").toString()); } settings->endArray(); } @@ -395,8 +395,9 @@ void rigCreator::saveRigFile(QString file) for (int n = 0; ninputs->rowCount();n++) { settings->setArrayIndex(n); - settings->setValue("Num", (ui->inputs->item(n,0) == NULL) ? 0 : ui->inputs->item(n,0)->text().toUInt(nullptr,16)); - settings->setValue("Name", (ui->inputs->item(n,1) == NULL) ? "" : ui->inputs->item(n,1)->text()); + settings->setValue("Num", (ui->inputs->item(n,0) == NULL) ? 0 : ui->inputs->item(n,0)->text().toUInt()); + settings->setValue("Reg", (ui->inputs->item(n,1) == NULL) ? 0 : ui->inputs->item(n,1)->text().toUInt(nullptr,16)); + settings->setValue("Name", (ui->inputs->item(n,2) == NULL) ? "" : ui->inputs->item(n,2)->text()); } settings->endArray(); @@ -496,13 +497,15 @@ QStandardItemModel* rigCreator::createModel(QStandardItemModel* model, QString s for (int i=0; i < NUMFUNCS;i++) { - QStandardItem *itemName = new QStandardItem(strings[i]); - QStandardItem *itemId = new QStandardItem(i); + if (!strings[i].startsWith('-')) { + QStandardItem *itemName = new QStandardItem(strings[i]); + QStandardItem *itemId = new QStandardItem(i); - QList row; - row << itemName << itemId; + QList row; + row << itemName << itemId; - model->appendRow(row); + model->appendRow(row); + } } return model; diff --git a/rigcreator.ui b/rigcreator.ui index a875d02..315f775 100644 --- a/rigcreator.ui +++ b/rigcreator.ui @@ -287,7 +287,7 @@ 10 50 - 151 + 191 171 @@ -299,7 +299,7 @@ 0 30 - 151 + 191 141 @@ -322,13 +322,13 @@ 0 - 2 + 3 0 - 60 + 56 false @@ -344,6 +344,11 @@ Num + + + Reg + + Name @@ -514,9 +519,9 @@ - 170 + 210 50 - 261 + 221 171 @@ -528,7 +533,7 @@ 0 30 - 261 + 221 141 @@ -554,7 +559,7 @@ 0 - 60 + 50 false diff --git a/rigidentities.h b/rigidentities.h index b67b2bb..403e18d 100644 --- a/rigidentities.h +++ b/rigidentities.h @@ -50,13 +50,16 @@ enum model_kind { enum inputTypes{ inputMic=0, - inputACC=1, - inputMICACC=2, + inputACCA=1, + inputACCB=2, inputUSB=3, - inputMICUSB=4, - inputLAN=5, - inputACCA=6, - inputACCB=7, + inputLAN=4, + inputMICACCA=5, + inputMICACCB=6, + inputACCAACCB=7, + inputMICACCAACCB=8, + inputSPDIF=9, + inputMICUSB=10, inputNone, inputUnknown=0xff }; @@ -64,9 +67,11 @@ enum inputTypes{ inputMic=0, struct rigInput { rigInput() {} rigInput(inputTypes type) : type(type) {} - rigInput(inputTypes type, QString name) : type(type), name(name) {} - inputTypes type = inputNone; + rigInput(inputTypes type, uchar reg, QString name) : type(type), reg(reg), name(name) {} + inputTypes type = inputUnknown; + uchar reg = 0; QString name = ""; + uchar level = 0; }; diff --git a/rigs/IC-705.rig b/rigs/IC-705.rig index b6ea158..0eec043 100644 --- a/rigs/IC-705.rig +++ b/rigs/IC-705.rig @@ -524,131 +524,131 @@ Inputs\3\Name=M/U Inputs\4\Num=3 Inputs\4\Name=WLAN Inputs\size=4 -Bands\1\Num=23 -Bands\1\BSR=15 -Bands\1\Name=60m -Bands\1\Start=5250000 -Bands\1\End=5450000 -Bands\1\Range=0 +Bands\1\Num=20 +Bands\1\BSR=1 +Bands\1\Name=160m +Bands\1\Start=1800000 +Bands\1\End=2000000 +Bands\1\Range=2 Bands\1\MemoryGroup=-1 -Bands\2\Num=22 -Bands\2\BSR=15 -Bands\2\Name=Gen -Bands\2\Start=10000 -Bands\2\End=30000000 -Bands\2\Range=1.6 +Bands\2\Num=19 +Bands\2\BSR=2 +Bands\2\Name=80m +Bands\2\Start=3500000 +Bands\2\End=4000000 +Bands\2\Range=6 Bands\2\MemoryGroup=-1 -Bands\3\Num=21 -Bands\3\BSR=15 -Bands\3\Name=2200m -Bands\3\Start=135000 -Bands\3\End=138000 -Bands\3\Range=0 +Bands\3\Num=17 +Bands\3\BSR=3 +Bands\3\Name=40m +Bands\3\Start=7000000 +Bands\3\End=7300000 +Bands\3\Range=11 Bands\3\MemoryGroup=-1 -Bands\4\Num=20 -Bands\4\BSR=1 -Bands\4\Name=160m -Bands\4\Start=1800000 -Bands\4\End=2000000 -Bands\4\Range=2 +Bands\4\Num=16 +Bands\4\BSR=4 +Bands\4\Name=30m +Bands\4\Start=10100000 +Bands\4\End=10150000 +Bands\4\Range=15 Bands\4\MemoryGroup=-1 -Bands\5\Num=19 -Bands\5\BSR=2 -Bands\5\Name=80m -Bands\5\Start=3500000 -Bands\5\End=4000000 -Bands\5\Range=6 +Bands\5\Num=15 +Bands\5\BSR=5 +Bands\5\Name=20m +Bands\5\Start=14000000 +Bands\5\End=14350000 +Bands\5\Range=20 Bands\5\MemoryGroup=-1 -Bands\6\Num=18 -Bands\6\BSR=15 -Bands\6\Name=630m -Bands\6\Start=493000 -Bands\6\End=595000 -Bands\6\Range=8 +Bands\6\Num=14 +Bands\6\BSR=6 +Bands\6\Name=17m +Bands\6\Start=18068000 +Bands\6\End=18168000 +Bands\6\Range=22 Bands\6\MemoryGroup=-1 -Bands\7\Num=17 -Bands\7\BSR=3 -Bands\7\Name=40m -Bands\7\Start=7000000 -Bands\7\End=7300000 -Bands\7\Range=11 +Bands\7\Num=13 +Bands\7\BSR=7 +Bands\7\Name=15m +Bands\7\Start=21000000 +Bands\7\End=21450000 +Bands\7\Range=26 Bands\7\MemoryGroup=-1 -Bands\8\Num=16 -Bands\8\BSR=4 -Bands\8\Name=30m -Bands\8\Start=10100000 -Bands\8\End=10150000 -Bands\8\Range=15 +Bands\8\Num=12 +Bands\8\BSR=8 +Bands\8\Name=12m +Bands\8\Start=24890000 +Bands\8\End=24990000 +Bands\8\Range=30 Bands\8\MemoryGroup=-1 -Bands\9\Num=15 -Bands\9\BSR=5 -Bands\9\Name=20m -Bands\9\Start=14000000 -Bands\9\End=14350000 -Bands\9\Range=20 +Bands\9\Num=11 +Bands\9\BSR=9 +Bands\9\Name=10m +Bands\9\Start=28000000 +Bands\9\End=29700000 +Bands\9\Range=45 Bands\9\MemoryGroup=-1 -Bands\10\Num=14 -Bands\10\BSR=6 -Bands\10\Name=17m -Bands\10\Start=18068000 -Bands\10\End=18168000 -Bands\10\Range=22 +Bands\10\Num=10 +Bands\10\BSR=16 +Bands\10\Name=6m +Bands\10\Start=50000000 +Bands\10\End=54000000 +Bands\10\Range=60 Bands\10\MemoryGroup=-1 -Bands\11\Num=13 -Bands\11\BSR=7 -Bands\11\Name=15m -Bands\11\Start=21000000 -Bands\11\End=21450000 -Bands\11\Range=26 +Bands\11\Num=8 +Bands\11\BSR=17 +Bands\11\Name=WFM +Bands\11\Start=74800000 +Bands\11\End=74800000 +Bands\11\Range=108 Bands\11\MemoryGroup=-1 -Bands\12\Num=12 -Bands\12\BSR=8 -Bands\12\Name=12m -Bands\12\Start=24890000 -Bands\12\End=24990000 -Bands\12\Range=30 +Bands\12\Num=7 +Bands\12\BSR=18 +Bands\12\Name=Air +Bands\12\Start=108000000 +Bands\12\End=0 +Bands\12\Range=137 Bands\12\MemoryGroup=-1 -Bands\13\Num=11 -Bands\13\BSR=9 -Bands\13\Name=10m -Bands\13\Start=28000000 -Bands\13\End=29700000 -Bands\13\Range=45 +Bands\13\Num=6 +Bands\13\BSR=19 +Bands\13\Name=2m +Bands\13\Start=144000000 +Bands\13\End=148000000 +Bands\13\Range=148 Bands\13\MemoryGroup=-1 -Bands\14\Num=10 -Bands\14\BSR=10 -Bands\14\Name=6m -Bands\14\Start=50000000 -Bands\14\End=54000000 -Bands\14\Range=60 +Bands\14\Num=5 +Bands\14\BSR=20 +Bands\14\Name=70cm +Bands\14\Start=420000000 +Bands\14\End=450000000 +Bands\14\Range=450 Bands\14\MemoryGroup=-1 -Bands\15\Num=8 -Bands\15\BSR=11 -Bands\15\Name=WFM -Bands\15\Start=74800000 -Bands\15\End=74800000 -Bands\15\Range=108 +Bands\15\Num=18 +Bands\15\BSR=21 +Bands\15\Name=630m +Bands\15\Start=493000 +Bands\15\End=595000 +Bands\15\Range=8 Bands\15\MemoryGroup=-1 -Bands\16\Num=7 -Bands\16\BSR=12 -Bands\16\Name=Air -Bands\16\Start=108000000 -Bands\16\End=0 -Bands\16\Range=137 +Bands\16\Num=21 +Bands\16\BSR=21 +Bands\16\Name=2200m +Bands\16\Start=135000 +Bands\16\End=138000 +Bands\16\Range=0 Bands\16\MemoryGroup=-1 -Bands\17\Num=6 -Bands\17\BSR=13 -Bands\17\Name=2m -Bands\17\Start=144000000 -Bands\17\End=148000000 -Bands\17\Range=148 +Bands\17\Num=22 +Bands\17\BSR=21 +Bands\17\Name=Gen +Bands\17\Start=10000 +Bands\17\End=30000000 +Bands\17\Range=1.6 Bands\17\MemoryGroup=-1 -Bands\18\Num=5 -Bands\18\BSR=14 -Bands\18\Name=70cm -Bands\18\Start=420000000 -Bands\18\End=450000000 -Bands\18\Range=450 +Bands\18\Num=23 +Bands\18\BSR=21 +Bands\18\Name=60m +Bands\18\Start=5250000 +Bands\18\End=5450000 +Bands\18\Range=0 Bands\18\MemoryGroup=-1 Bands\size=18 Modes\1\Num=0 @@ -688,7 +688,7 @@ Modes\9\Reg=8 Modes\9\Name=RTTY-R Modes\9\BW=1 Modes\10\Num=12 -Modes\10\Reg=17 +Modes\10\Reg=23 Modes\10\Name=DV Modes\10\BW=1 Modes\size=10 @@ -742,16 +742,16 @@ Tuning%20Steps\12\Hz=10000 Tuning%20Steps\13\Num=9 Tuning%20Steps\13\Name=12.5 KHz Tuning%20Steps\13\Hz=12500 -Tuning%20Steps\14\Num=10 +Tuning%20Steps\14\Num=16 Tuning%20Steps\14\Name=20 KHz Tuning%20Steps\14\Hz=20000 -Tuning%20Steps\15\Num=11 +Tuning%20Steps\15\Num=17 Tuning%20Steps\15\Name=25 KHz Tuning%20Steps\15\Hz=25000 -Tuning%20Steps\16\Num=12 +Tuning%20Steps\16\Num=18 Tuning%20Steps\16\Name=50 Khz Tuning%20Steps\16\Hz=50000 -Tuning%20Steps\17\Num=13 +Tuning%20Steps\17\Num=19 Tuning%20Steps\17\Name=100 Khz Tuning%20Steps\17\Hz=100000 Tuning%20Steps\18\Num=0 diff --git a/rigs/IC-7100.rig b/rigs/IC-7100.rig index 8428156..09fc6bb 100644 --- a/rigs/IC-7100.rig +++ b/rigs/IC-7100.rig @@ -80,11 +80,11 @@ Commands\14\Max=12 Commands\15\Type=Tuning Step Commands\15\String=\\x10 Commands\15\Min=0 -Commands\15\Max=8 +Commands\15\Max=18 Commands\16\Type=Attenuator Status Commands\16\String=\\x11 Commands\16\Min=0 -Commands\16\Max=18 +Commands\16\Max=32 Commands\17\Type=Speech Commands\17\String=\\x13 Commands\17\Min=0 @@ -269,31 +269,43 @@ Commands\62\Type=RIT Frequency Commands\62\String=\\x21\\x01 Commands\62\Min=0 Commands\62\Max=1 -Commands\63\Type=Main/Sub Freq -Commands\63\String=\\x25 +Commands\63\Type=Selected Freq +Commands\63\String=\\x25\\x00 Commands\63\Min=0 -Commands\63\Max=1 -Commands\64\Type=Main/Sub Mode -Commands\64\String=\\x26 +Commands\63\Max=0 +Commands\64\Type=Unselected Freq +Commands\64\String=\\x25\\x01 Commands\64\Min=0 -Commands\64\Max=1 -Commands\65\Type=Command Error FA -Commands\65\String=\\xfa +Commands\64\Max=0 +Commands\65\Type=Selected Mode +Commands\65\String=\\x26\\x00 Commands\65\Min=0 Commands\65\Max=0 -Commands\66\Type=Command OK FB -Commands\66\String=\\xfb +Commands\66\Type=Unselected Mode +Commands\66\String=\\x26\\x01 Commands\66\Min=0 Commands\66\Max=0 -Commands\size=66 +Commands\67\Type=Command Error FA +Commands\67\String=\\xfa +Commands\67\Min=0 +Commands\67\Max=0 +Commands\68\Type=Command OK FB +Commands\68\String=\\xfb +Commands\68\Min=0 +Commands\68\Max=0 +Commands\size=68 Spans\size=0 Inputs\1\Num=0 +Inputs\1\Reg=0 Inputs\1\Name=MIC Inputs\2\Num=1 +Inputs\2\Reg=0 Inputs\2\Name=ACC Inputs\3\Num=2 +Inputs\3\Reg=0 Inputs\3\Name=MIC/ACC Inputs\4\Num=3 +Inputs\4\Reg=0 Inputs\4\Name=USB Inputs\size=4 Bands\1\Num=20 @@ -303,117 +315,117 @@ Bands\1\Start=1800000 Bands\1\End=2000000 Bands\1\Range=2 Bands\1\MemoryGroup=-1 -Bands\2\Num=10 -Bands\2\BSR=10 -Bands\2\Name=6m -Bands\2\Start=50000000 -Bands\2\End=54000000 -Bands\2\Range=60 +Bands\2\Num=19 +Bands\2\BSR=2 +Bands\2\Name=80m +Bands\2\Start=3500000 +Bands\2\End=4000000 +Bands\2\Range=6 Bands\2\MemoryGroup=-1 -Bands\3\Num=6 -Bands\3\BSR=11 -Bands\3\Name=2m -Bands\3\Start=144000000 -Bands\3\End=148000000 -Bands\3\Range=148 +Bands\3\Num=17 +Bands\3\BSR=3 +Bands\3\Name=40m +Bands\3\Start=7000000 +Bands\3\End=7300000 +Bands\3\Range=11 Bands\3\MemoryGroup=-1 -Bands\4\Num=5 -Bands\4\BSR=12 -Bands\4\Name=70cm -Bands\4\Start=430000000 -Bands\4\End=450000000 -Bands\4\Range=450 +Bands\4\Num=16 +Bands\4\BSR=4 +Bands\4\Name=30m +Bands\4\Start=10100000 +Bands\4\End=10150000 +Bands\4\Range=15 Bands\4\MemoryGroup=-1 -Bands\5\Num=23 -Bands\5\BSR=13 -Bands\5\Name=Gen -Bands\5\Start=10000 -Bands\5\End=30000000 -Bands\5\Range=1.6 +Bands\5\Num=15 +Bands\5\BSR=5 +Bands\5\Name=20m +Bands\5\Start=14000000 +Bands\5\End=14350000 +Bands\5\Range=20 Bands\5\MemoryGroup=-1 -Bands\6\Num=9 -Bands\6\BSR=13 -Bands\6\Name=4m -Bands\6\Start=70000000 -Bands\6\End=70500000 -Bands\6\Range=0 +Bands\6\Num=14 +Bands\6\BSR=6 +Bands\6\Name=17m +Bands\6\Start=18068000 +Bands\6\End=18168000 +Bands\6\Range=22 Bands\6\MemoryGroup=-1 -Bands\7\Num=18 -Bands\7\BSR=13 -Bands\7\Name=60m -Bands\7\Start=5250000 -Bands\7\End=5450000 -Bands\7\Range=0 +Bands\7\Num=13 +Bands\7\BSR=7 +Bands\7\Name=15m +Bands\7\Start=21000000 +Bands\7\End=21450000 +Bands\7\Range=26 Bands\7\MemoryGroup=-1 -Bands\8\Num=21 -Bands\8\BSR=13 -Bands\8\Name=630m -Bands\8\Start=493000 -Bands\8\End=595000 -Bands\8\Range=8 +Bands\8\Num=12 +Bands\8\BSR=8 +Bands\8\Name=12m +Bands\8\Start=24890000 +Bands\8\End=24990000 +Bands\8\Range=30 Bands\8\MemoryGroup=-1 -Bands\9\Num=22 -Bands\9\BSR=13 -Bands\9\Name=2200m -Bands\9\Start=135000 -Bands\9\End=138000 -Bands\9\Range=0 +Bands\9\Num=11 +Bands\9\BSR=9 +Bands\9\Name=10m +Bands\9\Start=28000000 +Bands\9\End=29700000 +Bands\9\Range=45 Bands\9\MemoryGroup=-1 -Bands\10\Num=19 -Bands\10\BSR=2 -Bands\10\Name=80m -Bands\10\Start=3500000 -Bands\10\End=4000000 -Bands\10\Range=6 +Bands\10\Num=10 +Bands\10\BSR=16 +Bands\10\Name=6m +Bands\10\Start=50000000 +Bands\10\End=54000000 +Bands\10\Range=60 Bands\10\MemoryGroup=-1 -Bands\11\Num=17 -Bands\11\BSR=3 -Bands\11\Name=40m -Bands\11\Start=7000000 -Bands\11\End=7300000 -Bands\11\Range=11 +Bands\11\Num=6 +Bands\11\BSR=17 +Bands\11\Name=2m +Bands\11\Start=144000000 +Bands\11\End=148000000 +Bands\11\Range=148 Bands\11\MemoryGroup=-1 -Bands\12\Num=16 -Bands\12\BSR=4 -Bands\12\Name=30m -Bands\12\Start=10100000 -Bands\12\End=10150000 -Bands\12\Range=15 +Bands\12\Num=5 +Bands\12\BSR=18 +Bands\12\Name=70cm +Bands\12\Start=430000000 +Bands\12\End=450000000 +Bands\12\Range=450 Bands\12\MemoryGroup=-1 -Bands\13\Num=15 -Bands\13\BSR=5 -Bands\13\Name=20m -Bands\13\Start=14000000 -Bands\13\End=14350000 -Bands\13\Range=20 +Bands\13\Num=9 +Bands\13\BSR=19 +Bands\13\Name=4m +Bands\13\Start=70000000 +Bands\13\End=70500000 +Bands\13\Range=0 Bands\13\MemoryGroup=-1 -Bands\14\Num=14 -Bands\14\BSR=6 -Bands\14\Name=17m -Bands\14\Start=18068000 -Bands\14\End=18168000 -Bands\14\Range=22 +Bands\14\Num=18 +Bands\14\BSR=19 +Bands\14\Name=60m +Bands\14\Start=5250000 +Bands\14\End=5450000 +Bands\14\Range=0 Bands\14\MemoryGroup=-1 -Bands\15\Num=13 -Bands\15\BSR=7 -Bands\15\Name=15m -Bands\15\Start=21000000 -Bands\15\End=21450000 -Bands\15\Range=26 +Bands\15\Num=21 +Bands\15\BSR=19 +Bands\15\Name=630m +Bands\15\Start=493000 +Bands\15\End=595000 +Bands\15\Range=8 Bands\15\MemoryGroup=-1 -Bands\16\Num=12 -Bands\16\BSR=8 -Bands\16\Name=12m -Bands\16\Start=24890000 -Bands\16\End=24990000 -Bands\16\Range=30 +Bands\16\Num=22 +Bands\16\BSR=19 +Bands\16\Name=2200m +Bands\16\Start=135000 +Bands\16\End=138000 +Bands\16\Range=0 Bands\16\MemoryGroup=-1 -Bands\17\Num=11 -Bands\17\BSR=9 -Bands\17\Name=10m -Bands\17\Start=28000000 -Bands\17\End=29700000 -Bands\17\Range=45 +Bands\17\Num=23 +Bands\17\BSR=19 +Bands\17\Name=Gen +Bands\17\Start=10000 +Bands\17\End=30000000 +Bands\17\Range=1.6 Bands\17\MemoryGroup=-1 Bands\size=17 Modes\1\Num=0 @@ -448,13 +460,13 @@ Modes\8\Num=7 Modes\8\Reg=8 Modes\8\Name=RTTY-R Modes\8\BW=1 -Modes\9\Num=17 -Modes\9\Reg=12 +Modes\9\Num=12 +Modes\9\Reg=23 Modes\9\Name=DV Modes\9\BW=0 Modes\size=9 Attenuators\1\dB=0 -Attenuators\2\dB=12 +Attenuators\2\dB=18 Attenuators\size=2 Preamps\1\Num=0 Preamps\1\Name=OFF @@ -497,13 +509,13 @@ Tuning%20Steps\10\Hz=20000 Tuning%20Steps\11\Num=9 Tuning%20Steps\11\Name=25 KHz Tuning%20Steps\11\Hz=25000 -Tuning%20Steps\12\Num=10 +Tuning%20Steps\12\Num=16 Tuning%20Steps\12\Name=50 KHz Tuning%20Steps\12\Hz=50000 -Tuning%20Steps\13\Num=11 +Tuning%20Steps\13\Num=17 Tuning%20Steps\13\Name=100 KHz Tuning%20Steps\13\Hz=100000 -Tuning%20Steps\14\Num=12 +Tuning%20Steps\14\Num=18 Tuning%20Steps\14\Name=1 MHz Tuning%20Steps\14\Hz=1000000 Tuning%20Steps\size=14 diff --git a/rigs/IC-7300.rig b/rigs/IC-7300.rig index dea6763..b7acfe3 100644 --- a/rigs/IC-7300.rig +++ b/rigs/IC-7300.rig @@ -249,67 +249,75 @@ Commands\57\Type=RIT Frequency Commands\57\String=\\x21\\x01 Commands\57\Min=0 Commands\57\Max=1 -Commands\58\Type=Main/Sub Freq -Commands\58\String=\\x25 +Commands\58\Type=Selected Freq +Commands\58\String=\\x25\\x00 Commands\58\Min=0 -Commands\58\Max=1 -Commands\59\Type=Main/Sub Mode -Commands\59\String=\\x26 +Commands\58\Max=0 +Commands\59\Type=Unselected Freq +Commands\59\String=\\x25\\x01 Commands\59\Min=0 -Commands\59\Max=1 -Commands\60\Type=Scope Wave Data -Commands\60\String=\\x27\\x00 +Commands\59\Max=0 +Commands\60\Type=Selected Mode +Commands\60\String=\\x26\\x00 Commands\60\Min=0 Commands\60\Max=0 -Commands\61\Type=Scope On/Off -Commands\61\String=\\x27\\x10 +Commands\61\Type=Unselected Mode +Commands\61\String=\\x26\\x01 Commands\61\Min=0 -Commands\61\Max=1 +Commands\61\Max=0 Commands\62\Type=Scope Wave Data -Commands\62\String=\\x27\\x11 +Commands\62\String=\\x27\\x00 Commands\62\Min=0 -Commands\62\Max=1 -Commands\63\Type=Scope Center Fixed -Commands\63\String=\\x27\\x14 +Commands\62\Max=0 +Commands\63\Type=Scope On/Off +Commands\63\String=\\x27\\x10 Commands\63\Min=0 -Commands\63\Max=0 -Commands\64\Type=Scope Center Span -Commands\64\String=\\x27\\x15 +Commands\63\Max=1 +Commands\64\Type=Scope Wave Data +Commands\64\String=\\x27\\x11 Commands\64\Min=0 -Commands\64\Max=0 -Commands\65\Type=Scope Edge Number -Commands\65\String=\\x27\\x16 +Commands\64\Max=1 +Commands\65\Type=Scope Center Fixed +Commands\65\String=\\x27\\x14 Commands\65\Min=0 Commands\65\Max=0 -Commands\66\Type=Scope Hold -Commands\66\String=\\x27\\x17 +Commands\66\Type=Scope Center Span +Commands\66\String=\\x27\\x15 Commands\66\Min=0 -Commands\66\Max=1 -Commands\67\Type=Scope Ref -Commands\67\String=\\x27\\x19 +Commands\66\Max=0 +Commands\67\Type=Scope Edge Number +Commands\67\String=\\x27\\x16 Commands\67\Min=0 -Commands\67\Max=255 -Commands\68\Type=Scope Speed -Commands\68\String=\\x27\\x1a +Commands\67\Max=0 +Commands\68\Type=Scope Hold +Commands\68\String=\\x27\\x17 Commands\68\Min=0 -Commands\68\Max=255 -Commands\69\Type=Scope During TX -Commands\69\String=\\x27\\x1b +Commands\68\Max=1 +Commands\69\Type=Scope Ref +Commands\69\String=\\x27\\x19 Commands\69\Min=0 -Commands\69\Max=1 -Commands\70\Type=Scope Center Type -Commands\70\String=\\x27\\x1c +Commands\69\Max=255 +Commands\70\Type=Scope Speed +Commands\70\String=\\x27\\x1a Commands\70\Min=0 -Commands\70\Max=2 -Commands\71\Type=Command Error FA -Commands\71\String=\\xfa +Commands\70\Max=255 +Commands\71\Type=Scope During TX +Commands\71\String=\\x27\\x1b Commands\71\Min=0 -Commands\71\Max=0 -Commands\72\Type=Command OK FB -Commands\72\String=\\xfb +Commands\71\Max=1 +Commands\72\Type=Scope Center Type +Commands\72\String=\\x27\\x1c Commands\72\Min=0 -Commands\72\Max=0 -Commands\size=72 +Commands\72\Max=2 +Commands\73\Type=Command Error FA +Commands\73\String=\\xfa +Commands\73\Min=0 +Commands\73\Max=0 +Commands\74\Type=Command OK FB +Commands\74\String=\\xfb +Commands\74\Min=0 +Commands\74\Max=0 +Commands\size=74 Spans\1\Num=0 Spans\1\Name=±2.5 KHz Spans\1\Freq=2500 @@ -336,12 +344,16 @@ Spans\8\Name=±500 KHz Spans\8\Freq=500000 Spans\size=8 Inputs\1\Num=0 +Inputs\1\Reg=0 Inputs\1\Name=MIC Inputs\2\Num=1 +Inputs\2\Reg=0 Inputs\2\Name=ACC Inputs\3\Num=2 +Inputs\3\Reg=0 Inputs\3\Name=MIC/ACC Inputs\4\Num=3 +Inputs\4\Reg=0 Inputs\4\Name=USB Inputs\size=4 Bands\1\Num=9 @@ -351,47 +363,47 @@ Bands\1\Start=70000000 Bands\1\End=70500000 Bands\1\Range=0 Bands\1\MemoryGroup=-1 -Bands\2\Num=10 -Bands\2\BSR=10 -Bands\2\Name=6m -Bands\2\Start=50000000 -Bands\2\End=54000000 -Bands\2\Range=60 +Bands\2\Num=18 +Bands\2\BSR=0 +Bands\2\Name=60m +Bands\2\Start=5250000 +Bands\2\End=5450000 +Bands\2\Range=0 Bands\2\MemoryGroup=-1 -Bands\3\Num=11 -Bands\3\BSR=9 -Bands\3\Name=10m -Bands\3\Start=28000000 -Bands\3\End=29700000 -Bands\3\Range=45 +Bands\3\Num=21 +Bands\3\BSR=0 +Bands\3\Name=630m +Bands\3\Start=493000 +Bands\3\End=595000 +Bands\3\Range=8 Bands\3\MemoryGroup=-1 -Bands\4\Num=12 -Bands\4\BSR=8 -Bands\4\Name=12m -Bands\4\Start=24890000 -Bands\4\End=24990000 -Bands\4\Range=30 +Bands\4\Num=22 +Bands\4\BSR=0 +Bands\4\Name=2200m +Bands\4\Start=135000 +Bands\4\End=138000 +Bands\4\Range=0 Bands\4\MemoryGroup=-1 -Bands\5\Num=13 -Bands\5\BSR=7 -Bands\5\Name=15m -Bands\5\Start=21000000 -Bands\5\End=21450000 -Bands\5\Range=26 +Bands\5\Num=20 +Bands\5\BSR=1 +Bands\5\Name=160m +Bands\5\Start=1800000 +Bands\5\End=2000000 +Bands\5\Range=2 Bands\5\MemoryGroup=-1 -Bands\6\Num=14 -Bands\6\BSR=6 -Bands\6\Name=17m -Bands\6\Start=18068000 -Bands\6\End=18168000 -Bands\6\Range=22 +Bands\6\Num=19 +Bands\6\BSR=2 +Bands\6\Name=80m +Bands\6\Start=3500000 +Bands\6\End=4000000 +Bands\6\Range=6 Bands\6\MemoryGroup=-1 -Bands\7\Num=15 -Bands\7\BSR=5 -Bands\7\Name=20m -Bands\7\Start=14000000 -Bands\7\End=14350000 -Bands\7\Range=20 +Bands\7\Num=17 +Bands\7\BSR=3 +Bands\7\Name=40m +Bands\7\Start=7000000 +Bands\7\End=7300000 +Bands\7\Range=11 Bands\7\MemoryGroup=-1 Bands\8\Num=16 Bands\8\BSR=4 @@ -400,50 +412,50 @@ Bands\8\Start=10100000 Bands\8\End=10150000 Bands\8\Range=15 Bands\8\MemoryGroup=-1 -Bands\9\Num=17 -Bands\9\BSR=3 -Bands\9\Name=40m -Bands\9\Start=7000000 -Bands\9\End=7300000 -Bands\9\Range=11 +Bands\9\Num=15 +Bands\9\BSR=5 +Bands\9\Name=20m +Bands\9\Start=14000000 +Bands\9\End=14350000 +Bands\9\Range=20 Bands\9\MemoryGroup=-1 -Bands\10\Num=18 -Bands\10\BSR=0 -Bands\10\Name=60m -Bands\10\Start=5250000 -Bands\10\End=5450000 -Bands\10\Range=0 +Bands\10\Num=14 +Bands\10\BSR=6 +Bands\10\Name=17m +Bands\10\Start=18068000 +Bands\10\End=18168000 +Bands\10\Range=22 Bands\10\MemoryGroup=-1 -Bands\11\Num=19 -Bands\11\BSR=2 -Bands\11\Name=80m -Bands\11\Start=3500000 -Bands\11\End=4000000 -Bands\11\Range=6 +Bands\11\Num=13 +Bands\11\BSR=7 +Bands\11\Name=15m +Bands\11\Start=21000000 +Bands\11\End=21450000 +Bands\11\Range=26 Bands\11\MemoryGroup=-1 -Bands\12\Num=20 -Bands\12\BSR=1 -Bands\12\Name=160m -Bands\12\Start=1800000 -Bands\12\End=2000000 -Bands\12\Range=2 +Bands\12\Num=12 +Bands\12\BSR=8 +Bands\12\Name=12m +Bands\12\Start=24890000 +Bands\12\End=24990000 +Bands\12\Range=30 Bands\12\MemoryGroup=-1 -Bands\13\Num=21 -Bands\13\BSR=0 -Bands\13\Name=630m -Bands\13\Start=493000 -Bands\13\End=595000 -Bands\13\Range=8 +Bands\13\Num=11 +Bands\13\BSR=9 +Bands\13\Name=10m +Bands\13\Start=28000000 +Bands\13\End=29700000 +Bands\13\Range=45 Bands\13\MemoryGroup=-1 -Bands\14\Num=22 -Bands\14\BSR=0 -Bands\14\Name=2200m -Bands\14\Start=135000 -Bands\14\End=138000 -Bands\14\Range=0 +Bands\14\Num=10 +Bands\14\BSR=16 +Bands\14\Name=6m +Bands\14\Start=50000000 +Bands\14\End=54000000 +Bands\14\Range=60 Bands\14\MemoryGroup=-1 Bands\15\Num=23 -Bands\15\BSR=11 +Bands\15\BSR=17 Bands\15\Name=Gen Bands\15\Start=10000 Bands\15\End=30000000 diff --git a/rigs/IC-785x.rig b/rigs/IC-785x.rig index 11de671..e2df9db 100644 --- a/rigs/IC-785x.rig +++ b/rigs/IC-785x.rig @@ -21,527 +21,535 @@ MemStart=1 MemFormat=%1.2b %3.1c %4.5f %9.1g %10.1h %11.1k %12.3n %15.3o %18.10z SatMemories=0 SatFormat= -Commands\1\Type=Freq (TRX) -Commands\1\String=\\x00 +Commands\1\Type=ACC1 Mod Level +Commands\1\String=\\x1a\\x05\\x00\\x58 Commands\1\Min=0 -Commands\1\Max=0 -Commands\2\Type=Mode (TRX) -Commands\2\String=\\x01 +Commands\1\Max=255 +Commands\2\Type=ACC2 Mod Level +Commands\2\String=\\x1a\\x05\\x00\\x59 Commands\2\Min=0 -Commands\2\Max=0 -Commands\3\Type=Band Edge Freq -Commands\3\String=\\x02 +Commands\2\Max=255 +Commands\3\Type=AF Gain +Commands\3\String=\\x14\\x01 Commands\3\Min=0 -Commands\3\Max=0 -Commands\4\Type=Freq Get -Commands\4\String=\\x03 +Commands\3\Max=255 +Commands\4\Type=AGC Time Constant +Commands\4\String=\\x16\\x12 Commands\4\Min=0 -Commands\4\Max=0 -Commands\5\Type=Mode Get -Commands\5\String=\\x04 +Commands\4\Max=3 +Commands\5\Type=ALC Meter +Commands\5\String=\\x15\\x13 Commands\5\Min=0 -Commands\5\Max=0 -Commands\6\Type=Freq Set -Commands\6\String=\\x05 +Commands\5\Max=255 +Commands\6\Type=Antenna +Commands\6\String=\\x12 Commands\6\Min=0 -Commands\6\Max=0 -Commands\7\Type=Mode Set -Commands\7\String=\\x06 +Commands\6\Max=1 +Commands\7\Type=Anti-Vox Gain +Commands\7\String=\\x14\\x17 Commands\7\Min=0 -Commands\7\Max=0 -Commands\8\Type=VFO Swap M/S -Commands\8\String=\\x07\\xb0 +Commands\7\Max=255 +Commands\8\Type=APF Type Level +Commands\8\String=\\x14\\x05 Commands\8\Min=0 -Commands\8\Max=0 -Commands\9\Type=VFO Equal MS -Commands\9\String=\\x07\\xb1 +Commands\8\Max=255 +Commands\9\Type=Attenuator Status +Commands\9\String=\\x11 Commands\9\Min=0 -Commands\9\Max=0 -Commands\10\Type=VFO Dual Watch Off -Commands\10\String=\\x07\\xc0 +Commands\9\Max=69 +Commands\10\Type=Audio Peak Filter +Commands\10\String=\\x16\\x32 Commands\10\Min=0 -Commands\10\Max=0 -Commands\11\Type=VFO Dual Watch On -Commands\11\String=\\x07\\xc1 +Commands\10\Max=3 +Commands\11\Type=Auto Notch +Commands\11\String=\\x16\\x41 Commands\11\Min=0 -Commands\11\Max=0 -Commands\12\Type=VFO Dual Watch -Commands\12\String=\\x07\\xc2 +Commands\11\Max=1 +Commands\12\Type=Band Edge Freq +Commands\12\String=\\x02 Commands\12\Min=0 -Commands\12\Max=1 -Commands\13\Type=VFO Main Select -Commands\13\String=\\x07\\xd0 -Commands\13\Min=0 -Commands\13\Max=0 -Commands\14\Type=VFO Sub Select -Commands\14\String=\\x07\\xd1 +Commands\12\Max=0 +Commands\13\Type=Band Stacking Reg +Commands\13\String=\\x1a\\x01 +Commands\13\Min=1 +Commands\13\Max=11 +Commands\14\Type=Break-In Delay +Commands\14\String=\\x14\\x0f Commands\14\Min=0 -Commands\14\Max=0 -Commands\15\Type=VFO Main/Sub Band -Commands\15\String=\\x07\\xd2 +Commands\14\Max=255 +Commands\15\Type=Break-In Status +Commands\15\String=\\x16\\x47 Commands\15\Min=0 Commands\15\Max=1 -Commands\16\Type=Memory Mode -Commands\16\String=\\x08 -Commands\16\Min=1 -Commands\16\Max=101 -Commands\17\Type=Memory Write -Commands\17\String=\\x09 -Commands\17\Min=1 -Commands\17\Max=101 -Commands\18\Type=Memory to VFO -Commands\18\String=\\x0a -Commands\18\Min=1 -Commands\18\Max=101 -Commands\19\Type=Memory Clear -Commands\19\String=\\x0b -Commands\19\Min=1 -Commands\19\Max=101 -Commands\20\Type=Scanning -Commands\20\String=\\x0e +Commands\16\Type=CI-V Output +Commands\16\String=\\x1c\\x04 +Commands\16\Min=0 +Commands\16\Max=1 +Commands\17\Type=CIV Transceive +Commands\17\String=\\x1a\\x05\\x01\\x55 +Commands\17\Min=0 +Commands\17\Max=1 +Commands\18\Type=CLOCK 2 Name +Commands\18\String=\\x1a\\x05\\x01\\x02 +Commands\18\Min=0 +Commands\18\Max=0 +Commands\19\Type=CLOCK2 Setting +Commands\19\String=\\x1a\\x05\\x01\\x00 +Commands\19\Min=0 +Commands\19\Max=0 +Commands\20\Type=CLOCK2 UTC Offset +Commands\20\String=\\x1a\\x05\\x01\\x01 Commands\20\Min=0 -Commands\20\Max=255 -Commands\21\Type=Split Operation -Commands\21\String=\\x0f +Commands\20\Max=0 +Commands\21\Type=Command Error FA +Commands\21\String=\\xfa Commands\21\Min=0 -Commands\21\Max=1 -Commands\22\Type=Tuning Step -Commands\22\String=\\x10 +Commands\21\Max=0 +Commands\22\Type=Command OK FB +Commands\22\String=\\xfb Commands\22\Min=0 -Commands\22\Max=8 -Commands\23\Type=Attenuator Status -Commands\23\String=\\x11 +Commands\22\Max=0 +Commands\23\Type=Comp Meter +Commands\23\String=\\x15\\x14 Commands\23\Min=0 -Commands\23\Max=45 -Commands\24\Type=Antenna -Commands\24\String=\\x12 +Commands\23\Max=255 +Commands\24\Type=Compressor Level +Commands\24\String=\\x14\\x0e Commands\24\Min=0 -Commands\24\Max=1 -Commands\25\Type=Speech -Commands\25\String=\\x13 +Commands\24\Max=255 +Commands\25\Type=Compressor Status +Commands\25\String=\\x16\\x44 Commands\25\Min=0 -Commands\25\Max=2 -Commands\26\Type=AF Gain -Commands\26\String=\\x14\\x01 +Commands\25\Max=1 +Commands\26\Type=CW Pitch +Commands\26\String=\\x14\\x09 Commands\26\Min=0 Commands\26\Max=255 -Commands\27\Type=RF Gain -Commands\27\String=\\x14\\x02 -Commands\27\Min=0 -Commands\27\Max=255 -Commands\28\Type=Squelch -Commands\28\String=\\x14\\x03 +Commands\27\Type=Dash Ratio +Commands\27\String=\\x1a\\x05\\x02\\x51 +Commands\27\Min=28 +Commands\27\Max=45 +Commands\28\Type=Data Mode Filter +Commands\28\String=\\x1a\\x06 Commands\28\Min=0 -Commands\28\Max=255 -Commands\29\Type=APF Type Level -Commands\29\String=\\x14\\x05 +Commands\28\Max=65535 +Commands\29\Type=Data Off Mod Input +Commands\29\String=\\x1a\\x05\\x00\\x63 Commands\29\Min=0 -Commands\29\Max=255 -Commands\30\Type=NR Level -Commands\30\String=\\x14\\x06 +Commands\29\Max=10 +Commands\30\Type=DATA1 Mod Input +Commands\30\String=\\x1a\\x05\\x00\\x64 Commands\30\Min=0 -Commands\30\Max=255 -Commands\31\Type=PBT Inner -Commands\31\String=\\x14\\x07 +Commands\30\Max=10 +Commands\31\Type=DATA2 Mod Input +Commands\31\String=\\x1a\\x05\\x00\\x65 Commands\31\Min=0 -Commands\31\Max=255 -Commands\32\Type=PBT Outer -Commands\32\String=\\x14\\x08 +Commands\31\Max=10 +Commands\32\Type=DATA3 Mod Input +Commands\32\String=\\x1a\\x05\\x00\\x66 Commands\32\Min=0 -Commands\32\Max=255 -Commands\33\Type=CW Pitch -Commands\33\String=\\x14\\x09 +Commands\32\Max=10 +Commands\33\Type=Dial Lock Status +Commands\33\String=\\x16\\x50 Commands\33\Min=0 -Commands\33\Max=255 -Commands\34\Type=RF Power -Commands\34\String=\\x14\\x0a +Commands\33\Max=1 +Commands\34\Type=DIGI-SEL Shift +Commands\34\String=\\x14\\x13 Commands\34\Min=0 Commands\34\Max=255 -Commands\35\Type=Mic Gain -Commands\35\String=\\x14\\x0b +Commands\35\Type=DIGI-Sel Status +Commands\35\String=\\x16\\x4e Commands\35\Min=0 -Commands\35\Max=255 -Commands\36\Type=Key Speed -Commands\36\String=\\x14\\x0c +Commands\35\Max=1 +Commands\36\Type=Drive Gain +Commands\36\String=\\x14\\x14 Commands\36\Min=0 Commands\36\Max=255 -Commands\37\Type=Compressor Level -Commands\37\String=\\x14\\x0e +Commands\37\Type=DSP IF Filter +Commands\37\String=\\x16\\x56 Commands\37\Min=0 -Commands\37\Max=255 -Commands\38\Type=Break-In Delay -Commands\38\String=\\x14\\x0f +Commands\37\Max=1 +Commands\38\Type=Filter Width +Commands\38\String=\\x1a\\x03 Commands\38\Min=0 -Commands\38\Max=255 -Commands\39\Type=NB Level -Commands\39\String=\\x14\\x12 +Commands\38\Max=10000 +Commands\39\Type=Freq (TRX) +Commands\39\String=\\x00 Commands\39\Min=0 -Commands\39\Max=255 -Commands\40\Type=DIGI-SEL Shift -Commands\40\String=\\x14\\x13 +Commands\39\Max=0 +Commands\40\Type=Freq Get +Commands\40\String=\\x03 Commands\40\Min=0 -Commands\40\Max=255 -Commands\41\Type=Drive Gain -Commands\41\String=\\x14\\x14 +Commands\40\Max=0 +Commands\41\Type=Freq Set +Commands\41\String=\\x05 Commands\41\Min=0 -Commands\41\Max=255 -Commands\42\Type=Monitor Gain -Commands\42\String=\\x14\\x15 +Commands\41\Max=0 +Commands\42\Type=Id Meter +Commands\42\String=\\x15\\x16 Commands\42\Min=0 Commands\42\Max=255 -Commands\43\Type=Vox Gain -Commands\43\String=\\x14\\x16 +Commands\43\Type=IP Plus Status +Commands\43\String=\\x16\\x65 Commands\43\Min=0 -Commands\43\Max=255 -Commands\44\Type=Anti-Vox Gain -Commands\44\String=\\x14\\x17 +Commands\43\Max=1 +Commands\44\Type=Key Speed +Commands\44\String=\\x14\\x0c Commands\44\Min=0 Commands\44\Max=255 -Commands\45\Type=S Meter Sql Status -Commands\45\String=\\x15\\x01 +Commands\45\Type=LAN Mod Level +Commands\45\String=\\x1a\\x05\\x00\\x62 Commands\45\Min=0 Commands\45\Max=255 -Commands\46\Type=S Meter -Commands\46\String=\\x15\\x02 +Commands\46\Type=Main/Sub Prefix +Commands\46\String=\\x29 Commands\46\Min=0 -Commands\46\Max=255 -Commands\47\Type=Various Squelch -Commands\47\String=\\x15\\x05 +Commands\46\Max=1 +Commands\47\Type=Main/Sub Tracking +Commands\47\String=\\x16\\x5e Commands\47\Min=0 -Commands\47\Max=255 -Commands\48\Type=Overflow Status -Commands\48\String=\\x15\\x07 +Commands\47\Max=1 +Commands\48\Type=Manual Notch +Commands\48\String=\\x16\\x48 Commands\48\Min=0 Commands\48\Max=1 -Commands\49\Type=Power Meter -Commands\49\String=\\x15\\x11 -Commands\49\Min=0 -Commands\49\Max=255 -Commands\50\Type=SWR Meter -Commands\50\String=\\x15\\x12 -Commands\50\Min=0 -Commands\50\Max=255 -Commands\51\Type=ALC Meter -Commands\51\String=\\x15\\x13 -Commands\51\Min=0 -Commands\51\Max=255 -Commands\52\Type=Comp Meter -Commands\52\String=\\x15\\x14 -Commands\52\Min=0 -Commands\52\Max=255 -Commands\53\Type=Vd Meter -Commands\53\String=\\x15\\x15 -Commands\53\Min=0 -Commands\53\Max=255 -Commands\54\Type=Id Meter -Commands\54\String=\\x15\\x16 +Commands\49\Type=Memory Clear +Commands\49\String=\\x0b +Commands\49\Min=1 +Commands\49\Max=101 +Commands\50\Type=Memory Contents +Commands\50\String=\\x1a\\00 +Commands\50\Min=1 +Commands\50\Max=101 +Commands\51\Type=Memory Mode +Commands\51\String=\\x08 +Commands\51\Min=1 +Commands\51\Max=101 +Commands\52\Type=Memory to VFO +Commands\52\String=\\x0a +Commands\52\Min=1 +Commands\52\Max=101 +Commands\53\Type=Memory Write +Commands\53\String=\\x09 +Commands\53\Min=1 +Commands\53\Max=101 +Commands\54\Type=Mic Gain +Commands\54\String=\\x14\\x0b Commands\54\Min=0 Commands\54\Max=255 -Commands\55\Type=Preamp Status -Commands\55\String=\\x16\\x02 +Commands\55\Type=Mode (TRX) +Commands\55\String=\\x01 Commands\55\Min=0 -Commands\55\Max=2 -Commands\56\Type=AGC Time Constant -Commands\56\String=\\x16\\x12 +Commands\55\Max=0 +Commands\56\Type=Mode Get +Commands\56\String=\\x04 Commands\56\Min=0 -Commands\56\Max=3 -Commands\57\Type=Noise Blanker -Commands\57\String=\\x16\\x22 +Commands\56\Max=0 +Commands\57\Type=Mode Set +Commands\57\String=\\x06 Commands\57\Min=0 -Commands\57\Max=1 -Commands\58\Type=Audio Peak Filter -Commands\58\String=\\x16\\x32 +Commands\57\Max=0 +Commands\58\Type=Monitor Gain +Commands\58\String=\\x14\\x15 Commands\58\Min=0 -Commands\58\Max=3 -Commands\59\Type=Noise Reduction -Commands\59\String=\\x16\\x40 +Commands\58\Max=255 +Commands\59\Type=Monitor Status +Commands\59\String=\\x16\\x45 Commands\59\Min=0 Commands\59\Max=1 -Commands\60\Type=Auto Notch -Commands\60\String=\\x16\\x41 +Commands\60\Type=NB Level +Commands\60\String=\\x14\\x12 Commands\60\Min=0 -Commands\60\Max=1 -Commands\61\Type=Repeater Tone -Commands\61\String=\\x16\\x42 +Commands\60\Max=255 +Commands\61\Type=Noise Blanker +Commands\61\String=\\x16\\x22 Commands\61\Min=0 Commands\61\Max=1 -Commands\62\Type=Repeater TSQL -Commands\62\String=\\x16\\x43 +Commands\62\Type=Noise Reduction +Commands\62\String=\\x16\\x40 Commands\62\Min=0 Commands\62\Max=1 -Commands\63\Type=Compressor Status -Commands\63\String=\\x16\\x44 +Commands\63\Type=NR Level +Commands\63\String=\\x14\\x06 Commands\63\Min=0 -Commands\63\Max=1 -Commands\64\Type=Monitor Status -Commands\64\String=\\x16\\x45 +Commands\63\Max=255 +Commands\64\Type=Overflow Status +Commands\64\String=\\x15\\x07 Commands\64\Min=0 Commands\64\Max=1 -Commands\65\Type=Vox Status -Commands\65\String=\\x16\\x46 +Commands\65\Type=PBT Inner +Commands\65\String=\\x14\\x07 Commands\65\Min=0 -Commands\65\Max=1 -Commands\66\Type=Break-In Status -Commands\66\String=\\x16\\x47 +Commands\65\Max=255 +Commands\66\Type=PBT Outer +Commands\66\String=\\x14\\x08 Commands\66\Min=0 -Commands\66\Max=1 -Commands\67\Type=Manual Notch -Commands\67\String=\\x16\\x48 +Commands\66\Max=255 +Commands\67\Type=Power Control +Commands\67\String=\\x18 Commands\67\Min=0 Commands\67\Max=1 -Commands\68\Type=DIGI-Sel Status -Commands\68\String=\\x16\\x4e +Commands\68\Type=Power Meter +Commands\68\String=\\x15\\x11 Commands\68\Min=0 -Commands\68\Max=1 -Commands\69\Type=Twin Peak Filter -Commands\69\String=\\x16\\x4f +Commands\68\Max=255 +Commands\69\Type=Preamp Status +Commands\69\String=\\x16\\x02 Commands\69\Min=0 -Commands\69\Max=1 -Commands\70\Type=Dial Lock Status -Commands\70\String=\\x16\\x50 +Commands\69\Max=2 +Commands\70\Type=Quick Dual Watch +Commands\70\String=\\x1a\\x05\\x01\\x12 Commands\70\Min=0 Commands\70\Max=1 -Commands\71\Type=RX Antenna -Commands\71\String=\\x16\\x53 +Commands\71\Type=Quick Split +Commands\71\String=\\x1a\\x05\\x00\\x33 Commands\71\Min=0 Commands\71\Max=1 -Commands\72\Type=DSP IF Filter -Commands\72\String=\\x16\\x56 +Commands\72\Type=Read TX Freq +Commands\72\String=\\x1c\\x03 Commands\72\Min=0 Commands\72\Max=1 -Commands\73\Type=SSB Bandwidth -Commands\73\String=\\x16\\x58 +Commands\73\Type=REF Adjust +Commands\73\String=\\x1a\\x05\\x00\\x75 Commands\73\Min=0 -Commands\73\Max=2 -Commands\74\Type=Main/Sub Tracking -Commands\74\String=\\x16\\x5e +Commands\73\Max=255 +Commands\74\Type=Repeater Tone +Commands\74\String=\\x16\\x42 Commands\74\Min=0 Commands\74\Max=1 -Commands\75\Type=IP Plus Status -Commands\75\String=\\x16\\x65 +Commands\75\Type=Repeater TSQL +Commands\75\String=\\x16\\x43 Commands\75\Min=0 Commands\75\Max=1 -Commands\76\Type=Send CW -Commands\76\String=\\x17 +Commands\76\Type=RF Gain +Commands\76\String=\\x14\\x02 Commands\76\Min=0 -Commands\76\Max=30 -Commands\77\Type=Power Control -Commands\77\String=\\x18 +Commands\76\Max=255 +Commands\77\Type=RF Power +Commands\77\String=\\x14\\x0a Commands\77\Min=0 -Commands\77\Max=1 -Commands\78\Type=Transceiver ID -Commands\78\String=\\x19 -Commands\78\Min=0 -Commands\78\Max=0 -Commands\79\Type=Memory Contents -Commands\79\String=\\x1a\\00 -Commands\79\Min=1 -Commands\79\Max=101 -Commands\80\Type=Band Stacking Reg -Commands\80\String=\\x1a\\x01 -Commands\80\Min=1 -Commands\80\Max=11 -Commands\81\Type=Filter Width -Commands\81\String=\\x1a\\x03 +Commands\77\Max=255 +Commands\78\Type=RIT Frequency +Commands\78\String=\\x21\\x00 +Commands\78\Min=-9999 +Commands\78\Max=9999 +Commands\79\Type=RIT Status +Commands\79\String=\\x21\\x01 +Commands\79\Min=0 +Commands\79\Max=1 +Commands\80\Type=RIT TX Status +Commands\80\String=\\x21\\x02 +Commands\80\Min=0 +Commands\80\Max=1 +Commands\81\Type=RX Antenna +Commands\81\String=\\x16\\x53 Commands\81\Min=0 -Commands\81\Max=10000 -Commands\82\Type=Quick Split -Commands\82\String=\\x1a\\x05\\x00\\x33 +Commands\81\Max=1 +Commands\82\Type=S Meter +Commands\82\String=\\x15\\x02 Commands\82\Min=0 -Commands\82\Max=1 -Commands\83\Type=ACC1 Mod Level -Commands\83\String=\\x1a\\x05\\x00\\x58 +Commands\82\Max=255 +Commands\83\Type=S Meter Sql Status +Commands\83\String=\\x15\\x01 Commands\83\Min=0 Commands\83\Max=255 -Commands\84\Type=ACC2 Mod Level -Commands\84\String=\\x1a\\x05\\x00\\x59 +Commands\84\Type=Scanning +Commands\84\String=\\x0e Commands\84\Min=0 Commands\84\Max=255 -Commands\85\Type=USB Mod Level -Commands\85\String=\\x1a\\x05\\x00\\x61 +Commands\85\Type=Scope Center Fixed +Commands\85\String=\\x27\\x14 Commands\85\Min=0 -Commands\85\Max=255 -Commands\86\Type=LAN Mod Level -Commands\86\String=\\x1a\\x05\\x00\\x62 +Commands\85\Max=1 +Commands\86\Type=Scope Center Span +Commands\86\String=\\x27\\x15 Commands\86\Min=0 -Commands\86\Max=255 -Commands\87\Type=Data Off Mod Input -Commands\87\String=\\x1a\\x05\\x00\\x63 +Commands\86\Max=7 +Commands\87\Type=Scope Center Type +Commands\87\String=\\x27\\x1c Commands\87\Min=0 -Commands\87\Max=10 -Commands\88\Type=DATA1 Mod Input -Commands\88\String=\\x1a\\x05\\x00\\x64 +Commands\87\Max=2 +Commands\88\Type=Scope Data Output +Commands\88\String=\\x27\\x11 Commands\88\Min=0 -Commands\88\Max=10 -Commands\89\Type=DATA2 Mod Input -Commands\89\String=\\x1a\\x05\\x00\\x65 +Commands\88\Max=1 +Commands\89\Type=Scope During TX +Commands\89\String=\\x27\\x1b Commands\89\Min=0 -Commands\89\Max=10 -Commands\90\Type=DATA3 Mod Input -Commands\90\String=\\x1a\\x05\\x00\\x66 -Commands\90\Min=0 -Commands\90\Max=10 -Commands\91\Type=REF Adjust -Commands\91\String=\\x1a\\x05\\x00\\x75 -Commands\91\Min=0 -Commands\91\Max=255 -Commands\92\Type=System Date -Commands\92\String=\\x1a\\x05\\x00\\x95 +Commands\89\Max=1 +Commands\90\Type=Scope Edge Number +Commands\90\String=\\x27\\x16 +Commands\90\Min=1 +Commands\90\Max=4 +Commands\91\Type=Scope Fixed Freq +Commands\91\String=\\x27\\x1e +Commands\91\Min=1 +Commands\91\Max=12 +Commands\92\Type=Scope Hold +Commands\92\String=\\x27\\x17 Commands\92\Min=0 -Commands\92\Max=0 -Commands\93\Type=System Time -Commands\93\String=\\x1a\\x05\\x00\\x96 +Commands\92\Max=1 +Commands\93\Type=Scope Main/Sub +Commands\93\String=\\x27\\x12 Commands\93\Min=0 -Commands\93\Max=0 -Commands\94\Type=CLOCK2 Setting -Commands\94\String=\\x1a\\x05\\x01\\x00 +Commands\93\Max=1 +Commands\94\Type=Scope On/Off +Commands\94\String=\\x27\\x10 Commands\94\Min=0 -Commands\94\Max=0 -Commands\95\Type=CLOCK2 UTC Offset -Commands\95\String=\\x1a\\x05\\x01\\x01 +Commands\94\Max=1 +Commands\95\Type=Scope RBW +Commands\95\String=\\x27\\x1f Commands\95\Min=0 -Commands\95\Max=0 -Commands\96\Type=UTC Offset -Commands\96\String=\\x1a\\x05\\x01\\x01 -Commands\96\Min=0 -Commands\96\Max=0 -Commands\97\Type=CLOCK 2 Name -Commands\97\String=\\x1a\\x05\\x01\\x02 +Commands\95\Max=2 +Commands\96\Type=Scope Ref +Commands\96\String=\\x27\\x19 +Commands\96\Min=-30 +Commands\96\Max=10 +Commands\97\Type=Scope Single/Dual +Commands\97\String=\\x27\\x13 Commands\97\Min=0 -Commands\97\Max=0 -Commands\98\Type=Quick Dual Watch -Commands\98\String=\\x1a\\x05\\x01\\x12 +Commands\97\Max=1 +Commands\98\Type=Scope Speed +Commands\98\String=\\x27\\x1a Commands\98\Min=0 -Commands\98\Max=1 -Commands\99\Type=CIV Transceive -Commands\99\String=\\x1a\\x05\\x01\\x55 +Commands\98\Max=2 +Commands\99\Type=Scope VBW +Commands\99\String=\\x27\\x1d Commands\99\Min=0 Commands\99\Max=1 -Commands\100\Type=Dash Ratio -Commands\100\String=\\x1a\\x05\\x02\\x51 -Commands\100\Min=28 -Commands\100\Max=45 -Commands\101\Type=Data Mode Filter -Commands\101\String=\\x1a\\x06 +Commands\100\Type=Scope Wave Data +Commands\100\String=\\x27\\x00 +Commands\100\Min=0 +Commands\100\Max=1 +Commands\101\Type=Selected Freq +Commands\101\String=\\x25\\x00 Commands\101\Min=0 -Commands\101\Max=1 -Commands\102\Type=Transceiver Status -Commands\102\String=\\x1c\\x00 +Commands\101\Max=0 +Commands\102\Type=Selected Mode +Commands\102\String=\\x26\\x00 Commands\102\Min=0 -Commands\102\Max=1 -Commands\103\Type=Tuner/ATU Status -Commands\103\String=\\x1c\\x01 +Commands\102\Max=0 +Commands\103\Type=Send CW +Commands\103\String=\\x17 Commands\103\Min=0 -Commands\103\Max=1 -Commands\104\Type=XFC Status -Commands\104\String=\\x1c\\x02 +Commands\103\Max=30 +Commands\104\Type=Speech +Commands\104\String=\\x13 Commands\104\Min=0 -Commands\104\Max=1 -Commands\105\Type=Read TX Freq -Commands\105\String=\\x1c\\x03 +Commands\104\Max=2 +Commands\105\Type=Split Operation +Commands\105\String=\\x0f Commands\105\Min=0 Commands\105\Max=1 -Commands\106\Type=CI-V Output -Commands\106\String=\\x1c\\x04 +Commands\106\Type=Squelch +Commands\106\String=\\x14\\x03 Commands\106\Min=0 -Commands\106\Max=1 -Commands\107\Type=RIT Frequency -Commands\107\String=\\x21\\x00 -Commands\107\Min=-9999 -Commands\107\Max=9999 -Commands\108\Type=RIT Status -Commands\108\String=\\x21\\x01 +Commands\106\Max=255 +Commands\107\Type=SSB Bandwidth +Commands\107\String=\\x16\\x58 +Commands\107\Min=0 +Commands\107\Max=2 +Commands\108\Type=SWR Meter +Commands\108\String=\\x15\\x12 Commands\108\Min=0 -Commands\108\Max=1 -Commands\109\Type=RIT TX Status -Commands\109\String=\\x21\\x02 +Commands\108\Max=255 +Commands\109\Type=System Date +Commands\109\String=\\x1a\\x05\\x00\\x95 Commands\109\Min=0 -Commands\109\Max=1 -Commands\110\Type=Main/Sub Freq -Commands\110\String=\\x25 +Commands\109\Max=0 +Commands\110\Type=System Time +Commands\110\String=\\x1a\\x05\\x00\\x96 Commands\110\Min=0 -Commands\110\Max=1 -Commands\111\Type=Main/Sub Mode -Commands\111\String=\\x26 +Commands\110\Max=0 +Commands\111\Type=Transceiver ID +Commands\111\String=\\x19 Commands\111\Min=0 -Commands\111\Max=1 -Commands\112\Type=Scope Wave Data -Commands\112\String=\\x27\\x00 +Commands\111\Max=0 +Commands\112\Type=Transceiver Status +Commands\112\String=\\x1c\\x00 Commands\112\Min=0 Commands\112\Max=1 -Commands\113\Type=Scope On/Off -Commands\113\String=\\x27\\x10 +Commands\113\Type=Tuner/ATU Status +Commands\113\String=\\x1c\\x01 Commands\113\Min=0 Commands\113\Max=1 -Commands\114\Type=Scope Data Output -Commands\114\String=\\x27\\x11 +Commands\114\Type=Tuning Step +Commands\114\String=\\x10 Commands\114\Min=0 -Commands\114\Max=1 -Commands\115\Type=Scope Main/Sub -Commands\115\String=\\x27\\x12 +Commands\114\Max=8 +Commands\115\Type=Twin Peak Filter +Commands\115\String=\\x16\\x4f Commands\115\Min=0 Commands\115\Max=1 -Commands\116\Type=Scope Single/Dual -Commands\116\String=\\x27\\x13 +Commands\116\Type=Unselected Freq +Commands\116\String=\\x25\\x00 Commands\116\Min=0 -Commands\116\Max=1 -Commands\117\Type=Scope Center Fixed -Commands\117\String=\\x27\\x14 +Commands\116\Max=0 +Commands\117\Type=Unselected Mode +Commands\117\String=\\x26\\x00 Commands\117\Min=0 -Commands\117\Max=1 -Commands\118\Type=Scope Center Span -Commands\118\String=\\x27\\x15 +Commands\117\Max=0 +Commands\118\Type=USB Mod Level +Commands\118\String=\\x1a\\x05\\x00\\x61 Commands\118\Min=0 -Commands\118\Max=7 -Commands\119\Type=Scope Edge Number -Commands\119\String=\\x27\\x16 -Commands\119\Min=1 -Commands\119\Max=4 -Commands\120\Type=Scope Hold -Commands\120\String=\\x27\\x17 +Commands\118\Max=255 +Commands\119\Type=UTC Offset +Commands\119\String=\\x1a\\x05\\x01\\x01 +Commands\119\Min=0 +Commands\119\Max=0 +Commands\120\Type=Various Squelch +Commands\120\String=\\x15\\x05 Commands\120\Min=0 -Commands\120\Max=1 -Commands\121\Type=Scope Ref -Commands\121\String=\\x27\\x19 -Commands\121\Min=-30 -Commands\121\Max=10 -Commands\122\Type=Scope Speed -Commands\122\String=\\x27\\x1a +Commands\120\Max=255 +Commands\121\Type=Vd Meter +Commands\121\String=\\x15\\x15 +Commands\121\Min=0 +Commands\121\Max=255 +Commands\122\Type=VFO Dual Watch +Commands\122\String=\\x07\\xc2 Commands\122\Min=0 -Commands\122\Max=2 -Commands\123\Type=Scope During TX -Commands\123\String=\\x27\\x1b +Commands\122\Max=1 +Commands\123\Type=VFO Dual Watch Off +Commands\123\String=\\x07\\xc0 Commands\123\Min=0 -Commands\123\Max=1 -Commands\124\Type=Scope Center Type -Commands\124\String=\\x27\\x1c +Commands\123\Max=0 +Commands\124\Type=VFO Dual Watch On +Commands\124\String=\\x07\\xc1 Commands\124\Min=0 -Commands\124\Max=2 -Commands\125\Type=Scope VBW -Commands\125\String=\\x27\\x1d +Commands\124\Max=0 +Commands\125\Type=VFO Equal MS +Commands\125\String=\\x07\\xb1 Commands\125\Min=0 -Commands\125\Max=1 -Commands\126\Type=Scope Fixed Freq -Commands\126\String=\\x27\\x1e -Commands\126\Min=1 -Commands\126\Max=12 -Commands\127\Type=Scope RBW -Commands\127\String=\\x27\\x1f +Commands\125\Max=0 +Commands\126\Type=VFO Main Select +Commands\126\String=\\x07\\xd0 +Commands\126\Min=0 +Commands\126\Max=0 +Commands\127\Type=VFO Main/Sub Band +Commands\127\String=\\x07\\xd2 Commands\127\Min=0 -Commands\127\Max=2 -Commands\128\Type=Main/Sub Prefix -Commands\128\String=\\x29 +Commands\127\Max=1 +Commands\128\Type=VFO Sub Select +Commands\128\String=\\x07\\xd1 Commands\128\Min=0 -Commands\128\Max=1 -Commands\129\Type=Command Error FA -Commands\129\String=\\xfa +Commands\128\Max=0 +Commands\129\Type=VFO Swap M/S +Commands\129\String=\\x07\\xb0 Commands\129\Min=0 Commands\129\Max=0 -Commands\130\Type=Command OK FB -Commands\130\String=\\xfb +Commands\130\Type=Vox Gain +Commands\130\String=\\x14\\x16 Commands\130\Min=0 -Commands\130\Max=0 -Commands\size=130 +Commands\130\Max=255 +Commands\131\Type=Vox Status +Commands\131\String=\\x16\\x46 +Commands\131\Min=0 +Commands\131\Max=1 +Commands\132\Type=XFC Status +Commands\132\String=\\x1c\\x02 +Commands\132\Min=0 +Commands\132\Max=1 +Commands\size=132 Spans\1\Num=0 Spans\1\Name=±2.5 KHz Spans\1\Freq=2500 @@ -568,125 +576,136 @@ Spans\8\Name=±500 KHz Spans\8\Freq=500000 Spans\size=8 Inputs\1\Num=0 +Inputs\1\Reg=0 Inputs\1\Name=MIC Inputs\2\Num=1 -Inputs\2\Name=ACC +Inputs\2\Reg=1 +Inputs\2\Name=ACCA Inputs\3\Num=2 +Inputs\3\Reg=2 Inputs\3\Name=ACCB -Inputs\4\Num=3 -Inputs\4\Name=M/A -Inputs\5\Num=4 +Inputs\4\Num=5 +Inputs\4\Reg=3 +Inputs\4\Name=M/AA +Inputs\5\Num=6 +Inputs\5\Reg=4 Inputs\5\Name=M/AB -Inputs\6\Num=5 +Inputs\6\Num=7 +Inputs\6\Reg=5 Inputs\6\Name=A/B -Inputs\7\Num=6 +Inputs\7\Num=8 +Inputs\7\Reg=6 Inputs\7\Name=M/A/B -Inputs\8\Num=7 -Inputs\8\Name=SPDIF -Inputs\9\Num=8 +Inputs\8\Num=9 +Inputs\8\Reg=7 +Inputs\8\Name=SPD +Inputs\9\Num=3 +Inputs\9\Reg=8 Inputs\9\Name=USB -Inputs\10\Num=9 +Inputs\10\Num=4 +Inputs\10\Reg=9 Inputs\10\Name=LAN Inputs\11\Num=10 +Inputs\11\Reg=16 Inputs\11\Name=M/U Inputs\size=11 -Bands\1\Num=23 -Bands\1\BSR=11 -Bands\1\Name=60m -Bands\1\Start=5250000 -Bands\1\End=5450000 -Bands\1\Range=0 +Bands\1\Num=20 +Bands\1\BSR=1 +Bands\1\Name=160m +Bands\1\Start=1800000 +Bands\1\End=2000000 +Bands\1\Range=2 Bands\1\MemoryGroup=-1 -Bands\2\Num=22 -Bands\2\BSR=11 -Bands\2\Name=Gen -Bands\2\Start=10000 -Bands\2\End=30000000 -Bands\2\Range=1.6 +Bands\2\Num=19 +Bands\2\BSR=2 +Bands\2\Name=80m +Bands\2\Start=3500000 +Bands\2\End=4000000 +Bands\2\Range=6 Bands\2\MemoryGroup=-1 -Bands\3\Num=21 -Bands\3\BSR=11 -Bands\3\Name=2200m -Bands\3\Start=135000 -Bands\3\End=138000 -Bands\3\Range=0 +Bands\3\Num=17 +Bands\3\BSR=3 +Bands\3\Name=40m +Bands\3\Start=7000000 +Bands\3\End=7300000 +Bands\3\Range=11 Bands\3\MemoryGroup=-1 -Bands\4\Num=20 -Bands\4\BSR=1 -Bands\4\Name=160m -Bands\4\Start=1800000 -Bands\4\End=2000000 -Bands\4\Range=2 +Bands\4\Num=16 +Bands\4\BSR=4 +Bands\4\Name=30m +Bands\4\Start=10100000 +Bands\4\End=10150000 +Bands\4\Range=15 Bands\4\MemoryGroup=-1 -Bands\5\Num=19 -Bands\5\BSR=2 -Bands\5\Name=80m -Bands\5\Start=3500000 -Bands\5\End=4000000 -Bands\5\Range=6 +Bands\5\Num=15 +Bands\5\BSR=5 +Bands\5\Name=20m +Bands\5\Start=14000000 +Bands\5\End=14350000 +Bands\5\Range=20 Bands\5\MemoryGroup=-1 -Bands\6\Num=18 -Bands\6\BSR=11 -Bands\6\Name=630m -Bands\6\Start=493000 -Bands\6\End=595000 -Bands\6\Range=8 +Bands\6\Num=14 +Bands\6\BSR=6 +Bands\6\Name=17m +Bands\6\Start=18068000 +Bands\6\End=18168000 +Bands\6\Range=22 Bands\6\MemoryGroup=-1 -Bands\7\Num=17 -Bands\7\BSR=3 -Bands\7\Name=40m -Bands\7\Start=7000000 -Bands\7\End=7300000 -Bands\7\Range=11 +Bands\7\Num=13 +Bands\7\BSR=7 +Bands\7\Name=15m +Bands\7\Start=21000000 +Bands\7\End=21450000 +Bands\7\Range=26 Bands\7\MemoryGroup=-1 -Bands\8\Num=16 -Bands\8\BSR=4 -Bands\8\Name=30m -Bands\8\Start=10100000 -Bands\8\End=10150000 -Bands\8\Range=15 +Bands\8\Num=12 +Bands\8\BSR=8 +Bands\8\Name=12m +Bands\8\Start=24890000 +Bands\8\End=24990000 +Bands\8\Range=30 Bands\8\MemoryGroup=-1 -Bands\9\Num=15 -Bands\9\BSR=5 -Bands\9\Name=20m -Bands\9\Start=14000000 -Bands\9\End=14350000 -Bands\9\Range=20 +Bands\9\Num=11 +Bands\9\BSR=9 +Bands\9\Name=10m +Bands\9\Start=28000000 +Bands\9\End=29700000 +Bands\9\Range=45 Bands\9\MemoryGroup=-1 -Bands\10\Num=14 -Bands\10\BSR=6 -Bands\10\Name=17m -Bands\10\Start=18068000 -Bands\10\End=18168000 -Bands\10\Range=22 +Bands\10\Num=10 +Bands\10\BSR=16 +Bands\10\Name=6m +Bands\10\Start=50000000 +Bands\10\End=54000000 +Bands\10\Range=60 Bands\10\MemoryGroup=-1 -Bands\11\Num=13 -Bands\11\BSR=7 -Bands\11\Name=15m -Bands\11\Start=21000000 -Bands\11\End=21450000 -Bands\11\Range=26 +Bands\11\Num=18 +Bands\11\BSR=17 +Bands\11\Name=630m +Bands\11\Start=493000 +Bands\11\End=595000 +Bands\11\Range=8 Bands\11\MemoryGroup=-1 -Bands\12\Num=12 -Bands\12\BSR=8 -Bands\12\Name=12m -Bands\12\Start=24890000 -Bands\12\End=24990000 -Bands\12\Range=30 +Bands\12\Num=21 +Bands\12\BSR=17 +Bands\12\Name=2200m +Bands\12\Start=135000 +Bands\12\End=138000 +Bands\12\Range=0 Bands\12\MemoryGroup=-1 -Bands\13\Num=11 -Bands\13\BSR=9 -Bands\13\Name=10m -Bands\13\Start=28000000 -Bands\13\End=29700000 -Bands\13\Range=45 +Bands\13\Num=22 +Bands\13\BSR=17 +Bands\13\Name=Gen +Bands\13\Start=10000 +Bands\13\End=30000000 +Bands\13\Range=1.6 Bands\13\MemoryGroup=-1 -Bands\14\Num=10 -Bands\14\BSR=10 -Bands\14\Name=6m -Bands\14\Start=50000000 -Bands\14\End=54000000 -Bands\14\Range=60 +Bands\14\Num=23 +Bands\14\BSR=17 +Bands\14\Name=60m +Bands\14\Start=5250000 +Bands\14\End=5450000 +Bands\14\Range=0 Bands\14\MemoryGroup=-1 Bands\size=14 Modes\1\Num=0 @@ -722,11 +741,11 @@ Modes\8\Reg=8 Modes\8\Name=RTTY-R Modes\8\BW=1 Modes\9\Num=8 -Modes\9\Reg=12 +Modes\9\Reg=18 Modes\9\Name=PSK Modes\9\BW=1 Modes\10\Num=9 -Modes\10\Reg=13 +Modes\10\Reg=19 Modes\10\Name=PSK-R Modes\10\BW=1 Modes\size=10 @@ -734,18 +753,18 @@ Attenuators\1\dB=0 Attenuators\2\dB=3 Attenuators\3\dB=6 Attenuators\4\dB=9 -Attenuators\5\dB=12 -Attenuators\6\dB=15 -Attenuators\7\dB=18 -Attenuators\8\dB=21 -Attenuators\9\dB=24 -Attenuators\10\dB=27 -Attenuators\11\dB=30 -Attenuators\12\dB=33 -Attenuators\13\dB=36 -Attenuators\14\dB=39 -Attenuators\15\dB=42 -Attenuators\16\dB=45 +Attenuators\5\dB=18 +Attenuators\6\dB=21 +Attenuators\7\dB=24 +Attenuators\8\dB=33 +Attenuators\9\dB=36 +Attenuators\10\dB=39 +Attenuators\11\dB=48 +Attenuators\12\dB=51 +Attenuators\13\dB=54 +Attenuators\14\dB=57 +Attenuators\15\dB=66 +Attenuators\16\dB=69 Attenuators\size=16 Preamps\1\Num=0 Preamps\1\Name=OFF diff --git a/rigs/IC-9700.rig b/rigs/IC-9700.rig index e23fb34..c4d0b41 100644 --- a/rigs/IC-9700.rig +++ b/rigs/IC-9700.rig @@ -380,7 +380,7 @@ Commands\89\Max=45 Commands\90\Type=Data Mode Filter Commands\90\String=\\x1a\\x06 Commands\90\Min=0 -Commands\90\Max=1 +Commands\90\Max=0 Commands\91\Type=Satellite Memory Commands\91\String=\\x1a\\x07 Commands\91\Min=0 @@ -425,83 +425,91 @@ Commands\101\Type=GPS Position Commands\101\String=\\x23\\x00 Commands\101\Min=0 Commands\101\Max=0 -Commands\102\Type=Main/Sub Freq -Commands\102\String=\\x25 +Commands\102\Type=Selected Freq +Commands\102\String=\\x25\\x00 Commands\102\Min=0 -Commands\102\Max=1 -Commands\103\Type=Main/Sub Mode -Commands\103\String=\\x26 +Commands\102\Max=0 +Commands\103\Type=Unselected Freq +Commands\103\String=\\x25\\x01 Commands\103\Min=0 -Commands\103\Max=1 -Commands\104\Type=Scope Wave Data -Commands\104\String=\\x27\\x00 +Commands\103\Max=0 +Commands\104\Type=Selected Mode +Commands\104\String=\\x26\\x00 Commands\104\Min=0 -Commands\104\Max=1 -Commands\105\Type=Scope On/Off -Commands\105\String=\\x27\\x10 +Commands\104\Max=0 +Commands\105\Type=Unselected Mode +Commands\105\String=\\x26\\x01 Commands\105\Min=0 -Commands\105\Max=1 -Commands\106\Type=Scope Data Output -Commands\106\String=\\x27\\x11 +Commands\105\Max=0 +Commands\106\Type=Scope Wave Data +Commands\106\String=\\x27\\x00 Commands\106\Min=0 Commands\106\Max=1 -Commands\107\Type=Scope Main/Sub -Commands\107\String=\\x27\\x12 +Commands\107\Type=Scope On/Off +Commands\107\String=\\x27\\x10 Commands\107\Min=0 Commands\107\Max=1 -Commands\108\Type=Scope Center Fixed -Commands\108\String=\\x27\\x14 +Commands\108\Type=Scope Data Output +Commands\108\String=\\x27\\x11 Commands\108\Min=0 Commands\108\Max=1 -Commands\109\Type=Scope Center Span -Commands\109\String=\\x27\\x15 +Commands\109\Type=Scope Main/Sub +Commands\109\String=\\x27\\x12 Commands\109\Min=0 -Commands\109\Max=7 -Commands\110\Type=Scope Edge Number -Commands\110\String=\\x27\\x16 -Commands\110\Min=1 -Commands\110\Max=4 -Commands\111\Type=Scope Hold -Commands\111\String=\\x27\\x17 +Commands\109\Max=1 +Commands\110\Type=Scope Center Fixed +Commands\110\String=\\x27\\x14 +Commands\110\Min=0 +Commands\110\Max=1 +Commands\111\Type=Scope Center Span +Commands\111\String=\\x27\\x15 Commands\111\Min=0 -Commands\111\Max=1 -Commands\112\Type=Scope Ref -Commands\112\String=\\x27\\x19 -Commands\112\Min=-30 -Commands\112\Max=10 -Commands\113\Type=Scope Speed -Commands\113\String=\\x27\\x1a +Commands\111\Max=7 +Commands\112\Type=Scope Edge Number +Commands\112\String=\\x27\\x16 +Commands\112\Min=1 +Commands\112\Max=4 +Commands\113\Type=Scope Hold +Commands\113\String=\\x27\\x17 Commands\113\Min=0 -Commands\113\Max=2 -Commands\114\Type=Scope During TX -Commands\114\String=\\x27\\x1b -Commands\114\Min=0 -Commands\114\Max=1 -Commands\115\Type=Scope Center Type -Commands\115\String=\\x27\\x1c +Commands\113\Max=1 +Commands\114\Type=Scope Ref +Commands\114\String=\\x27\\x19 +Commands\114\Min=-30 +Commands\114\Max=10 +Commands\115\Type=Scope Speed +Commands\115\String=\\x27\\x1a Commands\115\Min=0 Commands\115\Max=2 -Commands\116\Type=Scope VBW -Commands\116\String=\\x27\\x1d +Commands\116\Type=Scope During TX +Commands\116\String=\\x27\\x1b Commands\116\Min=0 Commands\116\Max=1 -Commands\117\Type=Scope Fixed Freq -Commands\117\String=\\x27\\x1e -Commands\117\Min=1 -Commands\117\Max=12 -Commands\118\Type=Voice TX -Commands\118\String=\\x28\\x00 +Commands\117\Type=Scope Center Type +Commands\117\String=\\x27\\x1c +Commands\117\Min=0 +Commands\117\Max=2 +Commands\118\Type=Scope VBW +Commands\118\String=\\x27\\x1d Commands\118\Min=0 -Commands\118\Max=8 -Commands\119\Type=Command Error FA -Commands\119\String=\\xfa -Commands\119\Min=0 -Commands\119\Max=0 -Commands\120\Type=Command OK FB -Commands\120\String=\\xfb +Commands\118\Max=1 +Commands\119\Type=Scope Fixed Freq +Commands\119\String=\\x27\\x1e +Commands\119\Min=1 +Commands\119\Max=12 +Commands\120\Type=Voice TX +Commands\120\String=\\x28\\x00 Commands\120\Min=0 -Commands\120\Max=0 -Commands\size=120 +Commands\120\Max=8 +Commands\121\Type=Command Error FA +Commands\121\String=\\xfa +Commands\121\Min=0 +Commands\121\Max=0 +Commands\122\Type=Command OK FB +Commands\122\String=\\xfb +Commands\122\Min=0 +Commands\122\Max=0 +Commands\size=122 Spans\1\Num=0 Spans\1\Name=±2.5 KHz Spans\1\Freq=2500 @@ -528,16 +536,22 @@ Spans\8\Name=±500 KHz Spans\8\Freq=500000 Spans\size=8 Inputs\1\Num=0 +Inputs\1\Reg=0 Inputs\1\Name=MIC Inputs\2\Num=1 +Inputs\2\Reg=0 Inputs\2\Name=ACC Inputs\3\Num=2 +Inputs\3\Reg=0 Inputs\3\Name=M/A Inputs\4\Num=3 +Inputs\4\Reg=0 Inputs\4\Name=USB Inputs\5\Num=4 +Inputs\5\Reg=0 Inputs\5\Name=M/U Inputs\6\Num=5 +Inputs\6\Reg=0 Inputs\6\Name=LAN Inputs\size=6 Bands\1\Num=6 @@ -595,16 +609,16 @@ Modes\8\Reg=8 Modes\8\Name=RTTY-R Modes\8\BW=1 Modes\9\Num=12 -Modes\9\Reg=17 +Modes\9\Reg=23 Modes\9\Name=DV Modes\9\BW=0 Modes\10\Num=14 -Modes\10\Reg=22 +Modes\10\Reg=34 Modes\10\Name=DD Modes\10\BW=0 Modes\size=10 Attenuators\1\dB=0 -Attenuators\2\dB=10 +Attenuators\2\dB=16 Attenuators\size=2 Preamps\1\Num=0 Preamps\1\Name=INT/EXT OFF @@ -629,7 +643,7 @@ Tuning%20Steps\4\Num=2 Tuning%20Steps\4\Name=500 Hz Tuning%20Steps\4\Hz=500 Tuning%20Steps\5\Num=3 -Tuning%20Steps\5\Name=1 KHz +Tuning%20Steps\5\Name=1 Khz Tuning%20Steps\5\Hz=1000 Tuning%20Steps\6\Num=0 Tuning%20Steps\6\Name=2.5 KHz @@ -661,11 +675,11 @@ Tuning%20Steps\14\Hz=20000 Tuning%20Steps\15\Num=9 Tuning%20Steps\15\Name=25 KHz Tuning%20Steps\15\Hz=25000 -Tuning%20Steps\16\Num=10 +Tuning%20Steps\16\Num=16 Tuning%20Steps\16\Name=50 KHz Tuning%20Steps\16\Hz=50000 -Tuning%20Steps\17\Num=11 -Tuning%20Steps\17\Name=100 Khz +Tuning%20Steps\17\Num=17 +Tuning%20Steps\17\Name=100 KHz Tuning%20Steps\17\Hz=100000 Tuning%20Steps\18\Num=0 Tuning%20Steps\18\Name=250 KHz diff --git a/rigs/ic-7610.rig b/rigs/ic-7610.rig index 9f3753c..553f512 100644 --- a/rigs/ic-7610.rig +++ b/rigs/ic-7610.rig @@ -21,515 +21,523 @@ MemStart=1 MemFormat=%1.2b %3.1c %4.5f %9.1g %10.1h %11.1k %12.3n %15.3o %18.10z SatMemories=0 SatFormat= -Commands\1\Type=ACC1 Mod Level -Commands\1\String=\\x1A\\x05\\x00\\x88 +Commands\1\Type=Freq (TRX) +Commands\1\String=\\x00 Commands\1\Min=0 -Commands\1\Max=255 -Commands\2\Type=AF Gain -Commands\2\String=\\x14\\x01 +Commands\1\Max=0 +Commands\2\Type=Mode (TRX) +Commands\2\String=\\x01 Commands\2\Min=0 -Commands\2\Max=255 -Commands\3\Type=AGC Time Constant -Commands\3\String=\\x16\\x12 +Commands\2\Max=0 +Commands\3\Type=Band Edge Freq +Commands\3\String=\\x02 Commands\3\Min=0 -Commands\3\Max=3 -Commands\4\Type=ALC Meter -Commands\4\String=\\x15\\x13 +Commands\3\Max=0 +Commands\4\Type=Freq Get +Commands\4\String=\\x03 Commands\4\Min=0 -Commands\4\Max=255 -Commands\5\Type=Antenna -Commands\5\String=\\x12 +Commands\4\Max=0 +Commands\5\Type=Mode Get +Commands\5\String=\\x04 Commands\5\Min=0 -Commands\5\Max=1 -Commands\6\Type=Anti-Vox Gain -Commands\6\String=\\x14\\x17 +Commands\5\Max=0 +Commands\6\Type=Freq Set +Commands\6\String=\\x05 Commands\6\Min=0 -Commands\6\Max=255 -Commands\7\Type=APF Type Level -Commands\7\String=\\x14\\x05 +Commands\6\Max=0 +Commands\7\Type=Mode Set +Commands\7\String=\\x06 Commands\7\Min=0 -Commands\7\Max=255 -Commands\8\Type=Attenuator Status -Commands\8\String=\\x11 +Commands\7\Max=0 +Commands\8\Type=VFO Swap M/S +Commands\8\String=\\x07\\xb0 Commands\8\Min=0 -Commands\8\Max=45 -Commands\9\Type=Audio Peak Filter -Commands\9\String=\\x16\\x32 +Commands\8\Max=0 +Commands\9\Type=VFO Equal MS +Commands\9\String=\\x07\\xb1 Commands\9\Min=0 -Commands\9\Max=3 -Commands\10\Type=Auto Notch -Commands\10\String=\\x16\\x41 +Commands\9\Max=0 +Commands\10\Type=VFO Dual Watch Off +Commands\10\String=\\x07\\xc0 Commands\10\Min=0 -Commands\10\Max=1 -Commands\11\Type=Band Edge Freq -Commands\11\String=\\x02 +Commands\10\Max=0 +Commands\11\Type=VFO Dual Watch On +Commands\11\String=\\x07\\xc1 Commands\11\Min=0 Commands\11\Max=0 -Commands\12\Type=Band Stacking Reg -Commands\12\String=\\x1a\\x01 -Commands\12\Min=1 -Commands\12\Max=11 -Commands\13\Type=Break-In Delay -Commands\13\String=\\x14\\x0f +Commands\12\Type=VFO Dual Watch +Commands\12\String=\\x07\\xc2 +Commands\12\Min=0 +Commands\12\Max=1 +Commands\13\Type=VFO Main Select +Commands\13\String=\\x07\\xd0 Commands\13\Min=0 -Commands\13\Max=255 -Commands\14\Type=Break-In Status -Commands\14\String=\\x16\\x47 +Commands\13\Max=0 +Commands\14\Type=VFO Sub Select +Commands\14\String=\\x07\\xd1 Commands\14\Min=0 -Commands\14\Max=1 -Commands\15\Type=CI-V Output -Commands\15\String=\\x1c\\x04 +Commands\14\Max=0 +Commands\15\Type=VFO Main/Sub Band +Commands\15\String=\\x07\\xd2 Commands\15\Min=0 Commands\15\Max=1 -Commands\16\Type=CIV Transceive -Commands\16\String=\\x1a\\x05\\x01\\x12 -Commands\16\Min=0 -Commands\16\Max=1 -Commands\17\Type=Command Error FA -Commands\17\String=\\xfa -Commands\17\Min=0 -Commands\17\Max=0 -Commands\18\Type=Command OK FB -Commands\18\String=\\xfb -Commands\18\Min=0 -Commands\18\Max=0 -Commands\19\Type=Comp Meter -Commands\19\String=\\x15\\x14 -Commands\19\Min=0 -Commands\19\Max=255 -Commands\20\Type=Compressor Level -Commands\20\String=\\x14\\x0e +Commands\16\Type=Memory Mode +Commands\16\String=\\x08 +Commands\16\Min=1 +Commands\16\Max=101 +Commands\17\Type=Memory Write +Commands\17\String=\\x09 +Commands\17\Min=1 +Commands\17\Max=101 +Commands\18\Type=Memory to VFO +Commands\18\String=\\x0a +Commands\18\Min=1 +Commands\18\Max=101 +Commands\19\Type=Memory Clear +Commands\19\String=\\x0b +Commands\19\Min=1 +Commands\19\Max=101 +Commands\20\Type=Scanning +Commands\20\String=\\x0e Commands\20\Min=0 Commands\20\Max=255 -Commands\21\Type=Compressor Status -Commands\21\String=\\x16\\x44 +Commands\21\Type=Split Operation +Commands\21\String=\\x0f Commands\21\Min=0 Commands\21\Max=1 -Commands\22\Type=CW Pitch -Commands\22\String=\\x14\\x09 +Commands\22\Type=Tuning Step +Commands\22\String=\\x10 Commands\22\Min=0 -Commands\22\Max=255 -Commands\23\Type=Dash Ratio -Commands\23\String=\\x1a\\x05\\x02\\x28 -Commands\23\Min=28 -Commands\23\Max=45 -Commands\24\Type=Data Mode Filter -Commands\24\String=\\x1a\\x06 +Commands\22\Max=8 +Commands\23\Type=Attenuator Status +Commands\23\String=\\x11 +Commands\23\Min=0 +Commands\23\Max=69 +Commands\24\Type=Antenna +Commands\24\String=\\x12 Commands\24\Min=0 Commands\24\Max=1 -Commands\25\Type=Data Off Mod Input -Commands\25\String=\\x1a\\x05\\x00\\x91 +Commands\25\Type=Speech +Commands\25\String=\\x13 Commands\25\Min=0 -Commands\25\Max=5 -Commands\26\Type=DATA1 Mod Input -Commands\26\String=\\x1a\\x05\\x00\\x92 +Commands\25\Max=2 +Commands\26\Type=AF Gain +Commands\26\String=\\x14\\x01 Commands\26\Min=0 -Commands\26\Max=5 -Commands\27\Type=DATA2 Mod Input -Commands\27\String=\\x1a\\x05\\x00\\x93 +Commands\26\Max=255 +Commands\27\Type=RF Gain +Commands\27\String=\\x14\\x02 Commands\27\Min=0 -Commands\27\Max=5 -Commands\28\Type=DATA3 Mod Input -Commands\28\String=\\x1a\\x05\\x00\\x94 +Commands\27\Max=255 +Commands\28\Type=Squelch +Commands\28\String=\\x14\\x03 Commands\28\Min=0 -Commands\28\Max=5 -Commands\29\Type=Dial Lock Status -Commands\29\String=\\x16\\x50 +Commands\28\Max=255 +Commands\29\Type=APF Type Level +Commands\29\String=\\x14\\x05 Commands\29\Min=0 -Commands\29\Max=1 -Commands\30\Type=DIGI-SEL Shift -Commands\30\String=\\x14\\x13 +Commands\29\Max=255 +Commands\30\Type=NR Level +Commands\30\String=\\x14\\x06 Commands\30\Min=0 Commands\30\Max=255 -Commands\31\Type=DIGI-Sel Status -Commands\31\String=\\x16\\x4e +Commands\31\Type=PBT Inner +Commands\31\String=\\x14\\x07 Commands\31\Min=0 -Commands\31\Max=1 -Commands\32\Type=Drive Gain -Commands\32\String=\\x14\\x14 +Commands\31\Max=255 +Commands\32\Type=PBT Outer +Commands\32\String=\\x14\\x08 Commands\32\Min=0 Commands\32\Max=255 -Commands\33\Type=DSP IF Filter -Commands\33\String=\\x16\\x56 +Commands\33\Type=CW Pitch +Commands\33\String=\\x14\\x09 Commands\33\Min=0 -Commands\33\Max=1 -Commands\34\Type=Filter Width -Commands\34\String=\\x1a\\x03 +Commands\33\Max=255 +Commands\34\Type=RF Power +Commands\34\String=\\x14\\x0a Commands\34\Min=0 -Commands\34\Max=10000 -Commands\35\Type=Freq (TRX) -Commands\35\String=\\x00 +Commands\34\Max=255 +Commands\35\Type=Mic Gain +Commands\35\String=\\x14\\x0b Commands\35\Min=0 -Commands\35\Max=0 -Commands\36\Type=Freq Get -Commands\36\String=\\x03 +Commands\35\Max=255 +Commands\36\Type=Key Speed +Commands\36\String=\\x14\\x0c Commands\36\Min=0 -Commands\36\Max=0 -Commands\37\Type=Freq Set -Commands\37\String=\\x05 +Commands\36\Max=255 +Commands\37\Type=Compressor Level +Commands\37\String=\\x14\\x0e Commands\37\Min=0 -Commands\37\Max=0 -Commands\38\Type=Id Meter -Commands\38\String=\\x15\\x16 +Commands\37\Max=255 +Commands\38\Type=Break-In Delay +Commands\38\String=\\x14\\x0f Commands\38\Min=0 Commands\38\Max=255 -Commands\39\Type=IP Plus Status -Commands\39\String=\\x16\\x65 +Commands\39\Type=NB Level +Commands\39\String=\\x14\\x12 Commands\39\Min=0 -Commands\39\Max=1 -Commands\40\Type=Key Speed -Commands\40\String=\\x14\\x0c +Commands\39\Max=255 +Commands\40\Type=DIGI-SEL Shift +Commands\40\String=\\x14\\x13 Commands\40\Min=0 Commands\40\Max=255 -Commands\41\Type=LAN Mod Level -Commands\41\String=\\x1a\\x05\\x00\\x90 +Commands\41\Type=Drive Gain +Commands\41\String=\\x14\\x14 Commands\41\Min=0 Commands\41\Max=255 -Commands\42\Type=Main/Sub Freq -Commands\42\String=\\x25 +Commands\42\Type=Monitor Gain +Commands\42\String=\\x14\\x15 Commands\42\Min=0 -Commands\42\Max=1 -Commands\43\Type=Main/Sub Mode -Commands\43\String=\\x26 +Commands\42\Max=255 +Commands\43\Type=Vox Gain +Commands\43\String=\\x14\\x16 Commands\43\Min=0 -Commands\43\Max=1 -Commands\44\Type=Main/Sub Prefix -Commands\44\String=\\x29 +Commands\43\Max=255 +Commands\44\Type=Anti-Vox Gain +Commands\44\String=\\x14\\x17 Commands\44\Min=0 -Commands\44\Max=1 -Commands\45\Type=Main/Sub Tracking -Commands\45\String=\\x16\\x5e +Commands\44\Max=255 +Commands\45\Type=S Meter Sql Status +Commands\45\String=\\x15\\x01 Commands\45\Min=0 -Commands\45\Max=1 -Commands\46\Type=Manual Notch -Commands\46\String=\\x16\\x48 +Commands\45\Max=255 +Commands\46\Type=S Meter +Commands\46\String=\\x15\\x02 Commands\46\Min=0 -Commands\46\Max=1 -Commands\47\Type=Memory Clear -Commands\47\String=\\x0b -Commands\47\Min=1 -Commands\47\Max=101 -Commands\48\Type=Memory Contents -Commands\48\String=\\x1a\\00 -Commands\48\Min=1 -Commands\48\Max=101 -Commands\49\Type=Memory Mode -Commands\49\String=\\x08 -Commands\49\Min=1 -Commands\49\Max=101 -Commands\50\Type=Memory to VFO -Commands\50\String=\\x0a -Commands\50\Min=1 -Commands\50\Max=101 -Commands\51\Type=Memory Write -Commands\51\String=\\x09 -Commands\51\Min=1 -Commands\51\Max=101 -Commands\52\Type=Mic Gain -Commands\52\String=\\x14\\x0b +Commands\46\Max=255 +Commands\47\Type=Various Squelch +Commands\47\String=\\x15\\x05 +Commands\47\Min=0 +Commands\47\Max=255 +Commands\48\Type=Overflow Status +Commands\48\String=\\x15\\x07 +Commands\48\Min=0 +Commands\48\Max=1 +Commands\49\Type=Power Meter +Commands\49\String=\\x15\\x11 +Commands\49\Min=0 +Commands\49\Max=255 +Commands\50\Type=SWR Meter +Commands\50\String=\\x15\\x12 +Commands\50\Min=0 +Commands\50\Max=255 +Commands\51\Type=ALC Meter +Commands\51\String=\\x15\\x13 +Commands\51\Min=0 +Commands\51\Max=255 +Commands\52\Type=Comp Meter +Commands\52\String=\\x15\\x14 Commands\52\Min=0 Commands\52\Max=255 -Commands\53\Type=Mode (TRX) -Commands\53\String=\\x01 +Commands\53\Type=Vd Meter +Commands\53\String=\\x15\\x15 Commands\53\Min=0 -Commands\53\Max=0 -Commands\54\Type=Mode Get -Commands\54\String=\\x04 +Commands\53\Max=255 +Commands\54\Type=Id Meter +Commands\54\String=\\x15\\x16 Commands\54\Min=0 -Commands\54\Max=0 -Commands\55\Type=Mode Set -Commands\55\String=\\x06 +Commands\54\Max=255 +Commands\55\Type=Preamp Status +Commands\55\String=\\x16\\x02 Commands\55\Min=0 -Commands\55\Max=0 -Commands\56\Type=Monitor Gain -Commands\56\String=\\x14\\x15 +Commands\55\Max=2 +Commands\56\Type=AGC Time Constant +Commands\56\String=\\x16\\x12 Commands\56\Min=0 -Commands\56\Max=255 -Commands\57\Type=Monitor Status -Commands\57\String=\\x16\\x45 +Commands\56\Max=3 +Commands\57\Type=Noise Blanker +Commands\57\String=\\x16\\x22 Commands\57\Min=0 Commands\57\Max=1 -Commands\58\Type=NB Level -Commands\58\String=\\x14\\x12 +Commands\58\Type=Audio Peak Filter +Commands\58\String=\\x16\\x32 Commands\58\Min=0 -Commands\58\Max=255 -Commands\59\Type=Noise Blanker -Commands\59\String=\\x16\\x22 +Commands\58\Max=3 +Commands\59\Type=Noise Reduction +Commands\59\String=\\x16\\x40 Commands\59\Min=0 Commands\59\Max=1 -Commands\60\Type=Noise Reduction -Commands\60\String=\\x16\\x40 +Commands\60\Type=Auto Notch +Commands\60\String=\\x16\\x41 Commands\60\Min=0 Commands\60\Max=1 -Commands\61\Type=NR Level -Commands\61\String=\\x14\\x06 +Commands\61\Type=Repeater Tone +Commands\61\String=\\x16\\x42 Commands\61\Min=0 -Commands\61\Max=255 -Commands\62\Type=Overflow Status -Commands\62\String=\\x15\\x07 +Commands\61\Max=1 +Commands\62\Type=Repeater TSQL +Commands\62\String=\\x16\\x43 Commands\62\Min=0 Commands\62\Max=1 -Commands\63\Type=PBT Inner -Commands\63\String=\\x14\\x07 +Commands\63\Type=Compressor Status +Commands\63\String=\\x16\\x44 Commands\63\Min=0 -Commands\63\Max=255 -Commands\64\Type=PBT Outer -Commands\64\String=\\x14\\x08 +Commands\63\Max=1 +Commands\64\Type=Monitor Status +Commands\64\String=\\x16\\x45 Commands\64\Min=0 -Commands\64\Max=255 -Commands\65\Type=Power Control -Commands\65\String=\\x18 +Commands\64\Max=1 +Commands\65\Type=Vox Status +Commands\65\String=\\x16\\x46 Commands\65\Min=0 Commands\65\Max=1 -Commands\66\Type=Power Meter -Commands\66\String=\\x15\\x11 +Commands\66\Type=Break-In Status +Commands\66\String=\\x16\\x47 Commands\66\Min=0 -Commands\66\Max=255 -Commands\67\Type=Preamp Status -Commands\67\String=\\x16\\x02 +Commands\66\Max=1 +Commands\67\Type=Manual Notch +Commands\67\String=\\x16\\x48 Commands\67\Min=0 -Commands\67\Max=2 -Commands\68\Type=Quick Dual Watch -Commands\68\String=\\x1a\\x05\\x00\\x32 +Commands\67\Max=1 +Commands\68\Type=DIGI-Sel Status +Commands\68\String=\\x16\\x4e Commands\68\Min=0 Commands\68\Max=1 -Commands\69\Type=Quick Split -Commands\69\String=\\x1a\\x05\\x00\\x33 +Commands\69\Type=Twin Peak Filter +Commands\69\String=\\x16\\x4f Commands\69\Min=0 Commands\69\Max=1 -Commands\70\Type=Read TX Freq -Commands\70\String=\\x1c\\x03 +Commands\70\Type=Dial Lock Status +Commands\70\String=\\x16\\x50 Commands\70\Min=0 Commands\70\Max=1 -Commands\71\Type=REF Adjust -Commands\71\String=\\x1a\\x05\\x00\\x72 +Commands\71\Type=RX Antenna +Commands\71\String=\\x16\\x53 Commands\71\Min=0 -Commands\71\Max=255 -Commands\72\Type=REF Adjust Fine -Commands\72\String=\\x1A\\x05\\x00\\x73 +Commands\71\Max=1 +Commands\72\Type=DSP IF Filter +Commands\72\String=\\x16\\x56 Commands\72\Min=0 -Commands\72\Max=255 -Commands\73\Type=Repeater Tone -Commands\73\String=\\x16\\x42 +Commands\72\Max=1 +Commands\73\Type=SSB Bandwidth +Commands\73\String=\\x16\\x58 Commands\73\Min=0 -Commands\73\Max=1 -Commands\74\Type=Repeater TSQL -Commands\74\String=\\x16\\x43 +Commands\73\Max=2 +Commands\74\Type=Main/Sub Tracking +Commands\74\String=\\x16\\x5e Commands\74\Min=0 Commands\74\Max=1 -Commands\75\Type=RF Gain -Commands\75\String=\\x14\\x02 +Commands\75\Type=IP Plus Status +Commands\75\String=\\x16\\x65 Commands\75\Min=0 -Commands\75\Max=255 -Commands\76\Type=RF Power -Commands\76\String=\\x14\\x0a +Commands\75\Max=1 +Commands\76\Type=Send CW +Commands\76\String=\\x17 Commands\76\Min=0 -Commands\76\Max=255 -Commands\77\Type=RIT Frequency -Commands\77\String=\\x21\\x00 -Commands\77\Min=-9999 -Commands\77\Max=9999 -Commands\78\Type=RIT Status -Commands\78\String=\\x21\\x01 +Commands\76\Max=30 +Commands\77\Type=Power Control +Commands\77\String=\\x18 +Commands\77\Min=0 +Commands\77\Max=1 +Commands\78\Type=Transceiver ID +Commands\78\String=\\x19 Commands\78\Min=0 -Commands\78\Max=1 -Commands\79\Type=RIT TX Status -Commands\79\String=\\x21\\x02 -Commands\79\Min=0 -Commands\79\Max=1 -Commands\80\Type=RX Antenna -Commands\80\String=\\x16\\x53 -Commands\80\Min=0 -Commands\80\Max=1 -Commands\81\Type=S Meter -Commands\81\String=\\x15\\x02 +Commands\78\Max=0 +Commands\79\Type=Memory Contents +Commands\79\String=\\x1a\\00 +Commands\79\Min=1 +Commands\79\Max=101 +Commands\80\Type=Band Stacking Reg +Commands\80\String=\\x1a\\x01 +Commands\80\Min=1 +Commands\80\Max=11 +Commands\81\Type=Filter Width +Commands\81\String=\\x1a\\x03 Commands\81\Min=0 -Commands\81\Max=255 -Commands\82\Type=S Meter Sql Status -Commands\82\String=\\x15\\x01 +Commands\81\Max=10000 +Commands\82\Type=Quick Dual Watch +Commands\82\String=\\x1a\\x05\\x00\\x32 Commands\82\Min=0 -Commands\82\Max=255 -Commands\83\Type=Scanning -Commands\83\String=\\x0e +Commands\82\Max=1 +Commands\83\Type=Quick Split +Commands\83\String=\\x1a\\x05\\x00\\x33 Commands\83\Min=0 -Commands\83\Max=255 -Commands\84\Type=Scope Center Fixed -Commands\84\String=\\x27\\x14 +Commands\83\Max=1 +Commands\84\Type=REF Adjust +Commands\84\String=\\x1a\\x05\\x00\\x72 Commands\84\Min=0 -Commands\84\Max=1 -Commands\85\Type=Scope Center Span -Commands\85\String=\\x27\\x15 +Commands\84\Max=255 +Commands\85\Type=REF Adjust Fine +Commands\85\String=\\x1A\\x05\\x00\\x73 Commands\85\Min=0 -Commands\85\Max=7 -Commands\86\Type=Scope Center Type -Commands\86\String=\\x27\\x1c +Commands\85\Max=255 +Commands\86\Type=ACC1 Mod Level +Commands\86\String=\\x1A\\x05\\x00\\x88 Commands\86\Min=0 -Commands\86\Max=2 -Commands\87\Type=Scope Data Output -Commands\87\String=\\x27\\x11 +Commands\86\Max=255 +Commands\87\Type=USB Mod Level +Commands\87\String=\\x1a\\x05\\x00\\x89 Commands\87\Min=0 -Commands\87\Max=1 -Commands\88\Type=Scope During TX -Commands\88\String=\\x27\\x1b +Commands\87\Max=255 +Commands\88\Type=LAN Mod Level +Commands\88\String=\\x1a\\x05\\x00\\x90 Commands\88\Min=0 -Commands\88\Max=1 -Commands\89\Type=Scope Edge Number -Commands\89\String=\\x27\\x16 -Commands\89\Min=1 -Commands\89\Max=4 -Commands\90\Type=Scope Fixed Freq -Commands\90\String=\\x27\\x1e -Commands\90\Min=1 -Commands\90\Max=12 -Commands\91\Type=Scope Hold -Commands\91\String=\\x27\\x17 +Commands\88\Max=255 +Commands\89\Type=Data Off Mod Input +Commands\89\String=\\x1a\\x05\\x00\\x91 +Commands\89\Min=0 +Commands\89\Max=5 +Commands\90\Type=DATA1 Mod Input +Commands\90\String=\\x1a\\x05\\x00\\x92 +Commands\90\Min=0 +Commands\90\Max=5 +Commands\91\Type=DATA2 Mod Input +Commands\91\String=\\x1a\\x05\\x00\\x93 Commands\91\Min=0 -Commands\91\Max=1 -Commands\92\Type=Scope Main/Sub -Commands\92\String=\\x27\\x12 +Commands\91\Max=5 +Commands\92\Type=DATA3 Mod Input +Commands\92\String=\\x1a\\x05\\x00\\x94 Commands\92\Min=0 -Commands\92\Max=1 -Commands\93\Type=Scope On/Off -Commands\93\String=\\x27\\x10 +Commands\92\Max=5 +Commands\93\Type=CIV Transceive +Commands\93\String=\\x1a\\x05\\x01\\x12 Commands\93\Min=0 Commands\93\Max=1 -Commands\94\Type=Scope RBW -Commands\94\String=\\x27\\x1f +Commands\94\Type=System Date +Commands\94\String=\\x1a\\x05\\x01\\x58 Commands\94\Min=0 -Commands\94\Max=2 -Commands\95\Type=Scope Ref -Commands\95\String=\\x27\\x19 -Commands\95\Min=-30 -Commands\95\Max=10 -Commands\96\Type=Scope Single/Dual -Commands\96\String=\\x27\\x13 +Commands\94\Max=0 +Commands\95\Type=System Time +Commands\95\String=\\x1a\\x05\\x01\\x59 +Commands\95\Min=0 +Commands\95\Max=0 +Commands\96\Type=UTC Offset +Commands\96\String=\\x1a\\x05\\x01\\x62 Commands\96\Min=0 -Commands\96\Max=1 -Commands\97\Type=Scope Speed -Commands\97\String=\\x27\\x1a -Commands\97\Min=0 -Commands\97\Max=2 -Commands\98\Type=Scope VBW -Commands\98\String=\\x27\\x1d +Commands\96\Max=0 +Commands\97\Type=Dash Ratio +Commands\97\String=\\x1a\\x05\\x02\\x28 +Commands\97\Min=28 +Commands\97\Max=45 +Commands\98\Type=Data Mode Filter +Commands\98\String=\\x1a\\x06 Commands\98\Min=0 -Commands\98\Max=1 -Commands\99\Type=Scope Wave Data -Commands\99\String=\\x27\\x00 +Commands\98\Max=65535 +Commands\99\Type=Transceiver Status +Commands\99\String=\\x1c\\x00 Commands\99\Min=0 Commands\99\Max=1 -Commands\100\Type=Send CW -Commands\100\String=\\x17 +Commands\100\Type=Tuner/ATU Status +Commands\100\String=\\x1c\\x01 Commands\100\Min=0 -Commands\100\Max=30 -Commands\101\Type=Speech -Commands\101\String=\\x13 +Commands\100\Max=1 +Commands\101\Type=XFC Status +Commands\101\String=\\x1c\\x02 Commands\101\Min=0 -Commands\101\Max=2 -Commands\102\Type=Split Operation -Commands\102\String=\\x0f +Commands\101\Max=1 +Commands\102\Type=Read TX Freq +Commands\102\String=\\x1c\\x03 Commands\102\Min=0 Commands\102\Max=1 -Commands\103\Type=Squelch -Commands\103\String=\\x14\\x03 +Commands\103\Type=CI-V Output +Commands\103\String=\\x1c\\x04 Commands\103\Min=0 -Commands\103\Max=255 -Commands\104\Type=SSB Bandwidth -Commands\104\String=\\x16\\x58 -Commands\104\Min=0 -Commands\104\Max=2 -Commands\105\Type=SWR Meter -Commands\105\String=\\x15\\x12 +Commands\103\Max=1 +Commands\104\Type=RIT Frequency +Commands\104\String=\\x21\\x00 +Commands\104\Min=-9999 +Commands\104\Max=9999 +Commands\105\Type=RIT Status +Commands\105\String=\\x21\\x01 Commands\105\Min=0 -Commands\105\Max=255 -Commands\106\Type=System Date -Commands\106\String=\\x1a\\x05\\x01\\x58 +Commands\105\Max=1 +Commands\106\Type=RIT TX Status +Commands\106\String=\\x21\\x02 Commands\106\Min=0 -Commands\106\Max=0 -Commands\107\Type=System Time -Commands\107\String=\\x1a\\x05\\x01\\x59 +Commands\106\Max=1 +Commands\107\Type=Selected Freq +Commands\107\String=\\x25\\x00 Commands\107\Min=0 Commands\107\Max=0 -Commands\108\Type=Transceiver ID -Commands\108\String=\\x19 +Commands\108\Type=Unselected Freq +Commands\108\String=\\x25\\x01 Commands\108\Min=0 Commands\108\Max=0 -Commands\109\Type=Transceiver Status -Commands\109\String=\\x1c\\x00 +Commands\109\Type=Selected Mode +Commands\109\String=\\x26\\x00 Commands\109\Min=0 -Commands\109\Max=1 -Commands\110\Type=Tuner/ATU Status -Commands\110\String=\\x1c\\x01 +Commands\109\Max=0 +Commands\110\Type=Unselected Mode +Commands\110\String=\\x26\\x01 Commands\110\Min=0 -Commands\110\Max=1 -Commands\111\Type=Tuning Step -Commands\111\String=\\x10 +Commands\110\Max=0 +Commands\111\Type=Scope Wave Data +Commands\111\String=\\x27\\x00 Commands\111\Min=0 -Commands\111\Max=8 -Commands\112\Type=Twin Peak Filter -Commands\112\String=\\x16\\x4f +Commands\111\Max=1 +Commands\112\Type=Scope On/Off +Commands\112\String=\\x27\\x10 Commands\112\Min=0 Commands\112\Max=1 -Commands\113\Type=USB Mod Level -Commands\113\String=\\x1a\\x05\\x00\\x89 +Commands\113\Type=Scope Data Output +Commands\113\String=\\x27\\x11 Commands\113\Min=0 -Commands\113\Max=255 -Commands\114\Type=UTC Offset -Commands\114\String=\\x1a\\x05\\x01\\x62 +Commands\113\Max=1 +Commands\114\Type=Scope Main/Sub +Commands\114\String=\\x27\\x12 Commands\114\Min=0 -Commands\114\Max=0 -Commands\115\Type=Various Squelch -Commands\115\String=\\x15\\x05 +Commands\114\Max=1 +Commands\115\Type=Scope Single/Dual +Commands\115\String=\\x27\\x13 Commands\115\Min=0 -Commands\115\Max=255 -Commands\116\Type=Vd Meter -Commands\116\String=\\x15\\x15 +Commands\115\Max=1 +Commands\116\Type=Scope Center Fixed +Commands\116\String=\\x27\\x14 Commands\116\Min=0 -Commands\116\Max=255 -Commands\117\Type=VFO Dual Watch -Commands\117\String=\\x07\\xc2 +Commands\116\Max=1 +Commands\117\Type=Scope Center Span +Commands\117\String=\\x27\\x15 Commands\117\Min=0 -Commands\117\Max=1 -Commands\118\Type=VFO Dual Watch Off -Commands\118\String=\\x07\\xc0 -Commands\118\Min=0 -Commands\118\Max=0 -Commands\119\Type=VFO Dual Watch On -Commands\119\String=\\x07\\xc1 +Commands\117\Max=7 +Commands\118\Type=Scope Edge Number +Commands\118\String=\\x27\\x16 +Commands\118\Min=1 +Commands\118\Max=4 +Commands\119\Type=Scope Hold +Commands\119\String=\\x27\\x17 Commands\119\Min=0 -Commands\119\Max=0 -Commands\120\Type=VFO Equal MS -Commands\120\String=\\x07\\xb1 -Commands\120\Min=0 -Commands\120\Max=0 -Commands\121\Type=VFO Main Select -Commands\121\String=\\x07\\xd0 +Commands\119\Max=1 +Commands\120\Type=Scope Ref +Commands\120\String=\\x27\\x19 +Commands\120\Min=-30 +Commands\120\Max=10 +Commands\121\Type=Scope Speed +Commands\121\String=\\x27\\x1a Commands\121\Min=0 -Commands\121\Max=0 -Commands\122\Type=VFO Main/Sub Band -Commands\122\String=\\x07\\xd2 +Commands\121\Max=2 +Commands\122\Type=Scope During TX +Commands\122\String=\\x27\\x1b Commands\122\Min=0 Commands\122\Max=1 -Commands\123\Type=VFO Sub Select -Commands\123\String=\\x07\\xd1 +Commands\123\Type=Scope Center Type +Commands\123\String=\\x27\\x1c Commands\123\Min=0 -Commands\123\Max=0 -Commands\124\Type=VFO Swap M/S -Commands\124\String=\\x07\\xb0 +Commands\123\Max=2 +Commands\124\Type=Scope VBW +Commands\124\String=\\x27\\x1d Commands\124\Min=0 -Commands\124\Max=0 -Commands\125\Type=Vox Gain -Commands\125\String=\\x14\\x16 -Commands\125\Min=0 -Commands\125\Max=255 -Commands\126\Type=Vox Status -Commands\126\String=\\x16\\x46 +Commands\124\Max=1 +Commands\125\Type=Scope Fixed Freq +Commands\125\String=\\x27\\x1e +Commands\125\Min=1 +Commands\125\Max=12 +Commands\126\Type=Scope RBW +Commands\126\String=\\x27\\x1f Commands\126\Min=0 -Commands\126\Max=1 -Commands\127\Type=XFC Status -Commands\127\String=\\x1c\\x02 +Commands\126\Max=2 +Commands\127\Type=Main/Sub Prefix +Commands\127\String=\\x29 Commands\127\Min=0 Commands\127\Max=1 -Commands\size=127 +Commands\128\Type=Command Error FA +Commands\128\String=\\xfa +Commands\128\Min=0 +Commands\128\Max=0 +Commands\129\Type=Command OK FB +Commands\129\String=\\xfb +Commands\129\Min=0 +Commands\129\Max=0 +Commands\size=129 Spans\1\Num=0 Spans\1\Name=±2.5 KHz Spans\1\Freq=2500 @@ -556,115 +564,121 @@ Spans\8\Name=±500 KHz Spans\8\Freq=500000 Spans\size=8 Inputs\1\Num=0 +Inputs\1\Reg=0 Inputs\1\Name=MIC Inputs\2\Num=1 +Inputs\2\Reg=1 Inputs\2\Name=ACC -Inputs\3\Num=2 +Inputs\3\Num=5 +Inputs\3\Reg=2 Inputs\3\Name=M/A Inputs\4\Num=3 +Inputs\4\Reg=3 Inputs\4\Name=USB -Inputs\5\Num=4 +Inputs\5\Num=10 +Inputs\5\Reg=4 Inputs\5\Name=M/U -Inputs\6\Num=5 +Inputs\6\Num=4 +Inputs\6\Reg=5 Inputs\6\Name=LAN Inputs\size=6 -Bands\1\Num=23 -Bands\1\BSR=11 -Bands\1\Name=60m -Bands\1\Start=5250000 -Bands\1\End=5450000 -Bands\1\Range=0 +Bands\1\Num=20 +Bands\1\BSR=1 +Bands\1\Name=160m +Bands\1\Start=1800000 +Bands\1\End=2000000 +Bands\1\Range=2 Bands\1\MemoryGroup=-1 -Bands\2\Num=22 -Bands\2\BSR=11 -Bands\2\Name=Gen -Bands\2\Start=10000 -Bands\2\End=30000000 -Bands\2\Range=1.6 +Bands\2\Num=19 +Bands\2\BSR=2 +Bands\2\Name=80m +Bands\2\Start=3500000 +Bands\2\End=4000000 +Bands\2\Range=6 Bands\2\MemoryGroup=-1 -Bands\3\Num=21 -Bands\3\BSR=11 -Bands\3\Name=2200m -Bands\3\Start=135000 -Bands\3\End=138000 -Bands\3\Range=0 +Bands\3\Num=17 +Bands\3\BSR=3 +Bands\3\Name=40m +Bands\3\Start=7000000 +Bands\3\End=7300000 +Bands\3\Range=11 Bands\3\MemoryGroup=-1 -Bands\4\Num=20 -Bands\4\BSR=1 -Bands\4\Name=160m -Bands\4\Start=1800000 -Bands\4\End=2000000 -Bands\4\Range=2 +Bands\4\Num=16 +Bands\4\BSR=4 +Bands\4\Name=30m +Bands\4\Start=10100000 +Bands\4\End=10150000 +Bands\4\Range=15 Bands\4\MemoryGroup=-1 -Bands\5\Num=19 -Bands\5\BSR=2 -Bands\5\Name=80m -Bands\5\Start=3500000 -Bands\5\End=4000000 -Bands\5\Range=6 +Bands\5\Num=15 +Bands\5\BSR=5 +Bands\5\Name=20m +Bands\5\Start=14000000 +Bands\5\End=14350000 +Bands\5\Range=20 Bands\5\MemoryGroup=-1 -Bands\6\Num=18 -Bands\6\BSR=11 -Bands\6\Name=630m -Bands\6\Start=493000 -Bands\6\End=595000 -Bands\6\Range=8 +Bands\6\Num=14 +Bands\6\BSR=6 +Bands\6\Name=17m +Bands\6\Start=18068000 +Bands\6\End=18168000 +Bands\6\Range=22 Bands\6\MemoryGroup=-1 -Bands\7\Num=17 -Bands\7\BSR=3 -Bands\7\Name=40m -Bands\7\Start=7000000 -Bands\7\End=7300000 -Bands\7\Range=11 +Bands\7\Num=13 +Bands\7\BSR=7 +Bands\7\Name=15m +Bands\7\Start=21000000 +Bands\7\End=21450000 +Bands\7\Range=26 Bands\7\MemoryGroup=-1 -Bands\8\Num=16 -Bands\8\BSR=4 -Bands\8\Name=30m -Bands\8\Start=10100000 -Bands\8\End=10150000 -Bands\8\Range=15 +Bands\8\Num=12 +Bands\8\BSR=8 +Bands\8\Name=12m +Bands\8\Start=24890000 +Bands\8\End=24990000 +Bands\8\Range=30 Bands\8\MemoryGroup=-1 -Bands\9\Num=15 -Bands\9\BSR=5 -Bands\9\Name=20m -Bands\9\Start=14000000 -Bands\9\End=14350000 -Bands\9\Range=20 +Bands\9\Num=11 +Bands\9\BSR=9 +Bands\9\Name=10m +Bands\9\Start=28000000 +Bands\9\End=29700000 +Bands\9\Range=45 Bands\9\MemoryGroup=-1 -Bands\10\Num=14 -Bands\10\BSR=6 -Bands\10\Name=17m -Bands\10\Start=18068000 -Bands\10\End=18168000 -Bands\10\Range=22 +Bands\10\Num=10 +Bands\10\BSR=16 +Bands\10\Name=6m +Bands\10\Start=50000000 +Bands\10\End=54000000 +Bands\10\Range=60 Bands\10\MemoryGroup=-1 -Bands\11\Num=13 -Bands\11\BSR=7 -Bands\11\Name=15m -Bands\11\Start=21000000 -Bands\11\End=21450000 -Bands\11\Range=26 +Bands\11\Num=18 +Bands\11\BSR=17 +Bands\11\Name=630m +Bands\11\Start=493000 +Bands\11\End=595000 +Bands\11\Range=8 Bands\11\MemoryGroup=-1 -Bands\12\Num=12 -Bands\12\BSR=8 -Bands\12\Name=12m -Bands\12\Start=24890000 -Bands\12\End=24990000 -Bands\12\Range=30 +Bands\12\Num=21 +Bands\12\BSR=17 +Bands\12\Name=2200m +Bands\12\Start=135000 +Bands\12\End=138000 +Bands\12\Range=0 Bands\12\MemoryGroup=-1 -Bands\13\Num=11 -Bands\13\BSR=9 -Bands\13\Name=10m -Bands\13\Start=28000000 -Bands\13\End=29700000 -Bands\13\Range=45 +Bands\13\Num=22 +Bands\13\BSR=17 +Bands\13\Name=Gen +Bands\13\Start=10000 +Bands\13\End=30000000 +Bands\13\Range=1.6 Bands\13\MemoryGroup=-1 -Bands\14\Num=10 -Bands\14\BSR=10 -Bands\14\Name=6m -Bands\14\Start=50000000 -Bands\14\End=54000000 -Bands\14\Range=60 +Bands\14\Num=23 +Bands\14\BSR=17 +Bands\14\Name=60m +Bands\14\Start=5250000 +Bands\14\End=5450000 +Bands\14\Range=0 Bands\14\MemoryGroup=-1 Bands\size=14 Modes\1\Num=0 @@ -700,11 +714,11 @@ Modes\8\Reg=8 Modes\8\Name=RTTY-R Modes\8\BW=1 Modes\9\Num=8 -Modes\9\Reg=12 +Modes\9\Reg=18 Modes\9\Name=PSK Modes\9\BW=1 Modes\10\Num=9 -Modes\10\Reg=13 +Modes\10\Reg=19 Modes\10\Name=PSK-R Modes\10\BW=1 Modes\size=10 @@ -712,18 +726,18 @@ Attenuators\1\dB=0 Attenuators\2\dB=3 Attenuators\3\dB=6 Attenuators\4\dB=9 -Attenuators\5\dB=12 -Attenuators\6\dB=15 -Attenuators\7\dB=18 -Attenuators\8\dB=21 -Attenuators\9\dB=24 -Attenuators\10\dB=27 -Attenuators\11\dB=30 -Attenuators\12\dB=33 -Attenuators\13\dB=36 -Attenuators\14\dB=39 -Attenuators\15\dB=42 -Attenuators\16\dB=45 +Attenuators\5\dB=18 +Attenuators\6\dB=21 +Attenuators\7\dB=24 +Attenuators\8\dB=33 +Attenuators\9\dB=36 +Attenuators\10\dB=39 +Attenuators\11\dB=48 +Attenuators\12\dB=51 +Attenuators\13\dB=54 +Attenuators\14\dB=57 +Attenuators\15\dB=66 +Attenuators\16\dB=69 Attenuators\size=16 Preamps\1\Num=0 Preamps\1\Name=OFF diff --git a/transceiveradjustments.cpp b/transceiveradjustments.cpp index 20bc588..413814e 100644 --- a/transceiveradjustments.cpp +++ b/transceiveradjustments.cpp @@ -58,26 +58,26 @@ void transceiverAdjustments::on_IFShiftSlider_valueChanged(int value) } else { - unsigned char inner = ui->TPBFInnerSlider->value(); - unsigned char outer = ui->TPBFOuterSlider->value(); + unsigned char inner = ui->PBTInnerSlider->value(); + unsigned char outer = ui->PBTOuterSlider->value(); int shift = value - previousIFShift; inner = qMax( 0, qMin(255,int (inner + shift)) ); outer = qMax( 0, qMin(255,int (outer + shift)) ); - ui->TPBFInnerSlider->setValue(inner); - ui->TPBFOuterSlider->setValue(outer); + ui->PBTInnerSlider->setValue(inner); + ui->PBTOuterSlider->setValue(outer); previousIFShift = value; } } -void transceiverAdjustments::on_TPBFInnerSlider_valueChanged(int value) +void transceiverAdjustments::on_PBTInnerSlider_valueChanged(int value) { - emit setTPBFInner(value); + emit setPBTInner(value); } -void transceiverAdjustments::on_TPBFOuterSlider_valueChanged(int value) +void transceiverAdjustments::on_PBTOuterSlider_valueChanged(int value) { - emit setTPBFOuter(value); + emit setPBTOuter(value); } void transceiverAdjustments::setRig(rigCapabilities rig) @@ -88,11 +88,11 @@ void transceiverAdjustments::setRig(rigCapabilities rig) //ui->IFShiftSlider->setVisible(rigCaps.hasIFShift); //ui->IFShiftLabel->setVisible(rigCaps.hasIFShift); - ui->TPBFInnerSlider->setVisible(rigCaps.commands.contains(funcPBTInner)); - ui->TPBFInnerLabel->setVisible(rigCaps.commands.contains(funcPBTInner)); + ui->PBTInnerSlider->setVisible(rigCaps.commands.contains(funcPBTInner)); + ui->PBTInnerLabel->setVisible(rigCaps.commands.contains(funcPBTInner)); - ui->TPBFOuterSlider->setVisible(rigCaps.commands.contains(funcPBTOuter)); - ui->TPBFOuterLabel->setVisible(rigCaps.commands.contains(funcPBTOuter)); + ui->PBTOuterSlider->setVisible(rigCaps.commands.contains(funcPBTOuter)); + ui->PBTOuterLabel->setVisible(rigCaps.commands.contains(funcPBTOuter)); haveRigCaps = true; } @@ -105,18 +105,18 @@ void transceiverAdjustments::updateIFShift(unsigned char level) ui->IFShiftSlider->blockSignals(false); } -void transceiverAdjustments::updateTPBFInner(unsigned char level) +void transceiverAdjustments::updatePBTInner(unsigned char level) { - ui->TPBFInnerSlider->blockSignals(true); - ui->TPBFInnerSlider->setValue(level); - ui->TPBFInnerSlider->blockSignals(false); + ui->PBTInnerSlider->blockSignals(true); + ui->PBTInnerSlider->setValue(level); + ui->PBTInnerSlider->blockSignals(false); } -void transceiverAdjustments::updateTPBFOuter(unsigned char level) +void transceiverAdjustments::updatePBTOuter(unsigned char level) { - ui->TPBFOuterSlider->blockSignals(true); - ui->TPBFOuterSlider->setValue(level); - ui->TPBFOuterSlider->blockSignals(false); + ui->PBTOuterSlider->blockSignals(true); + ui->PBTOuterSlider->setValue(level); + ui->PBTOuterSlider->blockSignals(false); } void transceiverAdjustments::updatePassband(quint16 passbandHz) @@ -137,8 +137,8 @@ void transceiverAdjustments::updatePassband(quint16 passbandHz) void transceiverAdjustments::on_resetPBTbtn_clicked() { - ui->TPBFInnerSlider->setValue(128); - ui->TPBFOuterSlider->setValue(128); + ui->PBTInnerSlider->setValue(128); + ui->PBTOuterSlider->setValue(128); ui->IFShiftSlider->blockSignals(true); ui->IFShiftSlider->setValue(128); ui->IFShiftSlider->blockSignals(false); diff --git a/transceiveradjustments.h b/transceiveradjustments.h index 0c4e576..22e7af8 100644 --- a/transceiveradjustments.h +++ b/transceiveradjustments.h @@ -26,24 +26,24 @@ public: signals: void setIFShift(unsigned char level); - void setTPBFInner(unsigned char level); - void setTPBFOuter(unsigned char level); + void setPBTInner(unsigned char level); + void setPBTOuter(unsigned char level); void setPassband(quint16 passbandHz); public slots: void setRig(rigCapabilities rig); void updateIFShift(unsigned char level); - void updateTPBFInner(unsigned char level); - void updateTPBFOuter(unsigned char level); + void updatePBTInner(unsigned char level); + void updatePBTOuter(unsigned char level); void updatePassband(quint16 passbandHz); private slots: void on_IFShiftSlider_valueChanged(int value); - void on_TPBFInnerSlider_valueChanged(int value); + void on_PBTInnerSlider_valueChanged(int value); - void on_TPBFOuterSlider_valueChanged(int value); + void on_PBTOuterSlider_valueChanged(int value); void on_resetPBTbtn_clicked(); diff --git a/transceiveradjustments.ui b/transceiveradjustments.ui index d0ef8fe..aea5e96 100644 --- a/transceiveradjustments.ui +++ b/transceiveradjustments.ui @@ -184,7 +184,7 @@ 0 - + 70 @@ -203,7 +203,7 @@ - + 230 @@ -235,7 +235,7 @@ 0 - + 70 @@ -254,7 +254,7 @@ - + 230 diff --git a/usbcontroller.cpp b/usbcontroller.cpp index b61c798..3b8d60c 100644 --- a/usbcontroller.cpp +++ b/usbcontroller.cpp @@ -680,14 +680,14 @@ void usbController::runTimer() qDebug(logUsbControl()) << QString("On Button event for button %0: %1").arg(but->num).arg(but->onCommand->text); if (but->onCommand->command == cmdPageUp) emit changePage(dev, dev->currentPage+1); - else if (but->onCommand->command == cmdPageDown) + else if (but->onCommand->command == funcPageDown) emit changePage(dev, dev->currentPage-1); - else if (but->onCommand->command == cmdLCDSpectrum) - dev->lcd = cmdLCDSpectrum; - else if (but->onCommand->command == cmdLCDWaterfall) - dev->lcd = cmdLCDWaterfall; - else if (but->onCommand->command == cmdLCDNothing) { - dev->lcd = cmdLCDNothing; + else if (but->onCommand->command == funcLCDSpectrum) + dev->lcd = funcLCDSpectrum; + else if (but->onCommand->command == funcLCDWaterfall) + dev->lcd = funcLCDWaterfall; + else if (but->onCommand->command == funcLCDNothing) { + dev->lcd = funcLCDNothing; QTimer::singleShot(0, this, [=]() { sendRequest(dev,usbFeatureType::featureColor,i,"",Q_NULLPTR, &dev->color); }); }else { emit button(but->onCommand); @@ -701,16 +701,16 @@ void usbController::runTimer() else if ((but->toggle && but->isOn) && ((tempButtons >> i & 1) && !(dev->buttons >> i & 1))) { qDebug(logUsbControl()) << QString("Off Button (toggle) event for button %0: %1").arg(but->num).arg(but->onCommand->text); - if (but->offCommand->command == cmdPageUp) + if (but->offCommand->command == funcPageUp) emit changePage(dev, dev->currentPage+1); - else if (but->offCommand->command == cmdPageDown) + else if (but->offCommand->command == funcPageDown) emit changePage(dev, dev->currentPage-1); - else if (but->offCommand->command == cmdLCDSpectrum) - dev->lcd = cmdLCDSpectrum; - else if (but->offCommand->command == cmdLCDWaterfall) - dev->lcd = cmdLCDWaterfall; - else if (but->offCommand->command == cmdLCDNothing) { - dev->lcd = cmdLCDNothing; + else if (but->offCommand->command == funcLCDSpectrum) + dev->lcd = funcLCDSpectrum; + else if (but->offCommand->command == funcLCDWaterfall) + dev->lcd = funcLCDWaterfall; + else if (but->offCommand->command == funcLCDNothing) { + dev->lcd = funcLCDNothing; QTimer::singleShot(0, this, [=]() { sendRequest(dev,usbFeatureType::featureColor,i,"",Q_NULLPTR, &dev->color); }); } else { emit button(but->offCommand); @@ -720,13 +720,13 @@ void usbController::runTimer() } else if ((!but->toggle && but->isOn) && ((dev->buttons >> i & 1) && !(tempButtons >> i & 1))) { - if (but->offCommand->command == cmdLCDSpectrum) - dev->lcd = cmdLCDSpectrum; - else if (but->offCommand->command == cmdLCDWaterfall) - dev->lcd = cmdLCDWaterfall; - else if (but->offCommand->command == cmdLCDNothing) { + if (but->offCommand->command == funcLCDSpectrum) + dev->lcd = funcLCDSpectrum; + else if (but->offCommand->command == funcLCDWaterfall) + dev->lcd = funcLCDWaterfall; + else if (but->offCommand->command == funcLCDNothing) { QTimer::singleShot(0, this, [=]() { sendRequest(dev,usbFeatureType::featureColor,i,"",Q_NULLPTR, &dev->color); }); - dev->lcd = cmdLCDNothing; + dev->lcd = funcLCDNothing; } else { qDebug(logUsbControl()) << QString("Off Button event for button %0: %1").arg(but->num).arg(but->offCommand->text); @@ -1585,103 +1585,105 @@ void usbController::loadCommands() int num = 0; // Important commands at the top! commands.append(COMMAND(num++, "None", commandAny, cmdNone, (quint8)0x0)); - commands.append(COMMAND(num++, "PTT On", commandButton, cmdSetPTT, cmdGetPTT, (quint8)0x1)); - commands.append(COMMAND(num++, "PTT Off", commandButton, cmdSetPTT, cmdGetPTT, (quint8)0x0)); - commands.append(COMMAND(num++, "VFOA", commandKnob, cmdSetFreq, cmdGetFreq, (quint8)0x0)); - commands.append(COMMAND(num++, "VFOB", commandKnob, cmdSetFreq, cmdGetFreq, (quint8)0x1)); - commands.append(COMMAND(num++, "Freq Down", commandButton, cmdSetFreq, cmdGetFreq, (int)-1)); - commands.append(COMMAND(num++, "Freq Up", commandButton, cmdSetFreq, cmdGetFreq, (int)1)); - commands.append(COMMAND(num++, "PTT Off", commandButton, cmdSetPTT, cmdGetPTT, (quint8)0x0)); - commands.append(COMMAND(num++, "PTT Toggle", commandButton, cmdPTTToggle, cmdGetPTT, (quint8)0x0)); - commands.append(COMMAND(num++, "Span/Step", commandKnob, cmdSeparator, (quint8)0x0)); - commands.append(COMMAND(num++, "Tune", commandButton, cmdStartATU, (quint8)0x0)); - commands.append(COMMAND(num++, "Span/Step", commandButton, cmdSeparator, (quint8)0x0)); - commands.append(COMMAND(num++, "Step+", commandButton, cmdSetStepUp, (quint8)0x0)); - commands.append(COMMAND(num++, "Step-", commandButton, cmdSetStepDown, (quint8)0x0)); - commands.append(COMMAND(num++, "Span+", commandButton, cmdSetSpanUp, (quint8)0x0)); - commands.append(COMMAND(num++, "Span-", commandButton, cmdSetSpanDown, (quint8)0x0)); - commands.append(COMMAND(num++, "Modes", commandButton, cmdSeparator, (quint8)0x0)); - commands.append(COMMAND(num++, "Mode+", commandButton, cmdSetModeUp, (quint8)0x0)); - commands.append(COMMAND(num++, "Mode-", commandButton, cmdSetModeDown, (quint8)0x0)); - commands.append(COMMAND(num++, "Mode LSB", commandButton, cmdSetMode, modeLSB)); - commands.append(COMMAND(num++, "Mode USB", commandButton, cmdSetMode, modeUSB)); - commands.append(COMMAND(num++, "Mode LSBD", commandButton, cmdSetMode, modeLSB_D)); - commands.append(COMMAND(num++, "Mode USBD", commandButton, cmdSetMode, modeUSB_D)); - commands.append(COMMAND(num++, "Mode CW", commandButton, cmdSetMode, modeCW)); - commands.append(COMMAND(num++, "Mode CWR", commandButton, cmdSetMode, modeCW_R)); - commands.append(COMMAND(num++, "Mode FM", commandButton, cmdSetMode, modeFM)); - commands.append(COMMAND(num++, "Mode AM", commandButton, cmdSetMode, modeAM)); - commands.append(COMMAND(num++, "Mode RTTY", commandButton, cmdSetMode, modeRTTY)); - commands.append(COMMAND(num++, "Mode RTTYR", commandButton, cmdSetMode, modeRTTY_R)); - commands.append(COMMAND(num++, "Mode PSK", commandButton, cmdSetMode, modePSK)); - commands.append(COMMAND(num++, "Mode PSKR", commandButton, cmdSetMode, modePSK_R)); - commands.append(COMMAND(num++, "Mode DV", commandButton, cmdSetMode, modeDV)); - commands.append(COMMAND(num++, "Mode DD", commandButton, cmdSetMode, modeDD)); - commands.append(COMMAND(num++, "Bands", commandButton, cmdSeparator, (quint8)0x0)); - commands.append(COMMAND(num++, "Band+", commandButton, cmdSetBandUp, (quint8)0x0)); - commands.append(COMMAND(num++, "Band-", commandButton, cmdSetBandDown, (quint8)0x0)); - commands.append(COMMAND(num++, "Band 23cm", commandButton, cmdGetBandStackReg, band23cm)); - commands.append(COMMAND(num++, "Band 70cm", commandButton, cmdGetBandStackReg, band70cm)); - commands.append(COMMAND(num++, "Band 2m", commandButton, cmdGetBandStackReg, band2m)); - commands.append(COMMAND(num++, "Band AIR", commandButton, cmdGetBandStackReg, bandAir)); - commands.append(COMMAND(num++, "Band WFM", commandButton, cmdGetBandStackReg, bandWFM)); - commands.append(COMMAND(num++, "Band 4m", commandButton, cmdGetBandStackReg, band4m)); - commands.append(COMMAND(num++, "Band 6m", commandButton, cmdGetBandStackReg, band6m)); - commands.append(COMMAND(num++, "Band 10m", commandButton, cmdGetBandStackReg, band10m)); - commands.append(COMMAND(num++, "Band 12m", commandButton, cmdGetBandStackReg, band12m)); - commands.append(COMMAND(num++, "Band 15m", commandButton, cmdGetBandStackReg, band15m)); - commands.append(COMMAND(num++, "Band 17m", commandButton, cmdGetBandStackReg, band17m)); - commands.append(COMMAND(num++, "Band 20m", commandButton, cmdGetBandStackReg, band20m)); - commands.append(COMMAND(num++, "Band 30m", commandButton, cmdGetBandStackReg, band30m)); - commands.append(COMMAND(num++, "Band 40m", commandButton, cmdGetBandStackReg, band40m)); - commands.append(COMMAND(num++, "Band 60m", commandButton, cmdGetBandStackReg, band60m)); - commands.append(COMMAND(num++, "Band 80m", commandButton, cmdGetBandStackReg, band80m)); - commands.append(COMMAND(num++, "Band 160m", commandButton, cmdGetBandStackReg, band160m)); - commands.append(COMMAND(num++, "Band 630m", commandButton, cmdGetBandStackReg, band630m)); - commands.append(COMMAND(num++, "Band 2200m", commandButton, cmdGetBandStackReg, band2200m)); - commands.append(COMMAND(num++, "Band GEN", commandButton, cmdGetBandStackReg, bandGen)); - commands.append(COMMAND(num++, "NB/NR", commandButton, cmdSeparator, (quint8)0x0)); - commands.append(COMMAND(num++, "NR On", commandButton, cmdSetNR, cmdGetNR, (quint8)0x01)); - commands.append(COMMAND(num++, "NR Off", commandButton, cmdSetNR, cmdGetNR, (quint8)0x0)); - commands.append(COMMAND(num++, "NB On", commandButton, cmdSetNB, cmdGetNB, (quint8)0x01)); - commands.append(COMMAND(num++, "NB Off", commandButton, cmdSetNB, cmdGetNB, (quint8)0x0)); - commands.append(COMMAND(num++, "Moni On", commandButton, cmdSetMonitor, cmdGetMonitor, (quint8)0x01)); - commands.append(COMMAND(num++, "Moni Off", commandButton, cmdSetMonitor, cmdGetMonitor, (quint8)0x0)); - commands.append(COMMAND(num++, "Comp On", commandButton, cmdSetComp, cmdGetComp, (quint8)0x01)); - commands.append(COMMAND(num++, "Comp Off", commandButton, cmdSetComp, cmdGetComp, (quint8)0x0)); - commands.append(COMMAND(num++, "Vox On", commandButton, cmdSetVox, cmdGetVox, (quint8)0x01)); - commands.append(COMMAND(num++, "Vox Off", commandButton, cmdSetVox, cmdGetVox, (quint8)0x0)); - commands.append(COMMAND(num++, "Split", commandButton, cmdNone, (quint8)0x0)); - commands.append(COMMAND(num++, "Split On", commandButton, cmdSetQuickSplit, cmdGetDuplexMode, (quint8)0x01)); - commands.append(COMMAND(num++, "Split Off", commandButton, cmdSetQuickSplit, cmdGetDuplexMode, (quint8)0x0)); - commands.append(COMMAND(num++, "Swap VFO", commandButton, cmdVFOSwap, (quint8)0x0)); - commands.append(COMMAND(num++, "Scope", commandButton, cmdNone, (quint8)0x0)); - commands.append(COMMAND(num++, "Spectrum", commandButton, cmdLCDSpectrum, (quint8)0x0)); - commands.append(COMMAND(num++, "Waterfall", commandButton, cmdLCDWaterfall, (quint8)0x0)); - commands.append(COMMAND(num++, "No Display", commandButton, cmdLCDNothing, (quint8)0x0)); + commands.append(COMMAND(num++, "PTT On", commandButton, funcTransceiverStatus, funcTransceiverStatus, (quint8)0x1)); + commands.append(COMMAND(num++, "PTT Off", commandButton, funcTransceiverStatus, funcTransceiverStatus, (quint8)0x0)); + commands.append(COMMAND(num++, "VFOA", commandKnob, funcFreqSet, funcFreqSet, (quint8)0x0)); + commands.append(COMMAND(num++, "VFOB", commandKnob, funcFreqSet, funcFreqSet, (quint8)0x1)); + commands.append(COMMAND(num++, "Freq Down", commandButton, funcFreqSet, funcFreqSet, (int)-1)); + commands.append(COMMAND(num++, "Freq Up", commandButton, funcFreqSet, funcFreqSet, (int)1)); + commands.append(COMMAND(num++, "PTT Off", commandButton, funcTransceiverStatus, funcTransceiverStatus, (quint8)0x0)); + commands.append(COMMAND(num++, "PTT Toggle", commandButton, funcTransceiverStatus, funcTransceiverStatus, (quint8)0x0)); + commands.append(COMMAND(num++, "Span/Step", commandKnob, funcSeparator, (quint8)0x0)); + commands.append(COMMAND(num++, "Tune", commandButton, funcTunerStatus, (quint8)0x0)); + commands.append(COMMAND(num++, "Span/Step", commandButton, funcSeparator, (quint8)0x0)); + commands.append(COMMAND(num++, "Step+", commandButton, funcTuningStep, 100)); + commands.append(COMMAND(num++, "Step-", commandButton, funcTuningStep, -100)); + commands.append(COMMAND(num++, "Span+", commandButton, funcScopeCenterSpan, 100)); + commands.append(COMMAND(num++, "Span-", commandButton, funcScopeCenterSpan, -100)); + commands.append(COMMAND(num++, "Modes", commandButton, funcSeparator, (quint8)0x0)); + commands.append(COMMAND(num++, "Mode+", commandButton, funcModeSet, 100)); + commands.append(COMMAND(num++, "Mode-", commandButton, funcModeSet, -100)); + commands.append(COMMAND(num++, "Mode LSB", commandButton, funcModeSet, modeLSB)); + commands.append(COMMAND(num++, "Mode USB", commandButton, funcModeSet, modeUSB)); + commands.append(COMMAND(num++, "Mode LSBD", commandButton, funcModeSet, modeLSB_D)); + commands.append(COMMAND(num++, "Mode USBD", commandButton, funcModeSet, modeUSB_D)); + commands.append(COMMAND(num++, "Mode CW", commandButton, funcModeSet, modeCW)); + commands.append(COMMAND(num++, "Mode CWR", commandButton, funcModeSet, modeCW_R)); + commands.append(COMMAND(num++, "Mode FM", commandButton, funcModeSet, modeFM)); + commands.append(COMMAND(num++, "Mode AM", commandButton, funcModeSet, modeAM)); + commands.append(COMMAND(num++, "Mode RTTY", commandButton, funcModeSet, modeRTTY)); + commands.append(COMMAND(num++, "Mode RTTYR", commandButton, funcModeSet, modeRTTY_R)); + commands.append(COMMAND(num++, "Mode PSK", commandButton, funcModeSet, modePSK)); + commands.append(COMMAND(num++, "Mode PSKR", commandButton, funcModeSet, modePSK_R)); + commands.append(COMMAND(num++, "Mode DV", commandButton, funcModeSet, modeDV)); + commands.append(COMMAND(num++, "Mode DD", commandButton, funcModeSet, modeDD)); + commands.append(COMMAND(num++, "Bands", commandButton, funcSeparator, (quint8)0x0)); + commands.append(COMMAND(num++, "Band+", commandButton, funcBandStackReg, 100)); + commands.append(COMMAND(num++, "Band-", commandButton, funcBandStackReg, -100)); + commands.append(COMMAND(num++, "Band 23cm", commandButton, funcBandStackReg, band23cm)); + commands.append(COMMAND(num++, "Band 70cm", commandButton, funcBandStackReg, band70cm)); + commands.append(COMMAND(num++, "Band 2m", commandButton, funcBandStackReg, band2m)); + commands.append(COMMAND(num++, "Band AIR", commandButton, funcBandStackReg, bandAir)); + commands.append(COMMAND(num++, "Band WFM", commandButton, funcBandStackReg, bandWFM)); + commands.append(COMMAND(num++, "Band 4m", commandButton, funcBandStackReg, band4m)); + commands.append(COMMAND(num++, "Band 6m", commandButton, funcBandStackReg, band6m)); + commands.append(COMMAND(num++, "Band 10m", commandButton, funcBandStackReg, band10m)); + commands.append(COMMAND(num++, "Band 12m", commandButton, funcBandStackReg, band12m)); + commands.append(COMMAND(num++, "Band 15m", commandButton, funcBandStackReg, band15m)); + commands.append(COMMAND(num++, "Band 17m", commandButton, funcBandStackReg, band17m)); + commands.append(COMMAND(num++, "Band 20m", commandButton, funcBandStackReg, band20m)); + commands.append(COMMAND(num++, "Band 30m", commandButton, funcBandStackReg, band30m)); + commands.append(COMMAND(num++, "Band 40m", commandButton, funcBandStackReg, band40m)); + commands.append(COMMAND(num++, "Band 60m", commandButton, funcBandStackReg, band60m)); + commands.append(COMMAND(num++, "Band 80m", commandButton, funcBandStackReg, band80m)); + commands.append(COMMAND(num++, "Band 160m", commandButton, funcBandStackReg, band160m)); + commands.append(COMMAND(num++, "Band 630m", commandButton, funcBandStackReg, band630m)); + commands.append(COMMAND(num++, "Band 2200m", commandButton, funcBandStackReg, band2200m)); + commands.append(COMMAND(num++, "Band GEN", commandButton, funcBandStackReg, bandGen)); + commands.append(COMMAND(num++, "NB/NR", commandButton, funcSeparator, (quint8)0x0)); + commands.append(COMMAND(num++, "NR On", commandButton, funcNoiseReduction, cmdGetNR, (quint8)0x01)); + commands.append(COMMAND(num++, "NR Off", commandButton, funcNoiseReduction, cmdGetNR, (quint8)0x0)); + commands.append(COMMAND(num++, "NB On", commandButton, funcNoiseBlanker, cmdGetNB, (quint8)0x01)); + commands.append(COMMAND(num++, "NB Off", commandButton, funcNoiseBlanker, cmdGetNB, (quint8)0x0)); + commands.append(COMMAND(num++, "Moni On", commandButton, funcMonitor, cmdGetMonitor, (quint8)0x01)); + commands.append(COMMAND(num++, "Moni Off", commandButton, funcMonitor, cmdGetMonitor, (quint8)0x0)); + commands.append(COMMAND(num++, "Comp On", commandButton, funcCompressor, cmdGetComp, (quint8)0x01)); + commands.append(COMMAND(num++, "Comp Off", commandButton, funcCompressor, cmdGetComp, (quint8)0x0)); + commands.append(COMMAND(num++, "Vox On", commandButton, funcVox, cmdGetVox, (quint8)0x01)); + commands.append(COMMAND(num++, "Vox Off", commandButton, funcVox, cmdGetVox, (quint8)0x0)); + commands.append(COMMAND(num++, "Split", commandButton, funcSeparator, (quint8)0x0)); + commands.append(COMMAND(num++, "Split On", commandButton, funcQuickSplit, cmdGetDuplexMode, (quint8)0x01)); + commands.append(COMMAND(num++, "Split Off", commandButton, funcQuickSplit, cmdGetDuplexMode, (quint8)0x0)); + commands.append(COMMAND(num++, "Swap VFO AB", commandButton, funcVFOSwapAB, (quint8)0x0)); + commands.append(COMMAND(num++, "Swap VFO MS", commandButton, funcVFOSwapMS, (quint8)0x0)); + commands.append(COMMAND(num++, "Scope", commandButton, funcSeparator, (quint8)0x0)); + commands.append(COMMAND(num++, "Spectrum", commandButton, funcLCDSpectrum, (quint8)0x0)); + commands.append(COMMAND(num++, "Waterfall", commandButton, funcLCDWaterfall, (quint8)0x0)); + commands.append(COMMAND(num++, "No Display", commandButton, funcLCDNothing, (quint8)0x0)); commands.append(COMMAND(num++, "Pages", commandButton, cmdSeparator, (quint8)0x0)); - commands.append(COMMAND(num++, "Page Down", commandButton, cmdPageDown, (quint8)0x0)); - commands.append(COMMAND(num++, "Page Up", commandButton, cmdPageUp, (quint8)0x0)); + commands.append(COMMAND(num++, "Page Down", commandButton, funcPageDown, (quint8)0x0)); + commands.append(COMMAND(num++, "Page Up", commandButton, funcPageUp, (quint8)0x0)); - commands.append(COMMAND(num++, "AF Gain", commandKnob, cmdSetAfGain, cmdGetAfGain, (quint8)0xff)); - commands.append(COMMAND(num++, "RF Gain", commandKnob, cmdSetRxRfGain, cmdGetRxGain, (quint8)0xff)); - commands.append(COMMAND(num++, "TX Power", commandKnob, cmdSetTxPower, cmdGetTxPower, (quint8)0xff)); - commands.append(COMMAND(num++, "Mic Gain", commandKnob, cmdSetMicGain, cmdGetMicGain, (quint8)0xff)); - commands.append(COMMAND(num++, "Mod Level", commandKnob, cmdSetModLevel, cmdNone, (quint8)0xff)); - commands.append(COMMAND(num++, "Squelch", commandKnob, cmdSetSql, cmdGetSql, (quint8)0xff)); - commands.append(COMMAND(num++, "Monitor", commandKnob, cmdSetMonitorGain, cmdGetMonitorGain, (quint8)0xff)); - commands.append(COMMAND(num++, "Compressor", commandKnob, cmdSetCompLevel, cmdGetCompLevel, (quint8)0xff)); - commands.append(COMMAND(num++, "Vox Level", commandKnob, cmdSetVoxGain, cmdGetVoxGain, (quint8)0xff)); - commands.append(COMMAND(num++, "Anti-Vox", commandKnob, cmdSetAntiVoxGain, cmdGetAntiVoxGain, (quint8)0xff)); - commands.append(COMMAND(num++, "NB Level", commandKnob, cmdSetNBLevel, cmdGetNBLevel, (quint8)0xff)); - commands.append(COMMAND(num++, "NR Level", commandKnob, cmdSetNRLevel, cmdGetNRLevel, (quint8)0xff)); + commands.append(COMMAND(num++, "AF Gain", commandKnob, funcAfGain, funcAfGain, (quint8)0xff)); + commands.append(COMMAND(num++, "RF Gain", commandKnob, funcRfGain, funcRfGain, (quint8)0xff)); + commands.append(COMMAND(num++, "TX Power", commandKnob, funcRFPower, funcRFPower, (quint8)0xff)); + commands.append(COMMAND(num++, "Mic Gain", commandKnob, funcMicGain, funcMicGain, (quint8)0xff)); + commands.append(COMMAND(num++, "Mod Level", commandKnob, funcDATAOffMod, funcDATAOffMod, (quint8)0xff)); + commands.append(COMMAND(num++, "Data Mod", commandKnob, funcDATAOffMod, funcDATAOffMod, (quint8)0xff)); + commands.append(COMMAND(num++, "Squelch", commandKnob, funcSquelch, funcSquelch, (quint8)0xff)); + commands.append(COMMAND(num++, "Monitor", commandKnob, funcMonitorGain, funcMonitorGain, (quint8)0xff)); + commands.append(COMMAND(num++, "Compressor", commandKnob, funcCompressorLevel, funcCompressorLevel, (quint8)0xff)); + commands.append(COMMAND(num++, "Vox Level", commandKnob, funcVoxGain, funcVoxGain, (quint8)0xff)); + commands.append(COMMAND(num++, "Anti-Vox", commandKnob, funcAntiVoxGain, funcAntiVoxGain, (quint8)0xff)); + commands.append(COMMAND(num++, "NB Level", commandKnob, funcNBLevel, funcNBLevel, (quint8)0xff)); + commands.append(COMMAND(num++, "NR Level", commandKnob, funcNRLevel, funcNRLevel, (quint8)0xff)); commands.append(COMMAND(num++, "Span/Step", commandKnob, cmdSeparator, (quint8)0x0)); - commands.append(COMMAND(num++, "IF Shift", commandKnob, cmdSetIFShift, cmdGetIFShift, (quint8)0xff)); - commands.append(COMMAND(num++, "In PBT", commandKnob, cmdSetTPBFInner, cmdGetTPBFInner, (quint8)0xff)); - commands.append(COMMAND(num++, "Out PBT", commandKnob, cmdSetTPBFOuter, cmdGetTPBFOuter, (quint8)0xff)); + commands.append(COMMAND(num++, "IF Shift", commandKnob, funcIFShift, funcIFShift, (quint8)0xff)); + commands.append(COMMAND(num++, "In PBT", commandKnob, funcPBTInner, funcPBTInner, (quint8)0xff)); + commands.append(COMMAND(num++, "Out PBT", commandKnob, funcPBTOuter, funcPBTOuter, (quint8)0xff)); commands.append(COMMAND(num++, "Span/Step", commandKnob, cmdSeparator, (quint8)0x0)); - commands.append(COMMAND(num++, "CW Pitch", commandKnob, cmdSetCwPitch, cmdGetCwPitch, (quint8)0xff)); - commands.append(COMMAND(num++, "CW Speed", commandKnob, cmdSetKeySpeed, cmdGetKeySpeed, (quint8)0xff)); + commands.append(COMMAND(num++, "CW Pitch", commandKnob, funcCwPitch, funcCwPitch, (quint8)0xff)); + commands.append(COMMAND(num++, "CW Speed", commandKnob, funcKeySpeed, funcKeySpeed, (quint8)0xff)); } @@ -1951,7 +1953,7 @@ void usbController::restoreController(USBDEVICE* dev, QString file) dev->speed = (quint8)settings->value("Speed", 2).toInt(); dev->timeout = (quint8)settings->value("Timeout", 30).toInt(); dev->color.setNamedColor(settings->value("Color", QColor(Qt::white).name(QColor::HexArgb)).toString()); - dev->lcd = (cmds)settings->value("LCD",0).toInt(); + dev->lcd = (funcs)settings->value("LCD",0).toInt(); qInfo(logUsbControl()) << "Restore of" << dev->product << "path" << dev->path << "from" << file; diff --git a/usbcontroller.h b/usbcontroller.h index 44465f0..64642bb 100644 --- a/usbcontroller.h +++ b/usbcontroller.h @@ -108,7 +108,7 @@ struct USBDEVICE { quint8 brightness=2; quint8 orientation=0; QColor color=Qt::darkGray; - cmds lcd=cmdNone; + funcs lcd=funcNone; hid_device* handle = NULL; QString product = ""; @@ -154,8 +154,8 @@ struct COMMAND { int index=0; QString text; usbCommandType cmdType = commandButton; - int command=0; - int getCommand=0; + int command=funcNone; + int getCommand=funcNone; unsigned char suffix=0x0; int value=0; availableBands band=bandGen; diff --git a/wfmain.cpp b/wfmain.cpp index 721123c..6fb722f 100644 --- a/wfmain.cpp +++ b/wfmain.cpp @@ -89,11 +89,14 @@ wfmain::wfmain(const QString settingsFile, const QString logFile, bool debugMode qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); haveRigCaps = false; queue = cachingQueue::getInstance(this); + connect(queue,SIGNAL(sendValue(cacheItem)),this,SLOT(receiveValue(cacheItem))); // We need to populate the list of rigs as early as possible so do it now QString systemRigLocation = QCoreApplication::applicationDirPath(); @@ -184,7 +187,6 @@ wfmain::wfmain(const QString settingsFile, const QString logFile, bool debugMode qDebug(logSystem()) << "Running rigConnections()"; rigConnections(); - cluster = new dxClusterClient(); clusterThread = new QThread(this); @@ -322,7 +324,7 @@ void wfmain::closeEvent(QCloseEvent *event) msgbox.setDefaultButton(QMessageBox::Yes); msgbox.setCheckBox(cb); - QObject::connect(cb, &QCheckBox::stateChanged, [this](int state){ + QObject::connect(cb, &QCheckBox::stateChanged, this, [this](int state){ if (static_cast(state) == Qt::CheckState::Checked) { prefs.confirmExit=false; } else { @@ -420,44 +422,47 @@ void wfmain::connectSettingsList() void wfmain::rigConnections() { + + connect(this, SIGNAL(setCIVAddr(unsigned char)), rig, SLOT(setCIVAddr(unsigned char))); connect(this, SIGNAL(sendPowerOn()), rig, SLOT(powerOn())); connect(this, SIGNAL(sendPowerOff()), rig, SLOT(powerOff())); - connect(rig, SIGNAL(haveFrequency(freqt)), this, SLOT(receiveFreq(freqt))); - connect(this, SIGNAL(getFrequency()), rig, SLOT(getFrequency())); - connect(this, SIGNAL(getFrequency(unsigned char)), rig, SLOT(getFrequency(unsigned char))); - connect(this, SIGNAL(getMode()), rig, SLOT(getMode())); - connect(this, SIGNAL(getDataMode()), rig, SLOT(getDataMode())); - connect(this, SIGNAL(setDataMode(bool, unsigned char)), rig, SLOT(setDataMode(bool, unsigned char))); - connect(this, SIGNAL(getBandStackReg(char,char)), rig, SLOT(getBandStackReg(char,char))); - connect(rig, SIGNAL(havePTTStatus(bool)), this, SLOT(receivePTTstatus(bool))); - connect(this, SIGNAL(setPTT(bool)), rig, SLOT(setPTT(bool))); - connect(this, SIGNAL(getPTT()), rig, SLOT(getPTT())); - connect(rig, SIGNAL(haveTuningStep(unsigned char)), this, SLOT(receiveTuningStep(unsigned char))); - connect(this, SIGNAL(setTuningStep(unsigned char)), rig, SLOT(setTuningStep(unsigned char))); - connect(this, SIGNAL(getTuningStep()), rig, SLOT(getTuningStep())); + //connect(rig, SIGNAL(haveFrequency(freqt)), this, SLOT(receiveFreq(freqt))); + //connect(this, SIGNAL(getFrequency()), rig, SLOT(getFrequency())); + //connect(this, SIGNAL(getFrequency(unsigned char)), rig, SLOT(getFrequency(unsigned char))); + //connect(this, SIGNAL(getMode()), rig, SLOT(getMode())); + //connect(this, SIGNAL(getDataMode()), rig, SLOT(getDataMode())); + //connect(this, SIGNAL(setDataMode(bool, unsigned char)), rig, SLOT(setDataMode(bool, unsigned char))); + //connect(this, SIGNAL(getBandStackReg(char,char)), rig, SLOT(getBandStackReg(char,char))); + //connect(rig, SIGNAL(havePTTStatus(bool)), this, SLOT(receivePTTstatus(bool))); + //connect(this, SIGNAL(setPTT(bool)), rig, SLOT(setPTT(bool))); + //connect(this, SIGNAL(getPTT()), rig, SLOT(getPTT())); + //connect(rig, SIGNAL(haveTuningStep(unsigned char)), this, SLOT(receiveTuningStep(unsigned char))); + //connect(this, SIGNAL(setTuningStep(unsigned char)), rig, SLOT(setTuningStep(unsigned char))); + //connect(this, SIGNAL(getTuningStep()), rig, SLOT(getTuningStep())); - connect(this, SIGNAL(getVox()), rig, SLOT(getVox())); - connect(this, SIGNAL(getMonitor()), rig, SLOT(getMonitor())); - connect(this, SIGNAL(getCompressor()), rig, SLOT(getCompressor())); - connect(this, SIGNAL(getNB()), rig, SLOT(getNB())); - connect(this, SIGNAL(getNR()), rig, SLOT(getNR())); + //connect(this, SIGNAL(getVox()), rig, SLOT(getVox())); + //connect(this, SIGNAL(getMonitor()), rig, SLOT(getMonitor())); + //connect(this, SIGNAL(getCompressor()), rig, SLOT(getCompressor())); + //connect(this, SIGNAL(getNB()), rig, SLOT(getNB())); + //connect(this, SIGNAL(getNR()), rig, SLOT(getNR())); - connect(this, SIGNAL(selectVFO(vfo_t)), rig, SLOT(selectVFO(vfo_t))); - connect(this, SIGNAL(sendVFOSwap()), rig, SLOT(exchangeVFOs())); - connect(this, SIGNAL(sendVFOEqualAB()), rig, SLOT(equalizeVFOsAB())); - connect(this, SIGNAL(sendVFOEqualMS()), rig, SLOT(equalizeVFOsMS())); + //connect(this, SIGNAL(selectVFO(vfo_t)), rig, SLOT(selectVFO(vfo_t))); + //connect(this, SIGNAL(sendVFOSwap()), rig, SLOT(exchangeVFOs())); + //connect(this, SIGNAL(sendVFOEqualAB()), rig, SLOT(equalizeVFOsAB())); + //connect(this, SIGNAL(sendVFOEqualMS()), rig, SLOT(equalizeVFOsMS())); + + //connect(this, SIGNAL(sendCW(QString)), rig, SLOT(sendCW(QString))); + //connect(this, SIGNAL(stopCW()), rig, SLOT(sendStopCW())); + //connect(this, SIGNAL(setKeySpeed(unsigned char)), rig, SLOT(setKeySpeed(unsigned char))); + //connect(this, SIGNAL(getKeySpeed()), rig, SLOT(getKeySpeed())); + //connect(this, SIGNAL(setCwPitch(unsigned char)), rig, SLOT(setCwPitch(unsigned char))); + //connect(this, SIGNAL(setDashRatio(unsigned char)), rig, SLOT(setDashRatio(unsigned char))); + //connect(this, SIGNAL(setCWBreakMode(unsigned char)), rig, SLOT(setBreakIn(unsigned char))); + //connect(this, SIGNAL(getCWBreakMode()), rig, SLOT(getBreakIn())); - connect(this, SIGNAL(sendCW(QString)), rig, SLOT(sendCW(QString))); - connect(this, SIGNAL(stopCW()), rig, SLOT(sendStopCW())); - connect(this, SIGNAL(setKeySpeed(unsigned char)), rig, SLOT(setKeySpeed(unsigned char))); - connect(this, SIGNAL(getKeySpeed()), rig, SLOT(getKeySpeed())); - connect(this, SIGNAL(setCwPitch(unsigned char)), rig, SLOT(setCwPitch(unsigned char))); - connect(this, SIGNAL(setDashRatio(unsigned char)), rig, SLOT(setDashRatio(unsigned char))); - connect(this, SIGNAL(setCWBreakMode(unsigned char)), rig, SLOT(setBreakIn(unsigned char))); - connect(this, SIGNAL(getCWBreakMode()), rig, SLOT(getBreakIn())); connect(this->rig, &rigCommander::haveKeySpeed, [=](const unsigned char& wpm) { cw->handleKeySpeed(wpm); }); connect(this->rig, &rigCommander::haveDashRatio, @@ -467,50 +472,49 @@ void wfmain::rigConnections() connect(this->rig, &rigCommander::haveCWBreakMode, [=](const unsigned char &bm) { cw->handleBreakInMode(bm);}); - connect(rig, SIGNAL(haveBandStackReg(freqt,char,char,bool)), this, SLOT(receiveBandStackReg(freqt,char,char,bool))); - connect(this, SIGNAL(setRitEnable(bool)), rig, SLOT(setRitEnable(bool))); - connect(this, SIGNAL(setRitValue(int)), rig, SLOT(setRitValue(int))); - connect(rig, SIGNAL(haveRitEnabled(bool)), this, SLOT(receiveRITStatus(bool))); - connect(rig, SIGNAL(haveRitFrequency(int)), this, SLOT(receiveRITValue(int))); - connect(this, SIGNAL(getRitEnabled()), rig, SLOT(getRitEnabled())); - connect(this, SIGNAL(getRitValue()), rig, SLOT(getRitValue())); + //connect(rig, SIGNAL(haveBandStackReg(freqt,char,char,bool)), this, SLOT(receiveBandStackReg(freqt,char,char,bool))); + //connect(this, SIGNAL(setRitEnable(bool)), rig, SLOT(setRitEnable(bool))); + //connect(this, SIGNAL(setRitValue(int)), rig, SLOT(setRitValue(int))); + //connect(rig, SIGNAL(haveRitEnabled(bool)), this, SLOT(receiveRITStatus(bool))); + //connect(rig, SIGNAL(haveRitFrequency(int)), this, SLOT(receiveRITValue(int))); + //connect(this, SIGNAL(getRitEnabled()), rig, SLOT(getRitEnabled())); + //connect(this, SIGNAL(getRitValue()), rig, SLOT(getRitValue())); connect(this, SIGNAL(getDebug()), rig, SLOT(getDebug())); - connect(this, SIGNAL(spectOutputDisable()), rig, SLOT(disableSpectOutput())); - connect(this, SIGNAL(spectOutputEnable()), rig, SLOT(enableSpectOutput())); - connect(this, SIGNAL(scopeDisplayDisable()), rig, SLOT(disableSpectrumDisplay())); - connect(this, SIGNAL(scopeDisplayEnable()), rig, SLOT(enableSpectrumDisplay())); - connect(rig, SIGNAL(haveMode(unsigned char, unsigned char)), this, SLOT(receiveMode(unsigned char, unsigned char))); - connect(rig, SIGNAL(haveDataMode(bool)), this, SLOT(receiveDataModeStatus(bool))); - connect(rig, SIGNAL(havePassband(quint16)), this, SLOT(receivePassband(quint16))); - connect(rig, SIGNAL(haveCwPitch(unsigned char)), this, SLOT(receiveCwPitch(unsigned char))); - connect(rig, SIGNAL(haveMonitorGain(unsigned char)), this, SLOT(receiveMonitorGain(unsigned char))); - connect(rig, SIGNAL(haveVoxGain(unsigned char)), this, SLOT(receiveVoxGain(unsigned char))); - connect(rig, SIGNAL(haveAntiVoxGain(unsigned char)), this, SLOT(receiveAntiVoxGain(unsigned char))); - connect(rig, SIGNAL(haveNBLevel(unsigned char)), this, SLOT(receiveNBLevel(unsigned char))); - connect(rig, SIGNAL(haveNRLevel(unsigned char)), this, SLOT(receiveNRLevel(unsigned char))); - connect(rig, SIGNAL(haveNB(bool)), this, SLOT(receiveNB(bool))); - connect(rig, SIGNAL(haveNR(bool)), this, SLOT(receiveNR(bool))); - connect(rig, SIGNAL(haveComp(bool)), this, SLOT(receiveComp(bool))); - connect(rig, SIGNAL(haveVox(bool)), this, SLOT(receiveVox(bool))); - connect(rig, SIGNAL(haveMonitor(bool)), this, SLOT(receiveMonitor(bool))); + //connect(this, SIGNAL(spectOutputDisable()), rig, SLOT(disableSpectOutput())); + //connect(this, SIGNAL(spectOutputEnable()), rig, SLOT(enableSpectOutput())); + //connect(this, SIGNAL(scopeDisplayDisable()), rig, SLOT(disableSpectrumDisplay())); + //connect(this, SIGNAL(scopeDisplayEnable()), rig, SLOT(enableSpectrumDisplay())); + //connect(rig, SIGNAL(haveDataMode(bool)), this, SLOT(receiveDataModeStatus(bool))); + //connect(rig, SIGNAL(havePassband(quint16)), this, SLOT(receivePassband(quint16))); + //connect(rig, SIGNAL(haveCwPitch(unsigned char)), this, SLOT(receiveCwPitch(unsigned char))); + //connect(rig, SIGNAL(haveMonitorGain(unsigned char)), this, SLOT(receiveMonitorGain(unsigned char))); + //connect(rig, SIGNAL(haveVoxGain(unsigned char)), this, SLOT(receiveVoxGain(unsigned char))); + //connect(rig, SIGNAL(haveAntiVoxGain(unsigned char)), this, SLOT(receiveAntiVoxGain(unsigned char))); + //connect(rig, SIGNAL(haveNBLevel(unsigned char)), this, SLOT(receiveNBLevel(unsigned char))); + //connect(rig, SIGNAL(haveNRLevel(unsigned char)), this, SLOT(receiveNRLevel(unsigned char))); + //connect(rig, SIGNAL(haveNB(bool)), this, SLOT(receiveNB(bool))); + //connect(rig, SIGNAL(haveNR(bool)), this, SLOT(receiveNR(bool))); + //connect(rig, SIGNAL(haveComp(bool)), this, SLOT(receiveComp(bool))); + //connect(rig, SIGNAL(haveVox(bool)), this, SLOT(receiveVox(bool))); + //connect(rig, SIGNAL(haveMonitor(bool)), this, SLOT(receiveMonitor(bool))); // Repeater, duplex, and split: connect(rpt, SIGNAL(getDuplexMode()), rig, SLOT(getDuplexMode())); connect(rpt, SIGNAL(setDuplexMode(duplexMode)), rig, SLOT(setDuplexMode(duplexMode))); connect(rig, SIGNAL(haveDuplexMode(duplexMode)), rpt, SLOT(receiveDuplexMode(duplexMode))); - connect(this, SIGNAL(getRptDuplexOffset()), rig, SLOT(getRptDuplexOffset())); + //connect(this, SIGNAL(getRptDuplexOffset()), rig, SLOT(getRptDuplexOffset())); connect(rig, SIGNAL(haveRptOffsetFrequency(freqt)), rpt, SLOT(handleRptOffsetFrequency(freqt))); // Memories - connect(this, SIGNAL(setMemoryMode()), rig, SLOT(setMemoryMode())); - connect(this, SIGNAL(setSatelliteMode(bool)), rig, SLOT(setSatelliteMode(bool))); - connect(this, SIGNAL(getMemory(quint32)), rig, SLOT(getMemory(quint32))); - connect(this, SIGNAL(getSatMemory(quint32)), rig, SLOT(getSatMemory(quint32))); - connect(this, SIGNAL(setMemory(memoryType)), rig, SLOT(setMemory(memoryType))); - connect(this, SIGNAL(clearMemory(quint32)), rig, SLOT(clearMemory(quint32))); - connect(this, SIGNAL(recallMemory(quint32)), rig, SLOT(recallMemory(quint32))); + //connect(this, SIGNAL(setMemoryMode()), rig, SLOT(setMemoryMode())); + //connect(this, SIGNAL(setSatelliteMode(bool)), rig, SLOT(setSatelliteMode(bool))); + //connect(this, SIGNAL(getMemory(quint32)), rig, SLOT(getMemory(quint32))); + //connect(this, SIGNAL(getSatMemory(quint32)), rig, SLOT(getSatMemory(quint32))); + //connect(this, SIGNAL(setMemory(memoryType)), rig, SLOT(setMemory(memoryType))); + //connect(this, SIGNAL(clearMemory(quint32)), rig, SLOT(clearMemory(quint32))); + //connect(this, SIGNAL(recallMemory(quint32)), rig, SLOT(recallMemory(quint32))); // These are the current tone frequency or DCS code selected: connect(rpt, SIGNAL(getTone()), rig, SLOT(getTone())); @@ -526,16 +530,16 @@ void wfmain::rigConnections() connect(this->rpt, &repeaterSetup::getRptAccessMode, this->rig, [=]() { if (rigCaps.commands.contains(funcToneSquelchType)) { - queue->add(priorityImmediate,funcToneSquelchType); + queue->add(priorityImmediate,funcToneSquelchType,false); } else { - queue->add(priorityImmediate,funcRepeaterTone); - queue->add(priorityImmediate,funcRepeaterTSQL); + queue->add(priorityImmediate,funcRepeaterTone,false); + queue->add(priorityImmediate,funcRepeaterTSQL,false); } }); connect(this->rpt, &repeaterSetup::setQuickSplit, this->rig, [=](const bool &qsEnabled) { - queue->add(priorityImmediate,queueItem(funcQuickSplit,QVariant::fromValue(qsEnabled))); + queue->add(priorityImmediate,queueItem(funcQuickSplit,QVariant::fromValue(qsEnabled),false)); }); connect(this->rpt, &repeaterSetup::setRptAccessMode, this->rig, @@ -557,8 +561,8 @@ void wfmain::rigConnections() this->splitModeEnabled = false; }); - connect(this, SIGNAL(getToneEnabled()), rig, SLOT(getToneEnabled())); - connect(this, SIGNAL(getTSQLEnabled()), rig, SLOT(getToneSqlEnabled())); + //connect(this, SIGNAL(getToneEnabled()), rig, SLOT(getToneEnabled())); + //connect(this, SIGNAL(getTSQLEnabled()), rig, SLOT(getToneSqlEnabled())); connect(this->rpt, &repeaterSetup::setTransmitFrequency, this->rig, [=](const freqt &transmitFreq) { queue->add(priorityImmediate,queueItem(funcFreqSet,QVariant::fromValue(transmitFreq),false));}); @@ -577,6 +581,8 @@ void wfmain::rigConnections() connect(this->rpt, &repeaterSetup::getRptDuplexOffset, this->rig, [=]() { queue->add(priorityImmediate,funcReadFreqOffset);}); + + /* connect(this, SIGNAL(setRptDuplexOffset(freqt)), rig, SLOT(setRptDuplexOffset(freqt))); connect(this, SIGNAL(getDuplexMode()), rig, SLOT(getDuplexMode())); @@ -593,7 +599,7 @@ void wfmain::rigConnections() connect(this, SIGNAL(setFrequency(unsigned char, freqt)), rig, SLOT(setFrequency(unsigned char, freqt))); connect(this, SIGNAL(setScopeEdge(char)), rig, SLOT(setScopeEdge(char))); connect(this, SIGNAL(setScopeSpan(char)), rig, SLOT(setScopeSpan(char))); - //connect(this, SIGNAL(getScopeMode()), rig, SLOT(getScopeMode())); + connect(this, SIGNAL(getScopeMode()), rig, SLOT(getScopeMode())); connect(this, SIGNAL(getScopeEdge()), rig, SLOT(getScopeEdge())); connect(this, SIGNAL(getScopeSpan()), rig, SLOT(getScopeSpan())); connect(rig, SIGNAL(haveScopeSpan(freqt,bool)), this, SLOT(receiveSpectrumSpan(freqt,bool))); @@ -617,8 +623,8 @@ void wfmain::rigConnections() connect(this, SIGNAL(getAfGain()), rig, SLOT(getAfGain())); connect(this, SIGNAL(getSql()), rig, SLOT(getSql())); connect(this, SIGNAL(getIfShift()), rig, SLOT(getIFShift())); - connect(this, SIGNAL(getTPBFInner()), rig, SLOT(getTPBFInner())); - connect(this, SIGNAL(getTPBFOuter()), rig, SLOT(getTPBFOuter())); + connect(this, SIGNAL(getPBTInner()), rig, SLOT(getPBTInner())); + connect(this, SIGNAL(getPBTOuter()), rig, SLOT(getPBTOuter())); connect(this, SIGNAL(getTxPower()), rig, SLOT(getTxLevel())); connect(this, SIGNAL(getMicGain()), rig, SLOT(getMicGain())); connect(this, SIGNAL(getSpectrumRefLevel()), rig, SLOT(getSpectrumRefLevel())); @@ -640,11 +646,10 @@ void wfmain::rigConnections() // Levels: Set: connect(this, SIGNAL(setRfGain(unsigned char)), rig, SLOT(setRfGain(unsigned char))); - connect(this, SIGNAL(setAfGain(unsigned char)), rig, SLOT(setAfGain(unsigned char))); connect(this, SIGNAL(setSql(unsigned char)), rig, SLOT(setSquelch(unsigned char))); connect(this, SIGNAL(setIFShift(unsigned char)), rig, SLOT(setIFShift(unsigned char))); - connect(this, SIGNAL(setTPBFInner(unsigned char)), rig, SLOT(setTPBFInner(unsigned char))); - connect(this, SIGNAL(setTPBFOuter(unsigned char)), rig, SLOT(setTPBFOuter(unsigned char))); + connect(this, SIGNAL(setPBTInner(unsigned char)), rig, SLOT(setPBTInner(unsigned char))); + connect(this, SIGNAL(setPBTOuter(unsigned char)), rig, SLOT(setPBTOuter(unsigned char))); connect(this, SIGNAL(setTxPower(unsigned char)), rig, SLOT(setTxPower(unsigned char))); connect(this, SIGNAL(setMicGain(unsigned char)), rig, SLOT(setMicGain(unsigned char))); connect(this, SIGNAL(setMonitorGain(unsigned char)), rig, SLOT(setMonitorGain(unsigned char))); @@ -660,10 +665,10 @@ void wfmain::rigConnections() connect(rig, SIGNAL(haveAfGain(unsigned char)), this, SLOT(receiveAfGain(unsigned char))); connect(rig, SIGNAL(haveSql(unsigned char)), this, SLOT(receiveSql(unsigned char))); connect(rig, SIGNAL(haveIFShift(unsigned char)), trxadj, SLOT(updateIFShift(unsigned char))); - connect(rig, SIGNAL(haveTPBFInner(unsigned char)), trxadj, SLOT(updateTPBFInner(unsigned char))); - connect(rig, SIGNAL(haveTPBFOuter(unsigned char)), trxadj, SLOT(updateTPBFOuter(unsigned char))); - connect(rig, SIGNAL(haveTPBFInner(unsigned char)), this, SLOT(receiveTPBFInner(unsigned char))); - connect(rig, SIGNAL(haveTPBFOuter(unsigned char)), this, SLOT(receiveTPBFOuter(unsigned char))); + connect(rig, SIGNAL(havePBTInner(unsigned char)), trxadj, SLOT(updatePBTInner(unsigned char))); + connect(rig, SIGNAL(havePBTOuter(unsigned char)), trxadj, SLOT(updatePBTOuter(unsigned char))); + connect(rig, SIGNAL(havePBTInner(unsigned char)), this, SLOT(receivePBTInner(unsigned char))); + connect(rig, SIGNAL(havePBTOuter(unsigned char)), this, SLOT(receivePBTOuter(unsigned char))); connect(rig, SIGNAL(haveTxPower(unsigned char)), this, SLOT(receiveTxPower(unsigned char))); connect(rig, SIGNAL(haveMicGain(unsigned char)), this, SLOT(receiveMicGain(unsigned char))); connect(rig, SIGNAL(haveSpectrumRefLevel(int)), this, SLOT(receiveSpectrumRefLevel(int))); @@ -710,7 +715,8 @@ void wfmain::rigConnections() connect(this, SIGNAL(setTime(timekind)), rig, SLOT(setTime(timekind))); connect(this, SIGNAL(setDate(datekind)), rig, SLOT(setDate(datekind))); connect(this, SIGNAL(setUTCOffset(timekind)), rig, SLOT(setUTCOffset(timekind))); - + */ + connect(this, SIGNAL(setAfGain(unsigned char)), rig, SLOT(setAfGain(unsigned char))); } //void wfmain::removeRigConnections() @@ -875,7 +881,7 @@ void wfmain::receiveCommReady() //emit getRigCIV(); //queue->add(priorityImmediate,funcTransceiverId,false); - queue->add(priorityImmediate,funcTransceiverId,true); + queue->addUnique(priorityHighest,funcTransceiverId,true); //issueDelayedCommand(cmdGetRigCIV); //delayedCommand->start(); } else { @@ -892,7 +898,7 @@ void wfmain::receiveCommReady() emit setCIVAddr(prefs.radioCIVAddr); //emit getRigCIV(); //queue->add(priorityImmediate,funcTransceiverId,false); - queue->add(priorityImmediate,funcTransceiverId,true); + queue->addUnique(priorityHighest,funcTransceiverId,true); //emit getRigID(); //issueDelayedCommand(cmdGetRigID); //delayedCommand->start(); @@ -907,18 +913,11 @@ void wfmain::receiveFoundRigID(rigCapabilities rigCaps) //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."; - //if(rig->usingLAN()) - //{ - // usingLAN = true; - //} else { - // usingLAN = false; - // } - receiveRigID(rigCaps); + initPeriodicCommands(); getInitialRigState(); - initPeriodicCommands(); return; } @@ -1161,6 +1160,9 @@ void wfmain::setupMainUI() ui->scopeRefLevelSlider->setTickInterval(50); ui->scopeRefLevelSlider->setSingleStep(20); + ui->monitorSlider->setTickInterval(100); + ui->monitorSlider->setSingleStep(10); + ui->freqMhzLineEdit->setValidator( new QDoubleValidator(0, 100, 6, this)); ui->controlPortTxt->setValidator(new QIntValidator(this)); @@ -1240,15 +1242,15 @@ void wfmain::setupMainUI() queue->add(priorityImmediate,queueItem(funcIFShift,QVariant::fromValue(newValue))); }); - connect(this->trxadj, &transceiverAdjustments::setTPBFInner, this, [=](const unsigned char &newValue) { - queue->add(priorityImmediate,queueItem(funcPBTOuter,QVariant::fromValue(newValue))); + connect(this->trxadj, &transceiverAdjustments::setPBTInner, this, [=](const unsigned char &newValue) { + queue->add(priorityImmediate,queueItem(funcPBTOuter,QVariant::fromValue(newValue))); }); - connect(this->trxadj, &transceiverAdjustments::setTPBFOuter, this, [=](const unsigned char &newValue) { - queue->add(priorityImmediate,queueItem(funcPBTOuter,QVariant::fromValue(newValue))); + connect(this->trxadj, &transceiverAdjustments::setPBTOuter, this, [=](const unsigned char &newValue) { + queue->add(priorityImmediate,queueItem(funcPBTOuter,QVariant::fromValue(newValue))); }); connect(this->trxadj, &transceiverAdjustments::setPassband, this, [=](const quint16 &passbandHz) { - queue->add(priorityImmediate,queueItem(funcPBTInner,QVariant::fromValue(passbandHz))); + queue->add(priorityImmediate,queueItem(funcPBTInner,QVariant::fromValue(passbandHz))); }); connect(this->cw, &cwSender::sendCW, this, [=](const QString &cwMessage) { @@ -1825,13 +1827,13 @@ void wfmain::pttToggle(bool status) showStatusBarText("PTT is disabled, not sending command. Change under Settings tab."); return; } + queue->add(priorityImmediate,queueItem(funcTransceiverStatus,QVariant::fromValue(status),false)); - emit setPTT(status); // Start 3 minute timer if (status) pttTimer->start(); - issueDelayedCommand(cmdGetPTT); + queue->add(priorityImmediate,funcTransceiverStatus); } void wfmain::doShuttle(bool up, unsigned char level) @@ -1858,102 +1860,114 @@ void wfmain::buttonControl(const COMMAND* cmd) { qDebug(logUsbControl()) << QString("executing command: %0 (%1) suffix:%2 value:%3" ).arg(cmd->text).arg(cmd->command).arg(cmd->suffix).arg(cmd->value); switch (cmd->command) { - case cmdGetBandStackReg: - issueCmd((cmds)cmd->command, cmd->band); - break; - case cmdSetBandDown: - for (size_t i = 0; i < rigCaps.bands.size(); i++) { - if (rigCaps.bands[i].band == lastRequestedBand) - { - if (i > 0) { - issueCmd(cmdGetBandStackReg, rigCaps.bands[i - 1].band); + case funcBandStackReg: + if (cmd->value == 100) { + for (size_t i = 0; i < rigCaps.bands.size(); i++) { + if (rigCaps.bands[i].band == lastRequestedBand) + { + if (i > 0) { + //issueCmd(cmdGetBandStackReg, rigCaps.bands[i - 1].band); + } + else { + //issueCmd(cmdGetBandStackReg, rigCaps.bands[rigCaps.bands.size() - 1].band); + } } - else { - issueCmd(cmdGetBandStackReg, rigCaps.bands[rigCaps.bands.size() - 1].band); + } + } else if (cmd->value == -100) { + for (size_t i = 0; i < rigCaps.bands.size(); i++) { + if (rigCaps.bands[i].band == lastRequestedBand) + { + if (i + 1 < rigCaps.bands.size()) { + //issueCmd(cmdGetBandStackReg, rigCaps.bands[i + 1].band); + } + else { + //issueCmd(cmdGetBandStackReg, rigCaps.bands[0].band); + } + } + } + } else { + foreach (auto band, rigCaps.bands) + { + if (band.band == cmd->value) + { + //issueCmd((cmds)cmd->command, cmd->band); } } } break; - case cmdSetBandUp: - for (size_t i = 0; i < rigCaps.bands.size(); i++) { - if (rigCaps.bands[i].band == lastRequestedBand) - { - if (i + 1 < rigCaps.bands.size()) { - issueCmd(cmdGetBandStackReg, rigCaps.bands[i + 1].band); - } - else { - issueCmd(cmdGetBandStackReg, rigCaps.bands[0].band); + case funcModeSet: + if (cmd->value == 100) { + for (size_t i = 0; i < rigCaps.modes.size(); i++) { + if (rigCaps.modes[i].mk == currentModeInfo.mk) + { + if (i + 1 < rigCaps.modes.size()) { + changeMode(rigCaps.modes[i + 1].mk); + } + else { + changeMode(rigCaps.modes[0].mk); + } } } - } - break; - case cmdSetMode: - changeMode(cmd->mode); - break; - case cmdSetModeUp: - for (size_t i = 0; i < rigCaps.modes.size(); i++) { - if (rigCaps.modes[i].mk == currentModeInfo.mk) - { - if (i + 1 < rigCaps.modes.size()) { - changeMode(rigCaps.modes[i + 1].mk); - } - else { - changeMode(rigCaps.modes[0].mk); + } else if (cmd->value == -100) { + for (size_t i = 0; i < rigCaps.modes.size(); i++) { + if (rigCaps.modes[i].mk == currentModeInfo.mk) + { + if (i>0) { + changeMode(rigCaps.modes[i - 1].mk); + } + else { + changeMode(rigCaps.modes[rigCaps.modes.size()-1].mk); + } } } + } else { + changeMode(cmd->mode); } break; - case cmdSetModeDown: - for (size_t i = 0; i < rigCaps.modes.size(); i++) { - if (rigCaps.modes[i].mk == currentModeInfo.mk) + case funcTuningStep: + if (cmd->value == 100) { + if (ui->tuningStepCombo->currentIndex() < ui->tuningStepCombo->count()-1) { - if (i>0) { - changeMode(rigCaps.modes[i - 1].mk); - } - else { - changeMode(rigCaps.modes[rigCaps.modes.size()-1].mk); - } + ui->tuningStepCombo->setCurrentIndex(ui->tuningStepCombo->currentIndex() + 1); } + else + { + ui->tuningStepCombo->setCurrentIndex(0); + } + } else if (cmd->value == -100) { + if (ui->tuningStepCombo->currentIndex() > 0) + { + ui->tuningStepCombo->setCurrentIndex(ui->tuningStepCombo->currentIndex() - 1); + } + else + { + ui->tuningStepCombo->setCurrentIndex(ui->tuningStepCombo->count() - 1); + } + } else { + //Potentially add option to select specific step size? } break; - case cmdSetStepUp: - if (ui->tuningStepCombo->currentIndex() < ui->tuningStepCombo->count()-1) - { - ui->tuningStepCombo->setCurrentIndex(ui->tuningStepCombo->currentIndex() + 1); - } - else - { - ui->tuningStepCombo->setCurrentIndex(0); - } - break; - case cmdSetStepDown: - if (ui->tuningStepCombo->currentIndex() > 0) - { - ui->tuningStepCombo->setCurrentIndex(ui->tuningStepCombo->currentIndex() - 1); - } - else - { - ui->tuningStepCombo->setCurrentIndex(ui->tuningStepCombo->count() - 1); - } - break; - case cmdSetSpanUp: - if (ui->scopeBWCombo->currentIndex() < ui->scopeBWCombo->count()-1) - { - ui->scopeBWCombo->setCurrentIndex(ui->scopeBWCombo->currentIndex() + 1); - } - else - { - ui->scopeBWCombo->setCurrentIndex(0); - } - break; - case cmdSetSpanDown: - if (ui->scopeBWCombo->currentIndex() > 0) - { - ui->scopeBWCombo->setCurrentIndex(ui->scopeBWCombo->currentIndex() - 1); - } - else - { - ui->scopeBWCombo->setCurrentIndex(ui->scopeBWCombo->count() - 1); + case funcScopeCenterSpan: + if (cmd->value == 100) { + if (ui->scopeBWCombo->currentIndex() < ui->scopeBWCombo->count()-1) + { + ui->scopeBWCombo->setCurrentIndex(ui->scopeBWCombo->currentIndex() + 1); + } + else + { + ui->scopeBWCombo->setCurrentIndex(0); + } + } else if (cmd->value == -100) { + if (ui->scopeBWCombo->currentIndex() > 0) + { + ui->scopeBWCombo->setCurrentIndex(ui->scopeBWCombo->currentIndex() - 1); + } + else + { + ui->scopeBWCombo->setCurrentIndex(ui->scopeBWCombo->count() - 1); + } + } else { + //Potentially add option to select specific step size? } break; case cmdSetFreq: @@ -1967,8 +1981,11 @@ void wfmain::buttonControl(const COMMAND* cmd) } f.MHzDouble = f.Hz / (double)1E6; f.VFO=(selVFO_t)cmd->suffix; - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); - //issueCmdUniquePriority((cmds)cmd->command, f); + if (f.VFO == activeVFO) + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); + else + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcUnselectedFreq)?funcUnselectedFreq:funcNone),QVariant::fromValue(f),false)); + if (!cmd->suffix) { freq = f; ui->freqLabel->setText(QString("%1").arg(f.MHzDouble, 0, 'f')); @@ -1979,13 +1996,13 @@ void wfmain::buttonControl(const COMMAND* cmd) } default: qInfo(logUsbControl()) << "Command" << cmd->command << "Suffix" << cmd->suffix; - issueCmdUniquePriority((cmds)cmd->command, cmd->suffix); + queue->add(priorityImmediate,queueItem((funcs)cmd->command,QVariant::fromValue(cmd->suffix),false)); break; } // Make sure we get status quickly - if (cmd->getCommand != cmdNone) { - issueDelayedCommand((cmds)cmd->getCommand); + if (cmd->getCommand != funcNone) { + queue->add(priorityHigh,(funcs)cmd->getCommand); } } @@ -2008,9 +2025,7 @@ void wfmain::changeFrequency(int value) { f.Hz = roundFrequencyWithStep(freq.Hz, value, tsWfScrollHz); f.MHzDouble = f.Hz / (double)1E6; freq = f; - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); - - //issueCmdUniquePriority(cmdSetFreq, f); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); ui->freqLabel->setText(QString("%1").arg(f.MHzDouble, 0, 'f')); } @@ -2632,7 +2647,7 @@ void wfmain::loadSettings() tempPrefs.speed = (quint8)settings->value("Speed", 2).toInt(); tempPrefs.timeout = (quint8)settings->value("Timeout", 30).toInt(); tempPrefs.color.setNamedColor(settings->value("Color", QColor(Qt::white).name(QColor::HexArgb)).toString()); - tempPrefs.lcd = (cmds)settings->value("LCD",0).toInt(); + tempPrefs.lcd = (funcs)settings->value("LCD",0).toInt(); if (!tempPrefs.path.isEmpty()) { usbDevices.insert(tempPrefs.path,tempPrefs); @@ -3547,11 +3562,7 @@ void wfmain::shortcutMinus() freq.Hz = f.Hz; freq.MHzDouble = f.MHzDouble; setUIFreq(); - //issueCmd(cmdSetFreq, f); - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); - - //issueCmdUniquePriority(cmdSetFreq, f); - //issueDelayedCommandUnique(cmdGetFreq); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); } void wfmain::shortcutPlus() @@ -3564,10 +3575,7 @@ void wfmain::shortcutPlus() freq.Hz = f.Hz; freq.MHzDouble = f.MHzDouble; setUIFreq(); - //issueCmd(cmdSetFreq, f); - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); - //issueCmdUniquePriority(cmdSetFreq, f); - //issueDelayedCommandUnique(cmdGetFreq); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); } void wfmain::shortcutStepMinus() @@ -3579,10 +3587,8 @@ void wfmain::shortcutStepMinus() f.MHzDouble = f.Hz / (double)1E6; setUIFreq(); - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); - //queue->add(priorityImmediate,funcFreqGet); - //issueCmd(cmdSetFreq, f); - //issueDelayedCommandUnique(cmdGetFreq); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); + } void wfmain::shortcutStepPlus() @@ -3594,9 +3600,7 @@ void wfmain::shortcutStepPlus() f.MHzDouble = f.Hz / (double)1E6; setUIFreq(); - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); - //issueCmd(cmdSetFreq, f); - //issueDelayedCommandUnique(cmdGetFreq); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); } void wfmain::shortcutShiftMinus() @@ -3610,9 +3614,7 @@ void wfmain::shortcutShiftMinus() freq.MHzDouble = f.MHzDouble; setUIFreq(); //emit setFrequency(0,f); - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); - //issueCmd(cmdSetFreq, f); - //issueDelayedCommandUnique(cmdGetFreq); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); } void wfmain::shortcutShiftPlus() @@ -3626,9 +3628,8 @@ void wfmain::shortcutShiftPlus() freq.MHzDouble = f.MHzDouble; setUIFreq(); //emit setFrequency(0,f); - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); - //issueCmd(cmdSetFreq, f); - //issueDelayedCommandUnique(cmdGetFreq); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); + } void wfmain::shortcutControlMinus() @@ -3641,9 +3642,7 @@ void wfmain::shortcutControlMinus() freq.Hz = f.Hz; freq.MHzDouble = f.MHzDouble; setUIFreq(); - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); - //issueCmd(cmdSetFreq, f); - //issueDelayedCommandUnique(cmdGetFreq); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); } void wfmain::shortcutControlPlus() @@ -3656,9 +3655,7 @@ void wfmain::shortcutControlPlus() freq.Hz = f.Hz; freq.MHzDouble = f.MHzDouble; setUIFreq(); - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); - //issueCmd(cmdSetFreq, f); - //issueDelayedCommandUnique(cmdGetFreq); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); } void wfmain::shortcutPageUp() @@ -3671,9 +3668,7 @@ void wfmain::shortcutPageUp() freq.Hz = f.Hz; freq.MHzDouble = f.MHzDouble; setUIFreq(); - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); - //issueCmd(cmdSetFreq, f); - //issueDelayedCommandUnique(cmdGetFreq); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); } void wfmain::shortcutPageDown() @@ -3686,9 +3681,7 @@ void wfmain::shortcutPageDown() freq.Hz = f.Hz; freq.MHzDouble = f.MHzDouble; setUIFreq(); - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); - //issueCmd(cmdSetFreq, f); - //issueDelayedCommandUnique(cmdGetFreq); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); } void wfmain::shortcutF() @@ -3721,20 +3714,21 @@ funcs wfmain::getInputTypeCommand(inputTypes input) switch(input) { + case inputMICACCA: + case inputMICACCB: + case inputMICACCAACCB: + case inputMICUSB: case inputMic: func = funcMicGain; break; + case inputACCAACCB: case inputACCA: - func = funcACC1ModLevel; + func = funcACCAModLevel; break; case inputACCB: - func = funcACC2ModLevel; - break; - - case inputACC: - func = funcACC1ModLevel; + func = funcACCBModLevel; break; case inputUSB: @@ -3744,7 +3738,9 @@ funcs wfmain::getInputTypeCommand(inputTypes input) case inputLAN: func = funcLANModLevel; break; - + case inputSPDIF: + func = funcSPDIFModLevel; + break; default: func = funcNone; break; @@ -3763,23 +3759,35 @@ void wfmain:: getInitialRigState() queue->del(funcTransceiverId); // This command is no longer required - queue->add(priorityImmediate,funcFreqGet); - queue->add(priorityImmediate,funcModeGet); + 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(funcUnselectedFreq)?funcUnselectedFreq:funcNone),false); + queue->add(priorityImmediate,(rigCaps.commands.contains(funcUnselectedMode)?funcUnselectedMode:funcNone),false); // From left to right in the UI: if (rigCaps.hasTransmit) { queue->add(priorityImmediate,funcDataModeWithFilter); - queue->add(priorityImmediate,funcDATAOffMod); - queue->add(priorityImmediate,funcDATA1Mod); - queue->add(priorityImmediate,funcRFPower); - queue->add(priorityImmediate,getInputTypeCommand(currentModSrc)); - queue->add(priorityImmediate,getInputTypeCommand(currentModDataSrc)); + 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(funcDATA2Mod)?funcDATA2Mod: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,getInputTypeCommand(currentModDataOffSrc.type),false); + queue->add(priorityImmediate,getInputTypeCommand(currentModData1Src.type),false); + if (rigCaps.commands.contains(funcDATA2Mod)) + queue->add(priorityImmediate,getInputTypeCommand(currentModData2Src.type),false); + if (rigCaps.commands.contains(funcDATA3Mod)) + queue->add(priorityImmediate,getInputTypeCommand(currentModData3Src.type),false); } - queue->add(priorityImmediate,funcRfGain); - queue->add(priorityImmediate,funcAfGain); - queue->add(priorityImmediate,funcSquelch); + queue->add(priorityImmediate,funcRfGain,false); + + if (!usingLAN) + queue->add(priorityImmediate,funcAfGain,false); + + queue->add(priorityImmediate,funcMonitor,false); + queue->add(priorityImmediate,funcMonitorGain,false); if(rigCaps.hasSpectrum) @@ -3799,11 +3807,11 @@ void wfmain:: getInitialRigState() queue->add(priorityImmediate,queueItem(funcScopeDataOutput,QVariant::fromValue(quint8(1)),false)); queue->add(priorityImmediate,queueItem(funcScopeOnOff,QVariant::fromValue(quint8(1)),false)); } - queue->add(priorityImmediate,funcScopeRef,false); - queue->add(priorityImmediate,funcScopeCenterFixed,false); - queue->add(priorityImmediate,funcScopeCenterSpan,false); - queue->add(priorityImmediate,funcDuplexStatus,false); - queue->add(priorityImmediate,funcFilterWidth,false); + queue->add(priorityHigh,funcFilterWidth,false); + queue->add(priorityHigh,funcScopeRef,false); + queue->add(priorityHigh,funcScopeCenterFixed,false); + queue->add(priorityHigh,funcScopeCenterSpan,false); + queue->add(priorityHigh,funcDuplexStatus,false); } if(rigCaps.commands.contains(funcTuningStep)) @@ -4017,339 +4025,6 @@ void wfmain::setDefaultColors(int presetNumber) ui->colorPresetCombo->setItemText(presetNumber, *(p->presetName)); } -void wfmain::doCmd(commandtype cmddata) -{ - qInfo(logSystem()) << __PRETTY_FUNCTION__ << "WARNING: deprecated function, cmd:" << (unsigned int)cmddata.cmd; -} - -void wfmain::doCmd(cmds cmd) -{ - qInfo(logSystem()) << __PRETTY_FUNCTION__ << "WARNING: deprecated function, cmd:" << (unsigned int)cmd; -} - - -void wfmain::sendRadioCommandLoop() -{ - // Called by the periodicPollingTimer, see setInitialTiming() - - if(!(loopTickCounter % 2)) - { - // if ther's a command waiting, run it. - if(!delayedCmdQue.empty()) - { - commandtype cmddata = delayedCmdQue.front(); - delayedCmdQue.pop_front(); - doCmd(cmddata); - } else if(!(loopTickCounter % 10)) - { - // pick from useful queries to make now and then - if(haveRigCaps && !slowPollCmdQueue.empty()) - { - - int nCmds = (int)slowPollCmdQueue.size(); - cmds sCmd = slowPollCmdQueue[(slowCmdNum++)%nCmds]; - doCmd(sCmd); - } - } else if ((haveRigCaps && !rapidPollCmdQueue.empty()) && rapidPollCmdQueueEnabled) - { - int nrCmds = (int)rapidPollCmdQueue.size(); - cmds rCmd = rapidPollCmdQueue[(rapidCmdNum++)%nrCmds]; - doCmd(rCmd); - } - } else { - // odd-number ticks: - // s-meter or other metering - if(haveRigCaps && !periodicCmdQueue.empty()) - { - int nCmds = (int)periodicCmdQueue.size(); - cmds pcmd = periodicCmdQueue[ (pCmdNum++)%nCmds ]; - doCmd(pcmd); - } - } - loopTickCounter++; -} - -void wfmain::issueDelayedCommand(cmds cmd) -{ - // Append to end of command queue - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = NULL; - delayedCmdQue.push_back(cmddata); -} - -void wfmain::issueDelayedCommandPriority(cmds cmd) -{ - // Places the new command at the top of the queue - // Use only when needed. - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = NULL; - delayedCmdQue.push_front(cmddata); -} - -void wfmain::issueDelayedCommandUnique(cmds cmd) -{ - // Use this function to insert commands where - // multiple (redundant) commands don't make sense. - - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = NULL; - - delayedCmdQue.push_front(cmddata); - delayedCmdQue.erase(std::remove_if(delayedCmdQue.begin() + 1, delayedCmdQue.end(), [cmd](const commandtype& c) { return (c.cmd == cmd); }), delayedCmdQue.end()); - - // The following is both expensive and not that great, - // since it does not check if the arguments are the same. -/* bool found = false; - - - - for(unsigned int i=0; i < delayedCmdQue.size(); i++) - { - if(delayedCmdQue.at(i).cmd == cmd) - { - found = true; - break; - } - } - - if(!found) - { - delayedCmdQue.push_front(cmddata); - } - -// if( std::find(delayedCmdQue.begin(), delayedCmdQue.end(), cmddata ) == delayedCmdQue.end()) -// { -// delayedCmdQue.push_front(cmddata); -// } -*/ - -// delayedCmdQue.push_front(cmddata); -} - -void wfmain::issueCmd(cmds cmd, mode_info m) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new mode_info(m)); - delayedCmdQue.push_back(cmddata); -} - -void wfmain::issueCmd(cmds cmd, freqt f) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new freqt(f)); - delayedCmdQue.push_back(cmddata); -} - -void wfmain::issueCmd(cmds cmd, vfo_t v) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new vfo_t(v)); - delayedCmdQue.push_back(cmddata); -} - -void wfmain::issueCmd(cmds cmd, rptrTone_t v) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new rptrTone_t(v)); - delayedCmdQue.push_back(cmddata); -} - -void wfmain::issueCmd(cmds cmd, rptrAccessData_t rd) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new rptrAccessData_t(rd)); - delayedCmdQue.push_back(cmddata); -} - -void wfmain::issueCmd(cmds cmd, timekind t) -{ - qDebug(logSystem()) << "Issuing timekind command with data: " << t.hours << " hours, " << t.minutes << " minutes, " << t.isMinus << " isMinus"; - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new timekind(t)); - delayedCmdQue.push_front(cmddata); -} - -void wfmain::issueCmd(cmds cmd, datekind d) -{ - qDebug(logSystem()) << "Issuing datekind command with data: " << d.day << " day, " << d.month << " month, " << d.year << " year."; - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new datekind(d)); - delayedCmdQue.push_front(cmddata); -} - -void wfmain::issueCmd(cmds cmd, int i) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new int(i)); - delayedCmdQue.push_back(cmddata); -} - -void wfmain::issueCmd(cmds cmd, char c) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new char(c)); - delayedCmdQue.push_back(cmddata); -} - -void wfmain::issueCmd(cmds cmd, bool b) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new bool(b)); - delayedCmdQue.push_back(cmddata); -} - -void wfmain::issueCmd(cmds cmd, unsigned char c) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new unsigned char(c)); - delayedCmdQue.push_back(cmddata); -} - -void wfmain::issueCmd(cmds cmd, quint16 c) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new quint16(c)); - delayedCmdQue.push_back(cmddata); -} - -void wfmain::issueCmd(cmds cmd, qint16 c) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new qint16(c)); - delayedCmdQue.push_back(cmddata); -} - -void wfmain::issueCmd(cmds cmd, quint32 c) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new quint32(c)); - delayedCmdQue.push_back(cmddata); -} - -void wfmain::issueCmd(cmds cmd, QString s) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new QString(s)); - delayedCmdQue.push_back(cmddata); -} - -void wfmain::issueCmd(cmds cmd, memoryType m) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new memoryType(m)); - delayedCmdQue.push_back(cmddata); -} - -void wfmain::issueCmdUniquePriority(cmds cmd, bool b) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new bool(b)); - delayedCmdQue.push_front(cmddata); - delayedCmdQue.erase(std::remove_if(delayedCmdQue.begin() + 1, delayedCmdQue.end(), [cmd](const commandtype& c) { return (c.cmd == cmd); }), delayedCmdQue.end()); - - //removeSimilarCommand(cmd); -} - -void wfmain::issueCmdUniquePriority(cmds cmd, unsigned char c) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new unsigned char(c)); - delayedCmdQue.push_front(cmddata); - delayedCmdQue.erase(std::remove_if(delayedCmdQue.begin() + 1, delayedCmdQue.end(), [cmd](const commandtype& c) { return (c.cmd == cmd); }), delayedCmdQue.end()); - - //removeSimilarCommand(cmd); -} - -void wfmain::issueCmdUniquePriority(cmds cmd, char c) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new char(c)); - delayedCmdQue.push_front(cmddata); - delayedCmdQue.erase(std::remove_if(delayedCmdQue.begin() + 1, delayedCmdQue.end(), [cmd](const commandtype& c) { return (c.cmd == cmd); }), delayedCmdQue.end()); - //removeSimilarCommand(cmd); -} - -void wfmain::issueCmdUniquePriority(cmds cmd, freqt f) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new freqt(f)); - delayedCmdQue.push_front(cmddata); - delayedCmdQue.erase(std::remove_if(delayedCmdQue.begin() + 1, delayedCmdQue.end(), [cmd](const commandtype& c) { return (c.cmd == cmd); }), delayedCmdQue.end()); - //removeSimilarCommand(cmd); -} - -void wfmain::issueCmdUniquePriority(cmds cmd, quint16 c) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new quint16(c)); - delayedCmdQue.push_front(cmddata); - delayedCmdQue.erase(std::remove_if(delayedCmdQue.begin() + 1, delayedCmdQue.end(), [cmd](const commandtype& c) { return (c.cmd == cmd); }), delayedCmdQue.end()); - //removeSimilarCommand(cmd); -} - -void wfmain::issueCmdUniquePriority(cmds cmd, qint16 c) -{ - commandtype cmddata; - cmddata.cmd = cmd; - cmddata.data = std::shared_ptr(new qint16(c)); - delayedCmdQue.push_front(cmddata); - delayedCmdQue.erase(std::remove_if(delayedCmdQue.begin() + 1, delayedCmdQue.end(), [cmd](const commandtype& c) { return (c.cmd == cmd); }), delayedCmdQue.end()); - //removeSimilarCommand(cmd); -} - -void wfmain::removeSimilarCommand(cmds cmd) -{ - // pop anything out that is of the same kind of command: - // pop anything out that is of the same kind of command: - // Start at 1 since we put one in at zero that we want to keep. - - for (auto it = delayedCmdQue.begin()+1; it != delayedCmdQue.end();) - { - if (it->cmd == cmd) - { - it = delayedCmdQue.erase(it); - } - else { - it++; - } - } - /* - for(unsigned int i=1; i < delayedCmdQue.size(); i++) - { - if (delayedCmdQue.at(i).cmd == cmd) - { - //delayedCmdQue[i].cmd = cmdNone; - delayedCmdQue.erase(delayedCmdQue.begin()+i); - // i -= 1; - } - } - */ -} - void wfmain::receiveRigID(rigCapabilities rigCaps) { // Note: We intentionally request rigID several times @@ -4468,10 +4143,30 @@ void wfmain::receiveRigID(rigCapabilities rigCaps) ui->modInputData3Combo->addItem("None", inputNone); } - ui->modInputData2ComboText->setVisible(false); - ui->modInputData3ComboText->setVisible(false); - ui->modInputData2Combo->setVisible(false); - ui->modInputData3Combo->setVisible(false); + ui->datamodeCombo->clear(); + ui->datamodeCombo->addItem("Off",0); + + if (rigCaps.commands.contains(funcDATA2Mod)) + { + ui->modInputData2ComboText->setVisible(true); + ui->modInputData2Combo->setVisible(true); + ui->datamodeCombo->addItem("Data1",1); + ui->datamodeCombo->addItem("Data2",2); + } else { + ui->datamodeCombo->addItem("On",1); + ui->modInputData2ComboText->setVisible(false); + ui->modInputData2Combo->setVisible(false); + } + + if (rigCaps.commands.contains(funcDATA3Mod)) + { + ui->modInputData3ComboText->setVisible(true); + ui->modInputData3Combo->setVisible(true); + ui->datamodeCombo->addItem("Data3",3); + } else { + ui->modInputData3ComboText->setVisible(false); + ui->modInputData3Combo->setVisible(false); + } ui->attSelCombo->clear(); if(rigCaps.commands.contains(funcAttenuator)) @@ -4576,33 +4271,33 @@ void wfmain::receiveRigID(rigCapabilities rigCaps) void wfmain::initPeriodicCommands() { - // This function places periodic polling commands into a queue. - // The commands are run using a timer, - // and the timer is started by the delayed command cmdStartPeriodicTimer. + // This function places periodic polling commands into the queue. + // Can be run multiple times as it will remove all existing entries. - if (rigCaps.commands.contains(funcMainSubFreq)) - { - queue->add(priorityMedium,queueItem(funcMainSubFreq,QVariant::fromValue(quint8(0)),true)); + queue->clear(); + queue->add(priorityMedium,(rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqGet),true); + queue->add(priorityMedium,(rigCaps.commands.contains(funcSelectedMode)?funcSelectedMode:funcModeGet),true); + queue->add(priorityMedium,(rigCaps.commands.contains(funcSelectedMode)?funcNone:funcDataModeWithFilter),true); + queue->add(priorityMedium,(rigCaps.commands.contains(funcUnselectedFreq)?funcUnselectedFreq:funcNone),true); + queue->add(priorityMedium,(rigCaps.commands.contains(funcUnselectedMode)?funcUnselectedMode:funcNone),true); - if (rigCaps.commands.contains(funcVFOEqualAB) || rigCaps.commands.contains(funcVFOEqualMS)) - { - queue->add(priorityMedium,queueItem(funcMainSubFreq,QVariant::fromValue(quint8(1)),true)); - } - } - else - { - queue->add(priorityMedium,funcFreqGet,true); - } - - - queue->add(priorityMediumHigh,funcModeGet,true); - - if(rigCaps.hasTransmit) + if(rigCaps.hasTransmit) { queue->add(priorityHigh,funcTransceiverStatus,true); + queue->add(priorityMediumHigh,(rigCaps.commands.contains(funcDATAOffMod)?funcDATAOffMod:funcNone),true); + queue->add(priorityMediumHigh,(rigCaps.commands.contains(funcDATA1Mod)?funcDATA1Mod:funcNone),true); + queue->add(priorityMediumHigh,(rigCaps.commands.contains(funcDATA2Mod)?funcDATA2Mod:funcNone),true); + } + if (rigCaps.commands.contains(funcRFPower)) + queue->add(priorityMedium,funcRFPower,true); + if (rigCaps.commands.contains(funcRfGain)) + queue->add(priorityMedium,funcRfGain,true); - queue->add(priorityHigh,funcRFPower,true); - queue->add(priorityHigh,funcRfGain,true); + if (rigCaps.commands.contains(funcMonitorGain)) + queue->add(priorityMediumLow,funcMonitorGain,true); + + if (rigCaps.commands.contains(funcMonitor)) + queue->add(priorityMediumLow,funcMonitor,true); if(rigCaps.commands.contains(funcAttenuator)) queue->add(priorityMediumLow,funcAttenuator,true); @@ -4610,8 +4305,8 @@ void wfmain::initPeriodicCommands() if(rigCaps.commands.contains(funcPreamp)) queue->add(priorityMediumLow,funcPreamp,true); - if (rigCaps.commands.contains(funcRXAntenna)) - queue->add(priorityMediumLow,funcRXAntenna,true); + if (rigCaps.commands.contains(funcAntenna)) + queue->add(priorityMediumLow,funcAntenna,true); if (rigCaps.commands.contains(funcDuplexStatus)) queue->add(priorityMediumLow,funcDuplexStatus,true); @@ -4619,115 +4314,9 @@ void wfmain::initPeriodicCommands() if(rigCaps.commands.contains(funcToneSquelchType)) queue->add(priorityMediumLow,funcToneSquelchType,true); - rapidPollCmdQueueEnabled = false; - rapidPollCmdQueue.clear(); - //rapidPollCmdQueueEnabled = true; + if (rigCaps.commands.contains(funcSMeter)) + queue->add(priorityHighest,queueItem(funcSMeter,true)); - queue->add(priorityHighest,queueItem(funcSMeter,true)); - -} - -void wfmain::insertPeriodicRapidCmd(cmds cmd) -{ - rapidPollCmdQueue.push_back(cmd); -} - -void wfmain::insertPeriodicCommand(cmds cmd, unsigned char priority=100) -{ - // TODO: meaningful priority - // These commands get run at the fastest pace possible - // Typically just metering. - if(priority < 10) - { - periodicCmdQueue.push_front(cmd); - } else { - periodicCmdQueue.push_back(cmd); - } -} - -void wfmain::insertPeriodicRapidCmdUnique(cmds cmd) -{ - removePeriodicRapidCmd(cmd); - rapidPollCmdQueue.push_back(cmd); -} - -void wfmain::insertPeriodicCommandUnique(cmds cmd) -{ - // Use this function to insert a non-duplicate command - // into the fast periodic polling queue, typically - // meter commands where high refresh rates are desirable. - - removePeriodicCommand(cmd); - periodicCmdQueue.push_front(cmd); -} - -void wfmain::removePeriodicRapidCmd(cmds cmd) -{ - - qDebug() << "Removing" << cmd << "From periodic queue, len" << slowPollCmdQueue.size(); - periodicCmdQueue.erase(std::remove_if(periodicCmdQueue.begin(), periodicCmdQueue.end(), [cmd](const cmds& c) { return (c == cmd); }), periodicCmdQueue.end()); - qDebug() << "Removed" << cmd << "From periodic queue, len" << slowPollCmdQueue.size(); - - /* - while(true) - { - auto it = std::find(this->rapidPollCmdQueue.begin(), this->rapidPollCmdQueue.end(), cmd); - if(it != rapidPollCmdQueue.end()) - { - rapidPollCmdQueue.erase(it); - } else { - break; - } - } - */ -} - -void wfmain::removePeriodicCommand(cmds cmd) -{ - - qDebug() << "Removing" << cmd << "From periodic queue, len" << slowPollCmdQueue.size(); - periodicCmdQueue.erase(std::remove_if(periodicCmdQueue.begin(), periodicCmdQueue.end(), [cmd](const cmds& c) { return (c == cmd); }), periodicCmdQueue.end()); - qDebug() << "Removed" << cmd << "From periodic queue, len" << slowPollCmdQueue.size(); - -/* while (true) - { - auto it = std::find(this->periodicCmdQueue.begin(), this->periodicCmdQueue.end(), cmd); - if(it != periodicCmdQueue.end()) - { - periodicCmdQueue.erase(it); - } else { - break; - } - } - */ -} - - -void wfmain::insertSlowPeriodicCommand(cmds cmd, unsigned char priority=100) -{ - // TODO: meaningful priority - // These commands are run every 20 "ticks" of the primary radio command loop - // Basically 20 times less often than the standard periodic command - qDebug() << "Inserting" << cmd << "To slow queue, priority" << priority << "len" << slowPollCmdQueue.size(); - - // It doesn't make sense to have the same command in the queue twice I think - removeSlowPeriodicCommand(cmd); - - if(priority < 10) - { - slowPollCmdQueue.push_front(cmd); - } else { - slowPollCmdQueue.push_back(cmd); - } - - qDebug() << "Inserted" << cmd << "To slow queue, priority" << priority << "len" << slowPollCmdQueue.size(); -} - -void wfmain::removeSlowPeriodicCommand(cmds cmd) -{ - qDebug() << "Removing" << cmd << "From slow queue, len" << slowPollCmdQueue.size(); - slowPollCmdQueue.erase(std::remove_if(slowPollCmdQueue.begin(), slowPollCmdQueue.end(), [cmd](const cmds& c) { return (c == cmd); }), slowPollCmdQueue.end()); - qDebug() << "Removed" << cmd << "From slow queue, len" << slowPollCmdQueue.size(); } void wfmain::receiveFreq(freqt freqStruct) @@ -4790,6 +4379,7 @@ void wfmain::changeTxBtn() } + void wfmain::receiveSpectrumData(QByteArray spectrum, double startFreq, double endFreq) { if (ui->scopeEnableWFBtn->checkState()== Qt::PartiallyChecked) @@ -4935,7 +4525,7 @@ void wfmain::receiveSpectrumData(QByteArray spectrum, double startFreq, double e pbtDefault = 0.0; } - if ((TPBFInner - pbtDefault || TPBFOuter - pbtDefault) && passbandAction != passbandResizing && currentModeInfo.mk != modeFM) + if ((PBTInner - pbtDefault || PBTOuter - pbtDefault) && passbandAction != passbandResizing && currentModeInfo.mk != modeFM) { pbtIndicator->setVisible(true); } @@ -4945,23 +4535,23 @@ void wfmain::receiveSpectrumData(QByteArray spectrum, double startFreq, double e } /* - pbtIndicator displays the intersection between TPBFInner and TPBFOuter + pbtIndicator displays the intersection between PBTInner and PBTOuter */ if (currentModeInfo.mk == modeLSB || currentModeInfo.mk == modeCW || currentModeInfo.mk == modeRTTY) { - pbtIndicator->topLeft->setCoords(qMax(pbStart - (TPBFInner / 2) + (pbtDefault / 2), pbStart - (TPBFOuter / 2) + (pbtDefault / 2)), 0); + pbtIndicator->topLeft->setCoords(qMax(pbStart - (PBTInner / 2) + (pbtDefault / 2), pbStart - (PBTOuter / 2) + (pbtDefault / 2)), 0); - pbtIndicator->bottomRight->setCoords(qMin(pbStart - (TPBFInner / 2) + (pbtDefault / 2) + passbandWidth, - pbStart - (TPBFOuter / 2) + (pbtDefault / 2) + passbandWidth), rigCaps.spectAmpMax); + pbtIndicator->bottomRight->setCoords(qMin(pbStart - (PBTInner / 2) + (pbtDefault / 2) + passbandWidth, + pbStart - (PBTOuter / 2) + (pbtDefault / 2) + passbandWidth), rigCaps.spectAmpMax); } else { - pbtIndicator->topLeft->setCoords(qMax(pbStart + (TPBFInner / 2) - (pbtDefault / 2), pbStart + (TPBFOuter / 2) - (pbtDefault / 2)), 0); + pbtIndicator->topLeft->setCoords(qMax(pbStart + (PBTInner / 2) - (pbtDefault / 2), pbStart + (PBTOuter / 2) - (pbtDefault / 2)), 0); - pbtIndicator->bottomRight->setCoords(qMin(pbStart + (TPBFInner / 2) - (pbtDefault / 2) + passbandWidth, - pbStart + (TPBFOuter / 2) - (pbtDefault / 2) + passbandWidth), rigCaps.spectAmpMax); + pbtIndicator->bottomRight->setCoords(qMin(pbStart + (PBTInner / 2) - (pbtDefault / 2) + passbandWidth, + pbStart + (PBTOuter / 2) - (pbtDefault / 2) + passbandWidth), rigCaps.spectAmpMax); } - //qDebug() << "Default" << pbtDefault << "Inner" << TPBFInner << "Outer" << TPBFOuter << "Pass" << passbandWidth << "Center" << passbandCenterFrequency << "CW" << cwPitch; + //qDebug() << "Default" << pbtDefault << "Inner" << PBTInner << "Outer" << PBTOuter << "Pass" << passbandWidth << "Center" << passbandCenterFrequency << "CW" << cwPitch; } if (underlayMode == underlayPeakHold) @@ -5021,12 +4611,12 @@ void wfmain::receiveSpectrumData(QByteArray spectrum, double startFreq, double e auto i = usbDevices.begin(); while (i != usbDevices.end()) { - if (i.value().connected && i.value().type.model == usbDeviceType::StreamDeckPlus && i.value().lcd == cmdLCDWaterfall ) + if (i.value().connected && i.value().type.model == usbDeviceType::StreamDeckPlus && i.value().lcd == funcLCDWaterfall ) { lcdImage = wf->toPixmap().toImage(); emit sendControllerRequest(&i.value(), usbFeatureType::featureLCD, 0, "", &lcdImage); } - else if (i.value().connected && i.value().type.model == usbDeviceType::StreamDeckPlus && i.value().lcd == cmdLCDSpectrum) + else if (i.value().connected && i.value().type.model == usbDeviceType::StreamDeckPlus && i.value().lcd == funcLCDSpectrum) { lcdImage = plot->toPixmap().toImage(); emit sendControllerRequest(&i.value(), usbFeatureType::featureLCD, 0, "", &lcdImage); @@ -5134,13 +4724,11 @@ void wfmain::handlePlotDoubleClick(QMouseEvent *me) freqGo.Hz = roundFrequency(freqGo.Hz, tsWfScrollHz); freqGo.MHzDouble = (float)freqGo.Hz / 1E6; - //emit setFrequency(0,freq); - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(freqGo),false)); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(freqGo),false)); - //issueCmd(cmdSetFreq, freqGo); freq = freqGo; setUIFreq(); - //issueDelayedCommand(cmdGetFreq); + showStatusBarText(QString("Going to %1 MHz").arg(x)); } } else if (me->button() == Qt::RightButton) { @@ -5149,15 +4737,10 @@ void wfmain::handlePlotDoubleClick(QMouseEvent *me) if (rectItem != nullptr) { double pbFreq = (pbtDefault / passbandWidth) * 127.0; qint16 newFreq = pbFreq + 128; - queue->add(priorityImmediate,queueItem(funcPBTInner,QVariant::fromValue(newFreq),false)); - queue->add(priorityImmediate,queueItem(funcPBTOuter,QVariant::fromValue(newFreq),false)); + queue->add(priorityImmediate,queueItem(funcPBTInner,QVariant::fromValue(newFreq),false)); + queue->add(priorityImmediate,queueItem(funcPBTOuter,QVariant::fromValue(newFreq),false)); queue->add(priorityHighest,funcPBTInner); queue->add(priorityHighest,funcPBTOuter); - //issueCmdUniquePriority(cmdSetTPBFInner, (unsigned char)newFreq); - //issueCmdUniquePriority(cmdSetTPBFOuter, (unsigned char)newFreq); - //issueDelayedCommandUnique(cmdGetTPBFInner); - //issueDelayedCommandUnique(cmdGetTPBFOuter); - } } } @@ -5178,10 +4761,8 @@ void wfmain::handleWFDoubleClick(QMouseEvent *me) freqGo.Hz = roundFrequency(freqGo.Hz, tsWfScrollHz); freqGo.MHzDouble = (float)freqGo.Hz / 1E6; - //emit setFrequency(0,freq); - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(freqGo),false)); + queue->add(priorityImmediate,queueItem(funcSelectedFreq,QVariant::fromValue(freqGo),false)); - //issueCmd(cmdSetFreq, freqGo); freq = freqGo; setUIFreq(); showStatusBarText(QString("Going to %1 MHz").arg(x)); @@ -5217,9 +4798,7 @@ void wfmain::handlePlotClick(QMouseEvent* me) freqt freqGo; freqGo.Hz = (spot.value()->frequency) * 1E6; freqGo.MHzDouble = spot.value()->frequency; - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(freqGo),false)); - - //issueCmdUniquePriority(cmdSetFreq, freqGo); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(freqGo),false)); } } else if (passbandAction == passbandStatic && rectItem != nullptr) @@ -5362,20 +4941,19 @@ void wfmain::handlePlotMouseMove(QMouseEvent* me) } queue->add(priorityImmediate,queueItem(funcFilterWidth,QVariant::fromValue(pb * 1000000),false)); queue->add(priorityHighest,funcFilterWidth); - //issueDelayedCommandUnique(cmdGetPassband); lastFreq = movedFrequency; } } else if (passbandAction == pbtMoving) { //qint16 shift = (qint16)(level - 128); - //TPBFInner = (double)(shift / 127.0) * (passbandWidth); + //PBTInner = (double)(shift / 127.0) * (passbandWidth); // Only move if more than 100Hz static double lastFreq = movedFrequency; if (lastFreq - movedFrequency > 0.000049 || movedFrequency - lastFreq > 0.000049) { - double innerFreq = ((double)(TPBFInner + movedFrequency) / passbandWidth) * 127.0; - double outerFreq = ((double)(TPBFOuter + movedFrequency) / passbandWidth) * 127.0; + double innerFreq = ((double)(PBTInner + movedFrequency) / passbandWidth) * 127.0; + double outerFreq = ((double)(PBTOuter + movedFrequency) / passbandWidth) * 127.0; qint16 newInFreq = innerFreq + 128; qint16 newOutFreq = outerFreq + 128; @@ -5384,14 +4962,10 @@ void wfmain::handlePlotMouseMove(QMouseEvent* me) qDebug() << QString("Moving passband by %1 Hz (Inner %2) (Outer %3) Mode:%4").arg((qint16)(movedFrequency * 1000000)) .arg(newInFreq).arg(newOutFreq).arg(currentModeInfo.mk); - queue->add(priorityImmediate,queueItem(funcPBTInner,QVariant::fromValue(newInFreq),false)); - queue->add(priorityImmediate,queueItem(funcPBTOuter,QVariant::fromValue(newOutFreq),false)); - //issueCmdUniquePriority(cmdSetTPBFInner, (unsigned char)newInFreq); - //issueCmdUniquePriority(cmdSetTPBFOuter, (unsigned char)newOutFreq); + queue->add(priorityImmediate,queueItem(funcPBTInner,QVariant::fromValue(newInFreq),false)); + queue->add(priorityImmediate,queueItem(funcPBTOuter,QVariant::fromValue(newOutFreq),false)); queue->add(priorityHighest,funcPBTInner); queue->add(priorityHighest,funcPBTOuter); - //issueDelayedCommandUnique(cmdGetTPBFInner); - //issueDelayedCommandUnique(cmdGetTPBFOuter); } lastFreq = movedFrequency; } @@ -5399,13 +4973,11 @@ void wfmain::handlePlotMouseMove(QMouseEvent* me) else if (passbandAction == pbtInnerMove) { static double lastFreq = movedFrequency; if (lastFreq - movedFrequency > 0.000049 || movedFrequency - lastFreq > 0.000049) { - double pbFreq = ((double)(TPBFInner + movedFrequency) / passbandWidth) * 127.0; + double pbFreq = ((double)(PBTInner + movedFrequency) / passbandWidth) * 127.0; qint16 newFreq = pbFreq + 128; if (newFreq >= 0 && newFreq <= 255) { - queue->add(priorityImmediate,queueItem(funcPBTInner,QVariant::fromValue(newFreq),false)); + queue->add(priorityImmediate,queueItem(funcPBTInner,QVariant::fromValue(newFreq),false)); queue->add(priorityHighest,funcPBTInner); - //issueCmdUniquePriority(cmdSetTPBFInner, (unsigned char)newFreq); - //issueDelayedCommandUnique(cmdGetTPBFInner); } lastFreq = movedFrequency; } @@ -5413,12 +4985,10 @@ void wfmain::handlePlotMouseMove(QMouseEvent* me) else if (passbandAction == pbtOuterMove) { static double lastFreq = movedFrequency; if (lastFreq - movedFrequency > 0.000049 || movedFrequency - lastFreq > 0.000049) { - double pbFreq = ((double)(TPBFOuter + movedFrequency) / passbandWidth) * 127.0; + double pbFreq = ((double)(PBTOuter + movedFrequency) / passbandWidth) * 127.0; qint16 newFreq = pbFreq + 128; if (newFreq >= 0 && newFreq <= 255) { - queue->add(priorityImmediate,queueItem(funcPBTOuter,QVariant::fromValue(newFreq),false)); - //issueCmdUniquePriority(cmdSetTPBFOuter, (unsigned char)newFreq); - //issueDelayedCommandUnique(cmdGetTPBFOuter); + queue->add(priorityImmediate,queueItem(funcPBTOuter,QVariant::fromValue(newFreq),false)); queue->add(priorityHighest,funcPBTOuter); } lastFreq = movedFrequency; @@ -5433,10 +5003,8 @@ void wfmain::handlePlotMouseMove(QMouseEvent* me) freqt freqGo; freqGo.VFO = activeVFO; freqGo.Hz = (freq.MHzDouble + delta) * 1E6; - //freqGo.Hz = roundFrequency(freqGo.Hz, tsWfScrollHz); freqGo.MHzDouble = (float)freqGo.Hz / 1E6; - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(freqGo),false)); - //issueCmdUniquePriority(cmdSetFreq, freqGo); + queue->add(priorityImmediate,queueItem(funcSelectedFreq,QVariant::fromValue(freqGo),false)); } } else { setCursor(Qt::ArrowCursor); @@ -5486,12 +5054,9 @@ void wfmain::handleWFScroll(QWheelEvent *we) f.MHzDouble = f.Hz / (double)1E6; freq = f; - //emit setFrequency(0,f); - //issueCmdUniquePriority(cmdSetFreq, f); - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); ui->freqLabel->setText(QString("%1").arg(f.MHzDouble, 0, 'f')); - //issueDelayedCommandUnique(cmdGetFreq); } void wfmain::handlePlotScroll(QWheelEvent *we) @@ -5503,142 +5068,124 @@ void wfmain::on_scopeEnableWFBtn_stateChanged(int state) { if (state == Qt::Unchecked) { - issueDelayedCommand(cmdSpecOff); + queue->add(priorityImmediate,queueItem(funcScopeOnOff,QVariant::fromValue(false),false)); } else { - issueDelayedCommand(cmdSpecOn); + queue->add(priorityImmediate,queueItem(funcScopeOnOff,QVariant::fromValue(true),false)); } prefs.wfEnable = state; } -void wfmain::receiveMode(unsigned char mode, unsigned char filter) +void wfmain::receiveMode(mode_info mode) { - // Update mode information if mode/filter has changed - if (currentModeInfo.reg != mode || currentModeInfo.filter != filter) - { - mode_info newMode; - foreach (auto m, rigCaps.modes) - { - if (m.reg == mode) - { - // Matching mode - newMode=m; - newMode.filter=filter; - qInfo(logSystem()) << __func__ << "Received new mode " << QString::number((uint)newMode.mk,16) << "(" << newMode.name << ") filter" << newMode.filter ; + if ((mode.VFO == activeVFO) && (currentModeInfo.reg != mode.reg || currentModeInfo.filter != mode.filter || currentModeInfo.data != mode.data)) + { + qInfo(logSystem()) << __func__ << QString("Received new mode: %0 (%1) filter:%2 data:%3") + .arg(QString::number(mode.mk,16)).arg(mode.name).arg(mode.filter).arg(mode.data) ; - quint16 maxPassbandHz = 0; - switch (newMode.mk) { - case modeFM: - case modeDV: - case modeDD: - if (filter == 1) - passbandWidth = 0.015; - else if (filter == 2) - passbandWidth = 0.010; - else - passbandWidth = 0.007; - passbandCenterFrequency = 0.0; - maxPassbandHz = 10E3; - queue->del(funcPBTInner); - queue->del(funcPBTOuter); - queue->del(funcFilterWidth); - - //removePeriodicRapidCmd(cmdGetPassband); - //removePeriodicRapidCmd(cmdGetTPBFInner); - //removePeriodicRapidCmd(cmdGetTPBFOuter); - break; - case modeCW: - case modeCW_R: - //insertPeriodicRapidCmdUnique(cmdGetCwPitch); - //insertPeriodicRapidCmdUnique(cmdGetDashRatio); - //insertPeriodicRapidCmdUnique(cmdGetKeySpeed); - queue->addUnique(priorityHigh,queueItem(funcCwPitch,true)); - queue->addUnique(priorityHigh,queueItem(funcDashRatio,true)); - queue->addUnique(priorityHigh,queueItem(funcKeySpeed,true)); - maxPassbandHz = 3600; - break; - case modeAM: - passbandCenterFrequency = 0.0; - maxPassbandHz = 10E3; - break; - case modeLSB: - case modeUSB: - passbandCenterFrequency = 0.0015; - maxPassbandHz = 3600; - break; - default: - passbandCenterFrequency = 0.0; - maxPassbandHz = 3600; - break; - } - - if ((newMode.mk != modeFM && newMode.mk != modeDV && newMode.mk != modeDD )) - { - /* mode was FM or DV/DD but now isn't so insert commands */ - queue->addUnique(priorityHigh,queueItem(funcPBTInner,true)); - queue->addUnique(priorityHigh,queueItem(funcPBTOuter,true)); - queue->addUnique(priorityHigh,queueItem(funcFilterWidth,true)); - - //insertPeriodicRapidCmdUnique(cmdGetPassband); - //insertPeriodicRapidCmdUnique(cmdGetTPBFInner); - //insertPeriodicRapidCmdUnique(cmdGetTPBFOuter); - } - - - if ((newMode.mk != modeCW && newMode.mk != modeCW_R) && (currentModeInfo.mk == modeCW || currentModeInfo.mk == modeCW_R)) - { - /* mode was CW/CWR but now isn't so remove CW commands */ - //removePeriodicRapidCmd(cmdGetCwPitch); - //removePeriodicRapidCmd(cmdGetDashRatio); - //removePeriodicRapidCmd(cmdGetKeySpeed); - queue->del(funcCwPitch); - queue->del(funcDashRatio); - queue->del(funcKeySpeed); - } - - ui->modeSelectCombo->setCurrentIndex(ui->modeSelectCombo->findData(newMode.mk)); - - if ((filter) && (filter < 4)) { - ui->modeFilterCombo->blockSignals(true); - ui->modeFilterCombo->setCurrentIndex(filter - 1); - ui->modeFilterCombo->blockSignals(false); - } - - currentModeInfo = newMode; - - rpt->handleUpdateCurrentMainMode(currentModeInfo); - cw->handleCurrentModeUpdate(currentModeInfo.mk); - - if (maxPassbandHz != 0) - { - trxadj->setMaxPassband(maxPassbandHz); - } - - // Note: we need to know if the DATA mode is active to reach mode-D - // some kind of queued query: - if (rigCaps.hasDataModes && rigCaps.hasTransmit) - { - issueDelayedCommand(cmdGetDataMode); - } - return; // We have nothing more to process + quint16 maxPassbandHz = 0; + switch (mode.mk) { + case modeFM: + case modeDV: + case modeDD: + if (mode.filter == 1) + passbandWidth = 0.015; + else if (mode.filter == 2) + passbandWidth = 0.010; + else + passbandWidth = 0.007; + passbandCenterFrequency = 0.0; + maxPassbandHz = 10E3; + queue->del(funcPBTInner); + queue->del(funcPBTOuter); + queue->del(funcFilterWidth); + break; + case modeCW: + case modeCW_R: + if (currentModeInfo.mk != modeCW && currentModeInfo.mk != modeCW_R) { + queue->addUnique(priorityHigh,(rigCaps.commands.contains(funcCwPitch)?funcCwPitch:funcNone),true); + queue->addUnique(priorityHigh,(rigCaps.commands.contains(funcDashRatio)?funcDashRatio:funcNone),true); + queue->addUnique(priorityHigh,(rigCaps.commands.contains(funcKeySpeed)?funcKeySpeed:funcNone),true); } + maxPassbandHz = 3600; + break; + case modeAM: + passbandCenterFrequency = 0.0; + maxPassbandHz = 10E3; + break; + case modeLSB: + case modeUSB: + passbandCenterFrequency = 0.0015; + maxPassbandHz = 3600; + break; + default: + passbandCenterFrequency = 0.0; + maxPassbandHz = 3600; + break; } - // If we got here, we didn't find a matching mode - qCritical(logSystem()) << __func__ << "Invalid mode " << mode << " received, check rig description file"; + + if ((mode.mk != modeFM && mode.mk != modeDV && mode.mk != modeDD )) + { + /* mode was FM or DV/DD but now isn't so insert commands */ + queue->addUnique(priorityHigh,(rigCaps.commands.contains(funcPBTInner)?funcPBTInner:funcNone),true); + queue->addUnique(priorityHigh,(rigCaps.commands.contains(funcPBTOuter)?funcPBTOuter:funcNone),true); + queue->addUnique(priorityHigh,(rigCaps.commands.contains(funcFilterWidth)?funcFilterWidth:funcNone),true); + } + + + if ((mode.mk != modeCW && mode.mk != modeCW_R) && (currentModeInfo.mk == modeCW || currentModeInfo.mk == modeCW_R)) + { + /* mode was CW/CWR but now isn't so remove CW commands */ + queue->del(funcCwPitch); + queue->del(funcDashRatio); + queue->del(funcKeySpeed); + } + + ui->modeSelectCombo->setCurrentIndex(ui->modeSelectCombo->findData(mode.mk)); + + if ((mode.filter) && (mode.filter < 4)) { + ui->modeFilterCombo->blockSignals(true); + ui->modeFilterCombo->setCurrentIndex(ui->modeFilterCombo->findData(mode.filter)); + ui->modeFilterCombo->blockSignals(false); + } + + currentModeInfo = mode; + + rpt->handleUpdateCurrentMainMode(currentModeInfo); + cw->handleCurrentModeUpdate(currentModeInfo.mk); + + if (maxPassbandHz != 0) + { + trxadj->setMaxPassband(maxPassbandHz); + } + + // If we don't have selectedmode, query for datamode directly + if (!rigCaps.commands.contains(funcSelectedMode)) + { + queue->add(priorityImmediate,funcDataModeWithFilter); + } + + return; // We have nothing more to process } } -void wfmain::receiveDataModeStatus(bool dataEnabled) +void wfmain::receiveDataModeStatus(unsigned char data, unsigned char filter) { - ui->dataModeBtn->blockSignals(true); - ui->dataModeBtn->setChecked(dataEnabled); - ui->dataModeBtn->blockSignals(false); + ui->datamodeCombo->blockSignals(true); + ui->datamodeCombo->setCurrentIndex(data); + ui->datamodeCombo->blockSignals(false); - usingDataMode = dataEnabled; + if (filter) + { + ui->modeFilterCombo->blockSignals(true); + ui->modeFilterCombo->setCurrentIndex(ui->modeFilterCombo->findData(filter)); + ui->modeFilterCombo->blockSignals(false); + } + usingDataMode = data; } void wfmain::on_clearPeakBtn_clicked() @@ -5688,9 +5235,7 @@ void wfmain::on_goFreqBtn_clicked() } if(ok) { - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); - - //issueCmd(cmdSetFreq, f); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); foreach (mode_info mi, rigCaps.modes) { @@ -5698,14 +5243,11 @@ void wfmain::on_goFreqBtn_clicked() { mode_info m = mode_info(mi); m.filter = ui->modeFilterCombo->currentData().toInt(); - m.data = ui->dataModeBtn->isChecked(); + m.data = usingDataMode; m.VFO=selVFO_t::activeVFO; - if((m.mk != currentModeInfo.mk) && !usingDataMode && prefs.automaticSidebandSwitching) + if((m.mk != currentModeInfo.mk) && prefs.automaticSidebandSwitching) { - queue->add(priorityImmediate,queueItem(funcModeSet,QVariant::fromValue(m),false)); - queue->add(priorityImmediate,funcModeGet,false); - //issueCmd(cmdSetMode, m); - //issueDelayedCommand(cmdGetMode); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedMode)?funcSelectedMode:funcModeGet),QVariant::fromValue(m),false)); } break; } @@ -5858,7 +5400,7 @@ void wfmain::changeMode(mode_kind mode) changeMode(mode, dataOn); } -void wfmain::changeMode(mode_kind mode, bool dataOn) +void wfmain::changeMode(mode_kind mode, unsigned char data) { foreach (mode_info mi, rigCaps.modes) @@ -5868,30 +5410,22 @@ void wfmain::changeMode(mode_kind mode, bool dataOn) mode_info m; m = mode_info(mi); m.filter = ui->modeFilterCombo->currentData().toInt(); - m.data = dataOn; + m.data = data; m.VFO=selVFO_t::activeVFO; - if((m.mk != currentModeInfo.mk) && !usingDataMode && prefs.automaticSidebandSwitching) + if((m.mk != currentModeInfo.mk) && prefs.automaticSidebandSwitching) { - issueCmd(cmdSetMode, m); - issueDelayedCommand(cmdGetMode); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedMode)?funcSelectedMode:funcModeGet),QVariant::fromValue(m),false)); + if (!rigCaps.commands.contains(funcSelectedMode)) + queue->add(priorityImmediate,queueItem(funcDataModeWithFilter,QVariant::fromValue(m),false)); } break; } } - if(dataOn && (!usingDataMode)) - { - issueDelayedCommand(cmdSetDataModeOn); - ui->dataModeBtn->blockSignals(true); - ui->dataModeBtn->setChecked(true); - ui->dataModeBtn->blockSignals(false); - } else if ((!dataOn) && usingDataMode) { - issueDelayedCommand(cmdSetDataModeOff); - ui->dataModeBtn->blockSignals(true); - ui->dataModeBtn->setChecked(false); - ui->dataModeBtn->blockSignals(false); - } - issueDelayedCommand(cmdGetMode); + queue->add(priorityImmediate,(rigCaps.commands.contains(funcSelectedMode)?funcSelectedMode:funcModeGet),false); + ui->datamodeCombo->blockSignals(true); + ui->datamodeCombo->setCurrentIndex(data); + ui->datamodeCombo->blockSignals(false); } void wfmain::on_modeSelectCombo_activated(int index) @@ -5914,10 +5448,10 @@ void wfmain::on_modeSelectCombo_activated(int index) { mode_info m = mode_info(mi); m.filter = filterSelection; - m.data = ui->dataModeBtn->isChecked(); + m.data = usingDataMode; m.VFO=selVFO_t::activeVFO; - queue->add(priorityImmediate,queueItem(funcModeSet,QVariant::fromValue(m),false)); - queue->add(priorityHigh,funcModeGet,false); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedMode)?funcSelectedMode:funcModeSet),QVariant::fromValue(m),false)); + queue->add(priorityImmediate,(rigCaps.commands.contains(funcSelectedMode)?funcSelectedMode:funcModeGet),false); break; } } @@ -5971,9 +5505,7 @@ void wfmain::on_freqDial_valueChanged(int value) freq = f; oldFreqDialVal = value; ui->freqLabel->setText(QString("%1").arg(f.MHzDouble, 0, 'f')); - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); - - //issueCmdUniquePriority(cmdSetFreq, f); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); } else { ui->freqDial->blockSignals(true); ui->freqDial->setValue(oldFreqDialVal); @@ -5987,30 +5519,27 @@ void wfmain::receiveBandStackReg(freqt freqGo, char mode, char filter, bool data // read the band stack and apply by sending out commands qInfo(logSystem()) << __func__ << "BSR received into main: Freq: " << freqGo.Hz << ", mode: " << (unsigned int)mode << ", filter: " << (unsigned int)filter << ", data mode: " << dataOn; - //emit setFrequency(0,freq); - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(freqGo),false)); - //issueCmd(cmdSetFreq, freqGo); - setModeVal = (unsigned char) mode; - setFilterVal = (unsigned char) filter; + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(freqGo),false)); - issueDelayedCommand(cmdSetModeFilter); freq = freqGo; - setUIFreq(); + //setUIFreq(); - if(dataOn) - { - queue->add(priorityImmediate,queueItem(funcDataModeWithFilter,QVariant::fromValue(1),false)); - //issueDelayedCommand(cmdSetDataModeOn); - } else { - queue->add(priorityImmediate,queueItem(funcDataModeWithFilter,QVariant::fromValue(0),false)); - //issueDelayedCommand(cmdSetDataModeOff); - } - //issueDelayedCommand(cmdGetFreq); - //issueDelayedCommand(cmdGetMode); ui->tabWidget->setCurrentIndex(0); - receiveMode((unsigned char) mode, (unsigned char) filter); // update UI + foreach (auto md, rigCaps.modes) + { + if (md.reg == mode) { + md.filter=filter; + md.data=dataOn; + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedMode)?funcSelectedMode:funcModeSet),QVariant::fromValue(md),false)); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedMode)?funcNone:funcDataModeWithFilter),QVariant::fromValue(md),false)); + receiveMode(md); // update UI + break; + } + } + queue->add(priorityHighest,(rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqGet)); + queue->add(priorityHighest,(rigCaps.commands.contains(funcSelectedMode)?funcSelectedFreq:funcModeGet)); } void wfmain::bandStackBtnClick() @@ -6023,9 +5552,6 @@ void wfmain::bandStackBtnClick() void wfmain::setBand(int band) { queue->add(priorityImmediate,queueItem(funcBandStackReg,QVariant::fromValue(band),false)); - - //issueCmdUniquePriority(cmdGetBandStackReg, (char)band); - //bandStackBtnClick(); } void wfmain::on_band23cmbtn_clicked() @@ -6069,12 +5595,9 @@ void wfmain::on_band4mbtn_clicked() } else { f.Hz = (70.200) * 1E6; } - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); - //issueCmd(cmdSetFreq, f); - //emit setFrequency(0,f); - //issueDelayedCommandUnique(cmdGetFreq); - queue->add(priorityImmediate,funcFreqGet); + queue->add(priorityImmediate,(rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqGet)); ui->tabWidget->setCurrentIndex(0); } @@ -6139,11 +5662,8 @@ void wfmain::on_band60mbtn_clicked() // clutter the UI with 60M channel buttons... freqt f; f.Hz = (5.3305) * 1E6; - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); - queue->add(priorityImmediate,funcFreqGet); - //issueCmd(cmdSetFreq, f); - //emit setFrequency(0,f); - //issueDelayedCommandUnique(cmdGetFreq); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); + ui->tabWidget->setCurrentIndex(0); } @@ -6164,10 +5684,9 @@ void wfmain::on_band630mbtn_clicked() freqt f; f.Hz = 475 * 1E3; //emit setFrequency(0,f); - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); - queue->add(priorityImmediate,funcFreqGet); - //issueCmd(cmdSetFreq, f); - //issueDelayedCommandUnique(cmdGetFreq); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); + queue->add(priorityImmediate,(rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqGet)); + ui->tabWidget->setCurrentIndex(0); } @@ -6176,10 +5695,9 @@ void wfmain::on_band2200mbtn_clicked() freqt f; f.Hz = 136 * 1E3; //emit setFrequency(0,f); - queue->add(priorityImmediate,queueItem(funcMainSubFreq,QVariant::fromValue(f),false)); - queue->add(priorityImmediate,funcFreqGet); - //issueCmd(cmdSetFreq, f); - //issueDelayedCommandUnique(cmdGetFreq); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqSet),QVariant::fromValue(f),false)); + queue->add(priorityImmediate,(rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqGet)); + ui->tabWidget->setCurrentIndex(0); } @@ -6243,8 +5761,10 @@ void wfmain::on_fRclBtn_clicked() ui->goFreqBtn->click(); setModeVal = temp.mode; setFilterVal = ui->modeFilterCombo->currentIndex()+1; // TODO, add to memory - issueDelayedCommand(cmdSetModeFilter); - issueDelayedCommand(cmdGetMode); + + //issueDelayedCommand(cmdSetModeFilter); + //issueDelayedCommand(cmdGetMode); + queue->add(priorityMedium,(rigCaps.commands.contains(funcSelectedMode)?funcSelectedMode:funcModeGet),false); } else { qInfo(logSystem()) << "Could not recall preset. Valid presets are 0 through 99."; } @@ -6253,9 +5773,7 @@ void wfmain::on_fRclBtn_clicked() void wfmain::on_rfGainSlider_valueChanged(int value) { - queue->addUnique(priorityImmediate,queueItem(funcRfGain,QVariant::fromValue(value))); - - //issueCmdUniquePriority(cmdSetRxRfGain, (unsigned char) value); + queue->addUnique(priorityImmediate,queueItem(funcRfGain,QVariant::fromValue(value),false)); } void wfmain::on_afGainSlider_valueChanged(int value) @@ -6264,12 +5782,23 @@ void wfmain::on_afGainSlider_valueChanged(int value) { rxSetup.localAFgain = (unsigned char)(value); prefs.localAFgain = (unsigned char)(value); + emit setAfGain(value); emit sendLevel(cmdGetAfGain,value); } else { - queue->addUnique(priorityImmediate,queueItem(funcAfGain,QVariant::fromValue(value))); + queue->addUnique(priorityImmediate,queueItem(funcAfGain,QVariant::fromValue(value),false)); } } +void wfmain::on_monitorSlider_valueChanged(int value) +{ + queue->addUnique(priorityImmediate,queueItem(funcMonitorGain,QVariant::fromValue(value),false)); +} + +void wfmain::on_monitorCheck_clicked(bool checked) +{ + queue->add(priorityImmediate,queueItem(funcMonitor,QVariant::fromValue(checked))); +} + void wfmain::receiveRfGain(unsigned char level) { // qInfo(logSystem()) << "Receive RF level of" << (int)level << " = " << 100*level/255.0 << "%"; @@ -6300,28 +5829,16 @@ void wfmain::receiveIFShift(unsigned char level) emit sendLevel(cmdGetIFShift,level); } -void wfmain::receiveTBPFInner(unsigned char level) -{ - trxadj->updateTPBFInner(level); - emit sendLevel(cmdGetTPBFInner,level); -} - -void wfmain::receiveTBPFOuter(unsigned char level) -{ - trxadj->updateTPBFOuter(level); - emit sendLevel(cmdGetTPBFOuter,level); -} - void wfmain::on_tuneNowBtn_clicked() { - issueDelayedCommand(cmdStartATU); + queue->addUnique(priorityImmediate,queueItem(funcTunerStatus,QVariant::fromValue(2))); showStatusBarText("Starting ATU tuning cycle..."); - issueDelayedCommand(cmdGetATUStatus); + queue->addUnique(priorityImmediate,funcTunerStatus); } void wfmain::on_tuneEnableChk_clicked(bool checked) { - queue->addUnique(priorityImmediate,queueItem(funcTunerStatus,QVariant::fromValue(checked))); + queue->addUnique(priorityImmediate,queueItem(funcTunerStatus,QVariant::fromValue(checked))); if(checked) { @@ -6349,7 +5866,7 @@ void wfmain::on_pttOnBtn_clicked() // Are we already PTT? Not a big deal, just send again anyway. showStatusBarText("Sending PTT ON command. Use Control-R to receive."); - //issueCmdUniquePriority(cmdSetPTT, true); + queue->add(priorityImmediate,queueItem(funcTransceiverStatus,QVariant::fromValue(true),false)); // send PTT @@ -6363,7 +5880,6 @@ void wfmain::on_pttOffBtn_clicked() // Send the PTT OFF command (more than once?) showStatusBarText("Sending PTT OFF command"); queue->add(priorityImmediate,queueItem(funcTransceiverStatus,QVariant::fromValue(false),false)); - //issueCmdUniquePriority(cmdSetPTT, false); // Stop the 3 min timer pttTimer->stop(); @@ -6407,8 +5923,7 @@ void wfmain::receiveATUStatus(unsigned char atustatus) // Add command queue to check again and update status bar // qInfo(logSystem()) << "Received ATU status update that *tuning* is taking place"; showStatusBarText("ATU is Tuning..."); - issueDelayedCommand(cmdGetATUStatus); // Sometimes the first hit seems to be missed. - issueDelayedCommand(cmdGetATUStatus); + queue->add(priorityHighest,funcTunerStatus); break; default: qInfo(logSystem()) << "Did not understand ATU status: " << (unsigned int) atustatus; @@ -6586,7 +6101,7 @@ void wfmain::on_toFixedBtn_clicked() ui->scopeEdgeCombo->blockSignals(true); ui->scopeEdgeCombo->setCurrentIndex(edge-1); ui->scopeEdgeCombo->blockSignals(false); - issueDelayedCommand(cmdScopeFixedMode); + queue->add(priorityImmediate,queueItem(funcScopeCenterFixed,QVariant::fromValue(1))); } } } @@ -6614,22 +6129,15 @@ void wfmain::on_sqlSlider_valueChanged(int value) // These three are from the transceiver adjustment window: void wfmain::changeIFShift(unsigned char level) { - //issueCmd(cmdSetIFShift, level); - queue->add(priorityImmediate,queueItem(funcFilterWidth,QVariant::fromValue(level),false)); - - //issueCmdUniquePriority(cmdSetIFShift, level); + queue->add(priorityImmediate,queueItem((rigCaps.commands.contains(funcFilterWidth)?funcFilterWidth:funcIFShift),QVariant::fromValue(level),false)); } -void wfmain::changeTPBFInner(unsigned char level) +void wfmain::changePBTInner(unsigned char level) { - queue->add(priorityImmediate,queueItem(funcPBTInner,QVariant::fromValue(level))); - - //issueCmdUniquePriority(cmdSetTPBFInner, level); + queue->add(priorityImmediate,queueItem(funcPBTInner,QVariant::fromValue(level))); } -void wfmain::changeTPBFOuter(unsigned char level) +void wfmain::changePBTOuter(unsigned char level) { - queue->add(priorityImmediate,queueItem(funcPBTOuter,QVariant::fromValue(level))); - - //issueCmdUniquePriority(cmdSetTPBFOuter, level); + queue->add(priorityImmediate,queueItem(funcPBTOuter,QVariant::fromValue(level))); } void wfmain::on_modeFilterCombo_activated(int index) @@ -6646,45 +6154,41 @@ void wfmain::on_modeFilterCombo_activated(int index) } else { unsigned char newMode = static_cast(ui->modeSelectCombo->currentData().toUInt()); - if(ui->dataModeBtn->isChecked()) + foreach (mode_info mi, rigCaps.modes) { - emit setDataMode(true, (unsigned char)filterSelection); - issueDelayedCommand(cmdSetDataModeOn); - } else { - foreach (mode_info mi, rigCaps.modes) + if (mi.mk == (mode_kind)newMode) { - if (mi.mk == (mode_kind)newMode) - { - mode_info m; - m = mode_info(mi); - m.filter = filterSelection; - m.data = ui->dataModeBtn->isChecked(); - m.VFO=selVFO_t::activeVFO; - queue->add(priorityImmediate, queueItem(funcModeSet,QVariant::fromValue(m),false)); - //issueCmd(cmdSetMode, m); - break; - } + mode_info m; + m = mode_info(mi); + m.filter = filterSelection; + m.data = usingDataMode; + m.VFO=selVFO_t::activeVFO; + queue->add(priorityImmediate, queueItem((rigCaps.commands.contains(funcSelectedMode)?funcSelectedMode:funcModeSet),QVariant::fromValue(m),false)); + break; } } } } -void wfmain::on_dataModeBtn_toggled(bool checked) +void wfmain::on_datamodeCombo_activated(int index) { mode_info m; m.filter = ui->modeFilterCombo->currentData().toInt(); - m.data = checked; + m.data = index; queue->add(priorityImmediate, queueItem(funcDataModeWithFilter,QVariant::fromValue(m))); - //emit setDataMode(checked, (unsigned char)ui->modeFilterCombo->currentData().toInt()); - usingDataMode = checked; - if(usingDataMode) - { - changeModLabelAndSlider(currentModDataSrc); - } else { - changeModLabelAndSlider(currentModSrc); + + usingDataMode = index; + if(usingDataMode == 0) { + changeModLabelAndSlider(currentModDataOffSrc); + } else if (usingDataMode == 1){ + changeModLabelAndSlider(currentModData1Src); + } else if (usingDataMode == 2){ + changeModLabelAndSlider(currentModData2Src); + } else if (usingDataMode == 3){ + changeModLabelAndSlider(currentModData3Src); } } @@ -6703,22 +6207,15 @@ void wfmain::on_transmitBtn_clicked() showStatusBarText("Sending PTT ON command. Use Control-R to receive."); queue->add(priorityImmediate,queueItem(funcTransceiverStatus,QVariant::fromValue(true),false)); - //issueCmdUniquePriority(cmdSetPTT, true); // send PTT // Start 3 minute timer pttTimer->start(); - //issueDelayedCommand(cmdGetPTT); - //changeTxBtn(); - } else { // Currently transmitting queue->add(priorityImmediate,queueItem(funcTransceiverStatus,QVariant::fromValue(false),false)); - //issueCmdUniquePriority(cmdSetPTT, false); pttTimer->stop(); - //issueDelayedCommand(cmdGetPTT); - } queue->add(priorityHighest,funcTransceiverStatus); } @@ -6794,9 +6291,11 @@ void wfmain::setRadioTimeDateSend() void wfmain::changeSliderQuietly(QSlider *slider, int value) { - slider->blockSignals(true); - slider->setValue(value); - slider->blockSignals(false); + if (slider->value() != value) { + slider->blockSignals(true); + slider->setValue(value); + slider->blockSignals(false); + } } void wfmain::statusFromSliderRaw(QString name, int rawValue) @@ -6813,7 +6312,6 @@ void wfmain::receiveTxPower(unsigned char power) { changeSliderQuietly(ui->txPowerSlider, power); emit sendLevel(cmdGetTxPower,power); - } void wfmain::receiveMicGain(unsigned char gain) @@ -6824,136 +6322,88 @@ void wfmain::receiveMicGain(unsigned char gain) void wfmain::processModLevel(inputTypes source, unsigned char level) { - inputTypes currentIn; - if(usingDataMode) - { - currentIn = currentModDataSrc; + rigInput currentIn; + + if (usingDataMode == 1) { + currentIn = currentModData1Src; + } else if (usingDataMode == 2) { + currentIn = currentModData2Src; + } else if (usingDataMode == 3) { + currentIn = currentModData3Src; } else { - currentIn = currentModSrc; + currentIn = currentModDataOffSrc; } - switch(source) - { - case inputMICACC: - case inputMICUSB: - case inputMic: - micGain = level; - break; - case inputACC: - accGain = level; - break; - - case inputACCA: - accAGain = level; - break; - - case inputACCB: - accBGain = level; - break; - - case inputUSB: - usbGain = level; - break; - - case inputLAN: - lanGain = level; - break; - - default: - break; - } - if(currentIn == source) + if(currentIn.type == source) { + currentIn.level = level; changeSliderQuietly(ui->micGainSlider, level); emit sendLevel(cmdGetModLevel,level); } } -void wfmain::receiveModInput(inputTypes input, bool dataOn) +void wfmain::receiveModInput(rigInput input, unsigned char data) { - QComboBox *box; - QString inputName; - bool found; - bool foundCurrent = false; + QComboBox *box = Q_NULLPTR; - if(dataOn) - { - box = ui->modInputData1Combo; - currentModDataSrc = input; - if(usingDataMode) - foundCurrent = true; - } else { + //qInfo() << QString("Data: %0 Input: %1 current: %2").arg(data).arg(input.name).arg(currentModDataOffSrc.name); + // This will ONLY fire if the input type is different to the current one + if (data == 0 && currentModDataOffSrc.type != input.type) { + queue->del(getInputTypeCommand(currentModDataOffSrc.type)); box = ui->modInputCombo; - currentModSrc = input; - if(!usingDataMode) - foundCurrent = true; + currentModDataOffSrc = input; + } else if (data == 1 && currentModData1Src.type != input.type) { + queue->del(getInputTypeCommand(currentModData1Src.type)); + box = ui->modInputData1Combo; + currentModData1Src = input; + } else if (data == 2 && currentModData2Src.type != input.type) { + queue->del(getInputTypeCommand(currentModData2Src.type)); + box = ui->modInputData2Combo; + currentModData2Src = input; + } else if (data == 3 && currentModData3Src.type != input.type) { + queue->del(getInputTypeCommand(currentModData3Src.type)); + box = ui->modInputData3Combo; + currentModData3Src = input; } - for(int i=0; i < box->count(); i++) + if (box != Q_NULLPTR) { - if(box->itemData(i).toInt() == (int)input) - { - box->blockSignals(true); - box->setCurrentIndex(i); - box->blockSignals(false); - found = true; + box->blockSignals(true); + box->setCurrentIndex(box->findData((int)input.type)); + box->blockSignals(false); + if (ui->datamodeCombo->currentData().toUInt() == data) { + queue->add(priorityImmediate,getInputTypeCommand(input.type),false); + changeModLabel(input); } } - - if(foundCurrent) - { - changeModLabel(input); - } - if(!found) - qInfo(logSystem()) << "Could not find modulation input: " << (int)input; -} - -void wfmain::receiveACCGain(unsigned char level, unsigned char ab) -{ - if(ab==1) - { - processModLevel(inputACCB, level); - } else { - if(rigCaps.model == model7850) - { - processModLevel(inputACCA, level); - } else { - processModLevel(inputACC, level); - } - } -} - -void wfmain::receiveUSBGain(unsigned char level) -{ - processModLevel(inputUSB, level); -} - -void wfmain::receiveLANGain(unsigned char level) -{ - processModLevel(inputLAN, level); } void wfmain::receivePassband(quint16 pass) { - if (passbandWidth != (double)(pass / 1000000.0)) { - passbandWidth = (double)(pass / 1000000.0); + double pb = (double)(pass / 1000000.0); + if (passbandWidth != pb) { + passbandWidth = pb; trxadj->updatePassband(pass); - rigState->set(PASSBAND, pass, false); - showStatusBarText(QString("IF filter width %1 Hz").arg(pass)); + qInfo(logSystem()) << QString("Received new IF Filter/Passband %0 Hz").arg(pass); + showStatusBarText(QString("IF filter width %0 Hz (%1 MHz)").arg(pass).arg(passbandWidth)); } } void wfmain::receiveCwPitch(unsigned char pitch) { if (currentModeInfo.mk == modeCW || currentModeInfo.mk == modeCW_R) { - cwPitch = round((((600.0 / 255.0) * pitch) + 300) / 5.0) * 5.0; - passbandCenterFrequency = cwPitch / 2000000.0; - emit sendLevel(cmdGetCwPitch,pitch); + quint16 p = round((((600.0 / 255.0) * pitch) + 300) / 5.0) * 5.0; + if (p != cwPitch) + { + passbandCenterFrequency = p / 2000000.0; + qInfo(logSystem()) << QString("Received new CW Pitch %0 Hz was %1 (center freq %2 MHz)").arg(p).arg(cwPitch).arg(passbandCenterFrequency); + cwPitch = p; + emit sendLevel(cmdGetCwPitch,pitch); + } } - //qDebug() << "CW" << pitch << "Pitch" << cwPitch; } -void wfmain::receiveTPBFInner(unsigned char level) { +void wfmain::receivePBTInner(unsigned char level) { /* * This is written like this as although PBT is supposed to be sent in 25Hz steps, * sometimes it sends the 'nearest' value. This results in math errors. @@ -6967,12 +6417,16 @@ void wfmain::receiveTPBFInner(unsigned char level) { { pitch = (600.0 - cwPitch) / 1000000.0; } - TPBFInner = round((tempVar + pitch) * 200000.0) / 200000.0; // Nearest 5Hz. - emit sendLevel(cmdGetTPBFInner,level); - //qDebug() << "Inner" << level << "TPBFInner" << TPBFInner; + double inner = round((tempVar + pitch) * 200000.0) / 200000.0; // Nearest 5Hz. + if (inner != PBTInner) + { + qInfo(logSystem()) << QString("Received new PBT Inner %0 MHz").arg(inner); + PBTInner = inner; + emit sendLevel(cmdGetPBTInner,level); + } } -void wfmain::receiveTPBFOuter(unsigned char level) { +void wfmain::receivePBTOuter(unsigned char level) { /* * This is written like this as although PBT is supposed to be sent in 25Hz steps, * sometimes it sends the 'nearest' value. This results in math errors. @@ -6986,9 +6440,13 @@ void wfmain::receiveTPBFOuter(unsigned char level) { { pitch = (600.0 - cwPitch) / 1000000.0; } - TPBFOuter = round((tempVar + pitch) * 200000.0) / 200000.0; // Nearest 5Hz. - emit sendLevel(cmdGetTPBFOuter,level); - //qDebug() << "Outer" << level << "TPBFOuter" << TPBFOuter; + double outer = round((tempVar + pitch) * 200000.0) / 200000.0; // Nearest 5Hz. + if (outer != PBTOuter) + { + qInfo(logSystem()) << QString("Received new PBT Outer %0 MHz").arg(outer); + PBTOuter = outer; + emit sendLevel(cmdGetPBTOuter,level); + } } void wfmain::receiveTuningStep(unsigned char step) @@ -6997,7 +6455,8 @@ void wfmain::receiveTuningStep(unsigned char step) { foreach (auto s, rigCaps.steps) { - if (step == s.num) { + if (step == s.num && ui->tuningStepCombo->currentData().toInt() != s.hz) { + qInfo(logSystem()) << QString("Received new Tuning Step %0").arg(s.name); ui->tuningStepCombo->setCurrentIndex(ui->tuningStepCombo->findData(s.hz)); break; } @@ -7042,6 +6501,7 @@ void wfmain::receiveCompLevel(unsigned char compLevel) void wfmain::receiveMonitorGain(unsigned char monitorGain) { + changeSliderQuietly(ui->monitorSlider, monitorGain); emit sendLevel(cmdGetMonitorGain,monitorGain); } @@ -7073,6 +6533,9 @@ void wfmain::receiveComp(bool en) void wfmain::receiveMonitor(bool en) { + ui->monitorCheck->blockSignals(true); + ui->monitorCheck->setChecked(en); + ui->monitorCheck->blockSignals(false); emit sendLevel(cmdGetMonitor,en); } @@ -7093,10 +6556,7 @@ void wfmain::receiveNR(bool en) void wfmain::on_txPowerSlider_valueChanged(int value) { - queue->add(priorityImmediate,queueItem(funcRFPower,QVariant::fromValue(value),false)); - - //issueCmdUniquePriority(cmdSetTxPower, (unsigned char)value); - //emit setTxPower(value); + queue->addUnique(priorityImmediate,queueItem(funcRFPower,QVariant::fromValue(value),false)); } void wfmain::on_micGainSlider_valueChanged(int value) @@ -7117,90 +6577,112 @@ void wfmain::receiveSpectrumRefLevel(int level) void wfmain::on_modInputCombo_activated(int index) { - emit setModInput( inputTypes(ui->modInputCombo->currentData().toInt()), false ); - currentModSrc = inputTypes(ui->modInputCombo->currentData().toInt()); - issueDelayedCommand(cmdGetCurrentModLevel); - if(!usingDataMode) + queue->del(getInputTypeCommand(currentModDataOffSrc.type)); + foreach(auto inp, rigCaps.inputs) { - changeModLabel(currentModSrc); + if (inp.type == inputTypes(ui->modInputCombo->currentData().toInt())) + { + currentModDataOffSrc = rigInput(inp); + if(usingDataMode==0) + { + queue->add(priorityImmediate,queueItem(funcDATAOffMod,QVariant::fromValue(currentModDataOffSrc))); + changeModLabel(currentModDataOffSrc); + } + return;; + } } + + qWarning(logSystem()) << "Invalid Input type (check rigcaps)" << ui->modInputCombo->currentData().toInt(); (void)index; } void wfmain::on_modInputData1Combo_activated(int index) { - emit setModInput( inputTypes(ui->modInputData1Combo->currentData().toInt()), true ); - currentModDataSrc = inputTypes(ui->modInputData1Combo->currentData().toInt()); - - issueDelayedCommand(cmdGetCurrentModLevel); - if(usingDataMode) + queue->del(getInputTypeCommand(currentModData1Src.type)); + foreach(auto inp, rigCaps.inputs) { - changeModLabel(currentModDataSrc); + if (inp.type == inputTypes(ui->modInputData1Combo->currentData().toInt())) + { + currentModData1Src = rigInput(inp); + if(usingDataMode==1) + { + queue->add(priorityImmediate,queueItem(funcDATA1Mod,QVariant::fromValue(currentModData1Src))); + changeModLabel(currentModData1Src); + } + return; + } } + + qWarning(logSystem()) << "DATA1 Invalid Input type (check rigcaps)" << ui->modInputData1Combo->currentData().toInt(); (void)index; } void wfmain::on_modInputData2Combo_activated(int index) { + queue->del(getInputTypeCommand(currentModData2Src.type)); + foreach(auto inp, rigCaps.inputs) + { + if (inp.type == inputTypes(ui->modInputData2Combo->currentData().toInt())) + { + currentModData2Src = rigInput(inp); + if(usingDataMode==1) + { + changeModLabel(currentModData1Src); + queue->add(priorityImmediate,queueItem(funcDATA2Mod,QVariant::fromValue(currentModData2Src))); + } + return; + } + } + + qWarning(logSystem()) << "DATA2 Invalid Input type (check rigcaps)" << ui->modInputData2Combo->currentData().toInt(); (void)index; } void wfmain::on_modInputData3Combo_activated(int index) { + queue->del(getInputTypeCommand(currentModData3Src.type)); + foreach(auto inp, rigCaps.inputs) + { + + if (inp.type == inputTypes(ui->modInputData3Combo->currentData().toInt())) + { + currentModData3Src = rigInput(inp); + if(usingDataMode==3) + { + changeModLabel(currentModData3Src); + queue->add(priorityImmediate,queueItem(funcDATA3Mod,QVariant::fromValue(currentModData3Src))); + } + return; + } + } + + qWarning(logSystem()) << "DATA3 Invalid Input type (check rigcaps)" << ui->modInputData3Combo->currentData().toInt(); (void)index; } -void wfmain::changeModLabelAndSlider(inputTypes source) +void wfmain::changeModLabelAndSlider(rigInput source) { changeModLabel(source, true); } -void wfmain::changeModLabel(inputTypes input) +void wfmain::changeModLabel(rigInput input) { changeModLabel(input, false); } -void wfmain::changeModLabel(inputTypes input, bool updateLevel) +void wfmain::changeModLabel(rigInput input, bool updateLevel) { - unsigned char gain = 0; - switch(input) - { - case inputMic: - case inputMICACC: - case inputMICUSB: - gain = micGain; - break; - case inputACC: - gain = accGain; - break; - case inputACCA: - gain = accAGain; - break; - case inputACCB: - gain = accBGain; - break; - case inputUSB: - gain = usbGain; - break; - case inputLAN: - gain = lanGain; - break; - default: - gain=0; - break; - } - foreach (auto ip, rigCaps.inputs) - { - if (ip.type == input) - ui->modSliderLbl->setText(ip.name); - } + queue->add(priorityMedium,getInputTypeCommand(input.type),true); + + ui->modSliderLbl->setText(input.name); + if(updateLevel) { - changeSliderQuietly(ui->micGainSlider, gain); + changeSliderQuietly(ui->micGainSlider, input.level); } } @@ -7208,47 +6690,23 @@ void wfmain::processChangingCurrentModLevel(unsigned char level) { // slider moved, so find the current mod and issue the level set command. - rigInput currentIn; - if(usingDataMode) - { - currentIn = currentModDataSrc; - } else { - currentIn = currentModSrc; - } - funcs f = funcNone; - switch (currentIn.type) + if(usingDataMode == 0) { - case inputACC: - case inputACCA: - f = funcACC1ModLevel; - break; - case inputACCB: - f = funcACC2ModLevel; - break; - case inputMic: - case inputMICACC: - case inputMICUSB: - f = funcMicGain; - break; - case inputLAN: - f = funcLANModLevel; - break; - case inputUSB: - f = funcUSBModLevel; - break; - default: - f = funcNone; - + f = getInputTypeCommand(currentModDataOffSrc.type); + } else if (usingDataMode == 1) { + f = getInputTypeCommand(currentModData1Src.type); + } else if (usingDataMode == 2) { + f = getInputTypeCommand(currentModData2Src.type); + } else if (usingDataMode == 3) { + f = getInputTypeCommand(currentModData3Src.type); } - queue->add(priorityImmediate,queueItem(f,QVariant::fromValue(level))); + queue->addUnique(priorityImmediate,queueItem(f,QVariant::fromValue(level),false)); } void wfmain::on_tuneLockChk_clicked(bool checked) { - - freqLock = checked; } @@ -7494,14 +6952,14 @@ void wfmain::powerRigOn() delayedCommand->setInterval(3000); // 3 seconds if(ui->scopeEnableWFBtn->checkState() != Qt::Unchecked) { - issueDelayedCommand(cmdDispEnable); - issueDelayedCommand(cmdQueNormalSpeed); - issueDelayedCommand(cmdSpecOn); - issueDelayedCommand(cmdStartRegularPolling); // s-meter, etc + //issueDelayedCommand(cmdDispEnable); + //issueDelayedCommand(cmdQueNormalSpeed); + //issueDelayedCommand(cmdSpecOn); + //issueDelayedCommand(cmdStartRegularPolling); // s-meter, etc } else { - issueDelayedCommand(cmdQueNormalSpeed); - issueDelayedCommand(cmdSpecOff); - issueDelayedCommand(cmdStartRegularPolling); // s-meter, etc + //issueDelayedCommand(cmdQueNormalSpeed); + //issueDelayedCommand(cmdSpecOff); + //issueDelayedCommand(cmdStartRegularPolling); // s-meter, etc } delayedCommand->start(); calculateTimingParameters(); // Set queue interval @@ -7781,7 +7239,7 @@ void wfmain::on_meter2selectionCombo_activated(int index) funcs oldCmd = meterKindToMeterCommand(oldMeterType); //removePeriodicCommand(oldCmd); - if (oldCmd != funcSMeter) + if (oldCmd != funcSMeter && oldCmd != funcNone) queue->del(oldCmd); @@ -7793,8 +7251,7 @@ void wfmain::on_meter2selectionCombo_activated(int index) ui->meter2Widget->show(); ui->meter2Widget->setMeterType(newMeterType); if((newMeterType!=meterRxAudio) && (newMeterType!=meterTxMod) && (newMeterType!=meterAudio)) - queue->add(priorityHigh,queueItem(newCmd,true)); - //insertPeriodicCommandUnique(newCmd); + queue->add(priorityHighest,queueItem(newCmd,true)); } prefs.meter2Type = newMeterType; @@ -8079,8 +7536,14 @@ void wfmain::on_underlayAverageBuffer_toggled(bool checked) void wfmain::on_debugBtn_clicked() { qInfo(logSystem()) << "Debug button pressed."; - qDebug(logSystem()) << "Query for repeater access mode (tone, tsql, etc) sent."; - issueDelayedCommand(cmdGetRptAccessMode); + //qDebug(logSystem()) << "Query for repeater access mode (tone, tsql, etc) sent."; + //issueDelayedCommand(cmdGetRptAccessMode); + debugWindow* debug = new debugWindow(); + debug->setAttribute(Qt::WA_DeleteOnClose); + debug->show(); + + + } // ---------- color helper functions: ---------- // @@ -9272,7 +8735,6 @@ void wfmain::on_pollTimeMsSpin_valueChanged(int timing_ms) void wfmain::changePollTiming(int timing_ms, bool setUI) { queue->interval(timing_ms); - delayedCommand->setInterval(timing_ms); qInfo(logSystem()) << "User changed radio polling interval to " << timing_ms << "ms."; showStatusBarText("User changed radio polling interval to " + QString("%1").arg(timing_ms) + "ms."); prefs.polling_ms = timing_ms; @@ -9313,6 +8775,8 @@ void wfmain::connectionHandler(bool connect) delete memWindow; memWindow = Q_NULLPTR; } + // Also clear the queue + queue->clear(); } @@ -9340,54 +8804,64 @@ void wfmain::on_memoriesBtn_clicked() if (memWindow == Q_NULLPTR) { // Add slowload option for background loading. memWindow = new memories(rigCaps,false,this); - this->memWindow->connect(rig, 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) { queue->add(priorityImmediate,queueItem(funcMemoryContents,QVariant::fromValue(mem)));}); + this->memWindow->connect(this->memWindow, &memories::getMemory, rig,[=](const quint32 &mem) { + queue->add(priorityImmediate,queueItem(funcMemoryContents,QVariant::fromValue(mem))); + }); - this->memWindow->connect(this->memWindow, &memories::getSatMemory, rig, - [=](const quint32 &mem) { queue->add(priorityImmediate,queueItem(funcSatelliteMemory,QVariant::fromValue(mem & 0xffff)));}); + this->memWindow->connect(this->memWindow, &memories::getSatMemory, rig, [=](const quint32 &mem) { + queue->add(priorityImmediate,queueItem(funcSatelliteMemory,QVariant::fromValue(mem & 0xffff))); + }); - this->memWindow->connect(this->memWindow, &memories::setMemory, rig, - [=](const memoryType &mem) { - issueCmd(cmdSetMemory, mem); - if (mem.sat) - queue->add(priorityImmediate,queueItem(funcSatelliteMemory,QVariant::fromValue(mem.channel & 0xffff))); - else - queue->add(priorityImmediate,queueItem(funcMemoryContents,QVariant::fromValue(uint((mem.group << 16) | (mem.channel & 0xffff))))); - }); + this->memWindow->connect(this->memWindow, &memories::setMemory, rig, [=](const memoryType &mem) { + if (mem.sat) + queue->add(priorityImmediate,queueItem(funcSatelliteMemory,QVariant::fromValue(mem.channel & 0xffff))); + else + queue->add(priorityImmediate,queueItem(funcMemoryContents,QVariant::fromValue(uint((mem.group << 16) | (mem.channel & 0xffff))))); + }); - this->memWindow->connect(this->memWindow, &memories::clearMemory, rig, - [=](const quint32 &mem) { issueCmd(cmdClearMemory, mem);}); + this->memWindow->connect(this->memWindow, &memories::clearMemory, rig, [=](const quint32 &mem) { + queue->add(priorityImmediate,queueItem(funcMemoryContents,QVariant::fromValue(mem))); + }); - this->memWindow->connect(this->memWindow, &memories::recallMemory, rig, - [=](const quint32 &mem) { queue->add(priorityImmediate,queueItem(funcMemoryMode,QVariant::fromValue(mem))); }); + this->memWindow->connect(this->memWindow, &memories::recallMemory, rig, [=](const quint32 &mem) { + queue->add(priorityImmediate,queueItem(funcMemoryMode,QVariant::fromValue(mem))); + }); - this->memWindow->connect(this->memWindow, &memories::setBand, rig, - [=](const char &band) { queue->add(priorityImmediate,queueItem(funcBandStackReg,QVariant::fromValue(band)));}); + this->memWindow->connect(this->memWindow, &memories::setBand, rig, [=](const char &band) { + queue->add(priorityImmediate,queueItem(funcBandStackReg,QVariant::fromValue(band))); + }); - this->memWindow->connect(this->memWindow, &memories::memoryMode, rig, - [=]() { queue->add(priorityImmediate,funcMemoryMode); - removeSlowPeriodicCommand(cmdGetFreqB);}); + this->memWindow->connect(this->memWindow, &memories::memoryMode, rig, [=]() { + queue->add(priorityImmediate,funcMemoryMode); + queue->del((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqGet)); + queue->del((rigCaps.commands.contains(funcSelectedMode)?funcSelectedMode:funcModeGet)); + queue->del((rigCaps.commands.contains(funcUnselectedFreq)?funcUnselectedFreq:funcNone)); + queue->del((rigCaps.commands.contains(funcUnselectedMode)?funcUnselectedMode:funcNone)); + }); - this->memWindow->connect(this->memWindow, &memories::vfoMode, rig, - [this]() { issueCmd(cmdSelVFO, vfo_t::vfoA); - if (rigCaps.commands.contains(funcVFOBSelect)) insertSlowPeriodicCommand(cmdGetFreqB, 128);}); - - this->memWindow->connect(this->memWindow, &memories::setSatelliteMode, rig, - [this](const bool &en) { - issueCmd(cmdSetSatelliteMode, en); - if (en) { - removeSlowPeriodicCommand(cmdGetMode); - removeSlowPeriodicCommand(cmdGetFreq); - removeSlowPeriodicCommand(cmdGetFreqB); - } else { - insertSlowPeriodicCommand(cmdGetMode,128); - insertSlowPeriodicCommand(cmdGetFreq,128); - if (rigCaps.commands.contains(funcVFOBSelect)) insertSlowPeriodicCommand(cmdGetFreqB,128); - } - }); + this->memWindow->connect(this->memWindow, &memories::vfoMode, rig, [this]() { + queue->addUnique(priorityMedium,(rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqGet),true); + queue->addUnique(priorityMedium,(rigCaps.commands.contains(funcSelectedMode)?funcSelectedMode:funcModeGet),true); + queue->addUnique(priorityMedium,(rigCaps.commands.contains(funcUnselectedFreq)?funcUnselectedFreq:funcNone),true); + queue->addUnique(priorityMedium,(rigCaps.commands.contains(funcUnselectedMode)?funcUnselectedMode:funcNone),true); + }); + this->memWindow->connect(this->memWindow, &memories::setSatelliteMode, rig, [this](const bool &en) { + queue->add(priorityImmediate,queueItem(funcSatelliteMode,QVariant::fromValue(en))); + if (en) { + queue->del((rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqGet)); + queue->del((rigCaps.commands.contains(funcSelectedMode)?funcSelectedMode:funcModeGet)); + queue->del((rigCaps.commands.contains(funcUnselectedFreq)?funcUnselectedFreq:funcNone)); + queue->del((rigCaps.commands.contains(funcUnselectedMode)?funcUnselectedMode:funcNone)); + } else { + queue->addUnique(priorityMedium,(rigCaps.commands.contains(funcSelectedFreq)?funcSelectedFreq:funcFreqGet),true); + queue->addUnique(priorityMedium,(rigCaps.commands.contains(funcSelectedMode)?funcSelectedMode:funcModeGet),true); + queue->addUnique(priorityMedium,(rigCaps.commands.contains(funcUnselectedFreq)?funcUnselectedFreq:funcNone),true); + queue->addUnique(priorityMedium,(rigCaps.commands.contains(funcUnselectedMode)?funcUnselectedMode:funcNone),true); + } + }); memWindow->populate(); // Call populate to get the initial memories } @@ -9401,11 +8875,6 @@ void wfmain::on_memoriesBtn_clicked() } } -void wfmain::receiveMemory(memoryType mem) -{ - Q_UNUSED(mem) -} - void wfmain::on_rigCreatorBtn_clicked() { rigCreator* create = new rigCreator(); @@ -9504,3 +8973,343 @@ void wfmain::uDevEvent() #endif #endif + + +void wfmain::receiveValue(cacheItem val){ + + + switch (val.command) + { + case funcFreqGet: + case funcfreqTR: + case funcSelectedFreq: + case funcUnselectedFreq: + { + freqt f = val.value.value(); + if (f.VFO == activeVFO) + receiveFreq(f); + break; + } + case funcReadTXFreq: + break; + case funcVFODualWatch: + // Not currently used, but will report the current dual-watch status + break; + case funcModeGet: + case funcModeTR: + case funcSelectedMode: + case funcUnselectedMode: + receiveMode(val.value.value()); + break; + case funcSatelliteMemory: + case funcMemoryContents: + emit haveMemory(val.value.value()); + break; + case funcMemoryClear: + case funcMemoryKeyer: + case funcMemoryToVFO: + case funcMemoryWrite: + break; + case funcScanning: + break; + case funcReadFreqOffset: + break; + case funcSplitStatus: + break; + case funcDuplexStatus: + break; + case funcTuningStep: + receiveTuningStep(val.value.value()); + break; + case funcAttenuator: + receiveAttenuator(val.value.value()); + break; + case funcAntenna: + receiveAntennaSel(val.value.value().antenna,val.value.value().rx); + break; + case funcAfGain: + receiveAfGain(val.value.value()); + break; + case funcRfGain: + receiveRfGain(val.value.value()); + break; + case funcSquelch: + receiveSql(val.value.value()); + break; + case funcAPFLevel: + break; + case funcNRLevel: + receiveNRLevel(val.value.value()); + break; + case funcPBTInner: + receivePBTInner(val.value.value()); + break; + case funcPBTOuter: + receivePBTOuter(val.value.value()); + break; + case funcIFShift: + receiveIFShift(val.value.value()); + break; + case funcCwPitch: + receiveCwPitch(val.value.value()); + break; + case funcRFPower: + receiveTxPower(val.value.value()); + break; + case funcMicGain: + processModLevel(inputMic,val.value.value()); + break; + case funcKeySpeed: + // Only used by CW window + break; + case funcNotchFilter: + break; + case funcCompressorLevel: + receiveCompLevel(val.value.value()); + break; + case funcBreakInDelay: + break; + case funcNBLevel: + receiveNBLevel(val.value.value()); + break; + case funcDigiSelShift: + break; + case funcDriveGain: + break; + case funcMonitorGain: + receiveMonitorGain(val.value.value()); + break; + case funcVoxGain: + break; + case funcAntiVoxGain: + break; + // 0x15 Meters + case funcSMeterSqlStatus: + break; + case funcSMeter: + receiveMeter(meterKind::meterS,val.value.value()); + break; + case funcVariousSql: + break; + case funcOverflowStatus: + break; + case funcCenterMeter: + receiveMeter(meterKind::meterCenter,val.value.value()); + break; + case funcPowerMeter: + receiveMeter(meterKind::meterPower,val.value.value()); + break; + case funcSWRMeter: + receiveMeter(meterKind::meterSWR,val.value.value()); + break; + case funcALCMeter: + receiveMeter(meterKind::meterALC,val.value.value()); + break; + case funcCompMeter: + receiveMeter(meterKind::meterComp,val.value.value()); + break; + case funcVdMeter: + receiveMeter(meterKind::meterVoltage,val.value.value()); + break; + case funcIdMeter: + receiveMeter(meterKind::meterCurrent,val.value.value()); + break; + // 0x16 enable/disable functions: + case funcPreamp: + receivePreamp(val.value.value()); + break; + case funcAGCTime: + break; + case funcNoiseBlanker: + receiveNB(val.value.value()); + break; + case funcAudioPeakFilter: + break; + case funcNoiseReduction: + receiveNR(val.value.value()); + break; + case funcAutoNotch: + break; + case funcRepeaterTone: + break; + case funcRepeaterTSQL: + break; + case funcRepeaterDTCS: + case funcRepeaterCSQL: + break; + case funcCompressor: + receiveComp(val.value.value()); + break; + case funcMonitor: + receiveMonitor(val.value.value()); + break; + case funcVox: + break; + case funcManualNotch: + break; + case funcDigiSel: + break; + case funcTwinPeakFilter: + break; + case funcDialLock: + break; + case funcRXAntenna: + ui->rxAntennaCheck->setChecked(val.value.value()); + break; + case funcDSPIFFilter: + break; + case funcNotchWidth: + break; + case funcSSBBandwidth: + break; + case funcMainSubTracking: + break; + case funcToneSquelchType: + break; + case funcIPPlus: + break; + // 0x17 is CW send and 0x18 is power control (no reply) + // 0x19 it automatically added. + case funcTransceiverId: + break; + // 0x1a + case funcBandStackReg: + break; + case funcFilterWidth: + receivePassband(val.value.value()); + break; + case funcDataModeWithFilter: + receiveDataModeStatus(val.value.value().data,val.value.value().filter); + break; + case funcAFMute: + break; + // 0x1a 0x05 various registers! + case funcREFAdjust: + break; + case funcREFAdjustFine: + //break; + case funcACCAModLevel: + processModLevel(inputACCA,val.value.value()); + break; + case funcACCBModLevel: + processModLevel(inputACCB,val.value.value()); + break; + case funcUSBModLevel: + processModLevel(inputUSB,val.value.value()); + break; + case funcSPDIFModLevel: + processModLevel(inputSPDIF,val.value.value()); + break; + case funcLANModLevel: + processModLevel(inputLAN,val.value.value()); + break; + case funcDATAOffMod: + receiveModInput(val.value.value(), 0); + break; + case funcDATA1Mod: + receiveModInput(val.value.value(), 1); + break; + case funcDATA2Mod: + receiveModInput(val.value.value(), 2); + break; + case funcDATA3Mod: + receiveModInput(val.value.value(), 3); + break; + case funcDashRatio: + break; + // 0x1b register + case funcToneFreq: + break; + case funcTSQLFreq: + break; + case funcDTCSCode: + break; + case funcCSQLCode: + break; + // 0x1c register + case funcRitStatus: + break; + case funcTransceiverStatus: + receivePTTstatus(val.value.value()); + break; + case funcTunerStatus: + break; + // 0x21 RIT: + case funcRITFreq: + break; + // 0x27 + case funcScopeWaveData: + { + scopeData d = val.value.value(); + receiveSpectrumData(d.data,d.startFreq,d.endFreq); + break; + } + case funcScopeOnOff: + // confirming scope is on + break; + case funcScopeDataOutput: + // confirming output enabled/disabled of wf data. + break; + case funcScopeMainSub: + // This tells us whether we are receiving main or sub data + break; + case funcScopeSingleDual: + // This tells us whether we are receiving single or dual scopes + break; + case funcScopeCenterFixed: + // fixed or center + // [1] 0x14 + // [2] 0x00 + // [3] 0x00 (center), 0x01 (fixed), 0x02, 0x03 + break; + case funcScopeCenterSpan: + { + // read span in center mode + // [1] 0x15 + // [2] to [8] is spastatic_cast(payloadIn.at(2)n encoded as a frequency + //emit haveScopeSpan(parseFrequency(payloadIn, 6), static_cast(payloadIn.at(2))); + break; + } + case funcScopeEdgeNumber: + // read edge mode center in edge mode + // [1] 0x16 + // [2] 0x01, 0x02, 0x03: Edge 1,2,3 + break; + case funcScopeHold: + // Hold status (only 9700?) + break; + case funcScopeRef: + { + // scope reference level + // [1] 0x19 + // [2] 0x00 + // [3] 10dB digit, 1dB digit + // [4] 0.1dB digit, 0 + // [5] 0x00 = +, 0x01 = - + break; + } + case funcScopeSpeed: + case funcScopeDuringTX: + case funcScopeCenterType: + case funcScopeVBW: + case funcScopeFixedFreq: + case funcScopeRBW: + break; + // 0x28 + case funcVoiceTX: + break; + //0x29 - Prefix certain commands with this to get/set certain values without changing current VFO + // If we use it for get commands, need to parse the \x29\x first. + case funcMainSubPrefix: + break; + default: + qWarning(logSystem()) << "Unhandled command received from rigcommander()" << funcString[val.command] << "Contact support!"; + break; + } + + + +} + + + diff --git a/wfmain.h b/wfmain.h index bba8570..f48110e 100644 --- a/wfmain.h +++ b/wfmain.h @@ -48,6 +48,7 @@ #include "cluster.h" #include "audiodevices.h" #include "sidebandchooser.h" +#include "debugWindow.h" #include #include @@ -171,8 +172,8 @@ signals: void getAfGain(); void getSql(); void getIfShift(); - void getTPBFInner(); - void getTPBFOuter(); + void getPBTInner(); + void getPBTOuter(); void getTxPower(); void getMicGain(); void getSpectrumRefLevel(); @@ -202,12 +203,12 @@ signals: void setAfGain(unsigned char level); void setSql(unsigned char level); void setIFShift(unsigned char level); - void setTPBFInner(unsigned char level); - void setTPBFOuter(unsigned char level); + void setPBTInner(unsigned char level); + void setPBTOuter(unsigned char level); void setIFShiftWindow(unsigned char level); - void setTPBFInnerWindow(unsigned char level); - void setTPBFOuterWindow(unsigned char level); + void setPBTInnerWindow(unsigned char level); + void setPBTOuterWindow(unsigned char level); void setMicGain(unsigned char); void setCompLevel(unsigned char); void setTxPower(unsigned char); @@ -300,7 +301,11 @@ signals: void setFrequencyRange(double low, double high); void sendControllerRequest(USBDEVICE* dev, usbFeatureType request, int val=0, QString text="", QImage* img=Q_NULLPTR, QColor* color=Q_NULLPTR); + // Signals to forward incoming data onto other areas + void haveMemory(memoryType mem); + private slots: + void receiveValue(cacheItem val); void setAudioDevicesUI(); void updateSizes(int tabIndex); void shortcutF1(); @@ -345,54 +350,48 @@ private slots: void receiveCommReady(); void receiveFreq(freqt); - void receiveMode(unsigned char mode, unsigned char filter); + void receiveMode(mode_info mode); void receiveSpectrumData(QByteArray spectrum, double startFreq, double endFreq); void receiveSpectrumMode(spectrumMode spectMode); void receiveSpectrumSpan(freqt freqspan, bool isSub); void handleScopeOutOfRange(bool outOfRange); void receivePTTstatus(bool pttOn); - void receiveDataModeStatus(bool dataOn); + void receiveDataModeStatus(unsigned char data, unsigned char filter); void receiveBandStackReg(freqt f, char mode, char filter, bool dataOn); // freq, mode, (filter,) datamode void receiveRITStatus(bool ritEnabled); void receiveRITValue(int ritValHz); - void receiveModInput(inputTypes input, bool dataOn); + void receiveModInput(rigInput input, unsigned char data); //void receiveDuplexMode(duplexMode dm); void receivePassband(quint16 pass); void receiveMonitorGain(unsigned char pass); void receiveNBLevel(unsigned char pass); void receiveNRLevel(unsigned char pass); void receiveCwPitch(unsigned char pitch); - void receiveTPBFInner(unsigned char level); - void receiveTPBFOuter(unsigned char level); + void receivePBTInner(unsigned char level); + void receivePBTOuter(unsigned char level); void receiveVox(bool en); void receiveMonitor(bool en); void receiveComp(bool en); void receiveNB(bool en); void receiveNR(bool en); void receiveTuningStep(unsigned char step); - void receiveMemory(memoryType mem); // Levels: void receiveRfGain(unsigned char level); void receiveAfGain(unsigned char level); void receiveSql(unsigned char level); void receiveIFShift(unsigned char level); - void receiveTBPFInner(unsigned char level); - void receiveTBPFOuter(unsigned char level); + // 'change' from data in transceiver controls window: void changeIFShift(unsigned char level); - void changeTPBFInner(unsigned char level); - void changeTPBFOuter(unsigned char level); + void changePBTInner(unsigned char level); + void changePBTOuter(unsigned char level); void receiveTxPower(unsigned char power); void receiveMicGain(unsigned char gain); void receiveCompLevel(unsigned char compLevel); void receiveVoxGain(unsigned char voxGain); void receiveAntiVoxGain(unsigned char antiVoxGain); void receiveSpectrumRefLevel(int level); - void receiveACCGain(unsigned char level, unsigned char ab); - void receiveUSBGain(unsigned char level); - void receiveLANGain(unsigned char level); - // Meters: void receiveMeter(meterKind meter, unsigned char level); @@ -419,7 +418,6 @@ private slots: void handleWFDoubleClick(QMouseEvent *); void handleWFScroll(QWheelEvent *); void handlePlotScroll(QWheelEvent *); - void sendRadioCommandLoop(); void showStatusBarText(QString text); void receiveBaudRate(quint32 baudrate); void radioSelection(QList radios); @@ -518,6 +516,10 @@ private slots: void on_afGainSlider_valueChanged(int value); + void on_monitorSlider_valueChanged(int value); + + void on_monitorCheck_clicked(bool checked); + void on_tuneNowBtn_clicked(); void on_tuneEnableChk_clicked(bool checked); @@ -572,7 +574,7 @@ private slots: void on_modeFilterCombo_activated(int index); - void on_dataModeBtn_toggled(bool checked); + void on_datamodeCombo_activated(int index); void on_transmitBtn_clicked(); @@ -1003,43 +1005,6 @@ private: unsigned char setModeVal=0; unsigned char setFilterVal=0; - - std::deque delayedCmdQue; // rapid commands from user interaction - std::deque periodicCmdQueue; // rapid que for metering - std::deque slowPollCmdQueue; // slow, regular checking for UI sync - std::deque rapidPollCmdQueue; // rapid regular polling for non-meter actions - void doCmd(cmds cmd); - void doCmd(commandtype cmddata); - - bool rapidPollCmdQueueEnabled = false; - - void issueCmd(cmds cmd, freqt f); - void issueCmd(cmds cmd, mode_info m); - void issueCmd(cmds cmd, vfo_t v); - void issueCmd(cmds cmd, rptrTone_t t); - void issueCmd(cmds cmd, rptrAccessData_t rd); - void issueCmd(cmds cmd, timekind t); - void issueCmd(cmds cmd, datekind d); - void issueCmd(cmds cmd, int i); - void issueCmd(cmds cmd, unsigned char c); - void issueCmd(cmds cmd, char c); - void issueCmd(cmds cmd, bool b); - void issueCmd(cmds cmd, quint16 c); - void issueCmd(cmds cmd, quint32 c); - void issueCmd(cmds cmd, qint16 c); - void issueCmd(cmds cmd, QString s); - void issueCmd(cmds cmd, memoryType s); - - // These commands pop_front and remove similar commands: - void issueCmdUniquePriority(cmds cmd, bool b); - void issueCmdUniquePriority(cmds cmd, unsigned char c); - void issueCmdUniquePriority(cmds cmd, char c); - void issueCmdUniquePriority(cmds cmd, freqt f); - void issueCmdUniquePriority(cmds cmd, quint16 c); - void issueCmdUniquePriority(cmds cmd, qint16 c); - - void removeSimilarCommand(cmds cmd); - qint64 lastFreqCmdTime_ms; int pCmdNum = 0; @@ -1091,6 +1056,11 @@ private: void setColorButtonOperations(QColor *colorStore, QLineEdit *e, QLedLabel *d); void setColorLineEditOperations(QColor *colorStore, QLineEdit *e, QLedLabel *d); + void calculateTimingParameters(); + void initPeriodicCommands(); + void changePollTiming(int timing_ms, bool setUI=false); + + void detachSettingsTab(); void reattachSettingsTab(); void prepareSettingsWindow(); @@ -1108,9 +1078,6 @@ private: void setUIFreq(); void changeTxBtn(); - void issueDelayedCommand(cmds cmd); - void issueDelayedCommandPriority(cmds cmd); - void issueDelayedCommandUnique(cmds cmd); void changeSliderQuietly(QSlider *slider, int value); void statusFromSliderPercent(QString name, int percentValue); void statusFromSliderRaw(QString name, int rawValue); @@ -1119,29 +1086,13 @@ private: void processChangingCurrentModLevel(unsigned char level); - void changeModLabel(inputTypes source); - void changeModLabel(inputTypes source, bool updateLevel); + void changeModLabel(rigInput source); + void changeModLabel(rigInput source, bool updateLevel); - void changeModLabelAndSlider(inputTypes source); - - void initPeriodicCommands(); - // Fast command queue for S-Meter: - void insertPeriodicCommand(cmds cmd, unsigned char priority); - void insertPeriodicCommandUnique(cmds cmd); - void removePeriodicCommand(cmds cmd); - // Fast command queue for other functions: - void insertPeriodicRapidCmd(cmds cmd); - void insertPeriodicRapidCmdUnique(cmds cmd); - void removePeriodicRapidCmd(cmds cmd); - - - void insertSlowPeriodicCommand(cmds cmd, unsigned char priority); - void removeSlowPeriodicCommand(cmds cmd); - void calculateTimingParameters(); - void changePollTiming(int timing_ms, bool setUI=false); + void changeModLabelAndSlider(rigInput source); void changeMode(mode_kind mode); - void changeMode(mode_kind mode, bool dataOn); + void changeMode(mode_kind mode, unsigned char data); void connectionHandler(bool connect); @@ -1153,22 +1104,19 @@ private: QHash rigList; rigCapabilities rigCaps; - inputTypes currentModSrc = inputUnknown; - inputTypes currentModDataSrc = inputUnknown; - mode_kind currentMode = modeUSB; - mode_info currentModeInfo; + + rigInput currentModDataOffSrc = rigInput(inputUnknown); + rigInput currentModData1Src = rigInput(inputUnknown); + rigInput currentModData2Src = rigInput(inputUnknown); + rigInput currentModData3Src = rigInput(inputUnknown); + + mode_kind currentMode = modeUnknown; + mode_info currentModeInfo = mode_info(); bool haveRigCaps; bool amTransmitting = false; bool splitModeEnabled = false; - bool usingDataMode = false; - - unsigned char micGain=0; - unsigned char accAGain=0; - unsigned char accBGain=0; - unsigned char accGain=0; - unsigned char usbGain=0; - unsigned char lanGain=0; + unsigned char usingDataMode = 99; // Set to invalid value initially // Widgets and Special Windows: calibrationWindow *cal = Q_NULLPTR; @@ -1211,8 +1159,8 @@ private: rigstate* rigState = Q_NULLPTR; passbandActions passbandAction = passbandStatic; - double TPBFInner = 0.0; - double TPBFOuter = 0.0; + double PBTInner = 0.0; + double PBTOuter = 0.0; double passbandCenterFrequency = 0.0; double pbtDefault = 0.0; quint16 cwPitch = 600; @@ -1240,7 +1188,6 @@ private: QSocketNotifier* uDevNotifier = nullptr; #endif #endif - memories* memWindow = Q_NULLPTR; dxClusterClient* cluster = Q_NULLPTR; QThread* clusterThread = Q_NULLPTR; @@ -1290,6 +1237,8 @@ Q_DECLARE_METATYPE(enum usbFeatureType) Q_DECLARE_METATYPE(enum cmds) Q_DECLARE_METATYPE(rigTypedef) Q_DECLARE_METATYPE(struct memoryType) +Q_DECLARE_METATYPE(struct antennaInfo) +Q_DECLARE_METATYPE(struct scopeData) //void (*wfmain::logthistext)(QString text) = NULL; diff --git a/wfmain.ui b/wfmain.ui index b527169..d57b53a 100644 --- a/wfmain.ui +++ b/wfmain.ui @@ -6,8 +6,8 @@ 0 0 - 1042 - 660 + 1063 + 569 @@ -489,15 +489,15 @@ - - - Data Mode Enable - + - Data + Data: + + + @@ -535,18 +535,40 @@ 0 + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 0 + 20 + + + + + + + 0 + 0 + + 0 - 70 + 100 16777215 - 80 + 16777215 @@ -579,6 +601,22 @@ + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + @@ -586,18 +624,40 @@ 0 + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + 0 + 0 + + 0 - 70 + 100 16777215 - 80 + 16777215 @@ -630,6 +690,22 @@ + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + @@ -637,18 +713,40 @@ 0 + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + 0 + 0 + + 0 - 70 + 100 16777215 - 80 + 16777215 @@ -681,6 +779,22 @@ + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + @@ -688,18 +802,40 @@ 0 + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + 0 + 0 + + 0 - 70 + 100 16777215 - 80 + 16777215 @@ -732,6 +868,22 @@ + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + @@ -739,18 +891,40 @@ 0 + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + 0 + 0 + + 0 - 70 + 100 16777215 - 80 + 16777215 @@ -783,6 +957,22 @@ + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + @@ -790,18 +980,40 @@ 0 + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + 0 + 0 + + 0 - 70 + 100 16777215 - 80 + 16777215 @@ -843,6 +1055,22 @@ + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + @@ -850,18 +1078,40 @@ 0 + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + 0 + 0 + + 0 - 70 + 100 16777215 - 80 + 16777215 @@ -897,6 +1147,22 @@ + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + @@ -907,18 +1173,40 @@ 0 + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + 0 + 0 + + 0 - 70 + 100 16777215 - 80 + 16777215 @@ -954,6 +1242,22 @@ + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + @@ -970,18 +1274,40 @@ 0 + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + 0 + 0 + + 0 - 70 + 100 16777215 - 80 + 16777215 @@ -1008,6 +1334,99 @@ + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + + 0 + 0 + + + + + 0 + 100 + + + + + 16777215 + 16777215 + + + + Set the rado monitor level + + + 255 + + + Qt::Vertical + + + + + + + + 16777215 + 15 + + + + Mon + + + + + + + + 25 + 25 + + + + + + + @@ -2258,7 +2677,7 @@ - 0 + 2 @@ -3483,7 +3902,7 @@ Please use the "Radio Server" page to select server audio 0 0 - 579 + 824 254 @@ -5562,7 +5981,7 @@ Please use the "Radio Server" page to select server audio 0 0 - 1042 + 1063 22 @@ -5590,8 +6009,8 @@ Please use the "Radio Server" page to select server audio + - diff --git a/wfview.pro b/wfview.pro index 04957f0..662dd09 100644 --- a/wfview.pro +++ b/wfview.pro @@ -233,6 +233,7 @@ SOURCES += main.cpp\ cachingqueue.cpp \ cwsender.cpp \ cwsidetone.cpp \ + debugwindow.cpp \ loggingwindow.cpp \ memories.cpp \ rigcreator.cpp \ @@ -276,6 +277,7 @@ HEADERS += wfmain.h \ commhandler.h \ cwsender.h \ cwsidetone.h \ + debugwindow.h \ loggingwindow.h \ memories.h \ prefs.h \ @@ -325,6 +327,7 @@ HEADERS += wfmain.h \ FORMS += wfmain.ui \ calibrationwindow.ui \ cwsender.ui \ + debugwindow.ui \ loggingwindow.ui \ memories.ui \ rigcreator.ui \ diff --git a/wfviewtypes.h b/wfviewtypes.h index 02a883d..cd8ba04 100644 --- a/wfviewtypes.h +++ b/wfviewtypes.h @@ -117,17 +117,38 @@ struct rptrAccessData_t { }; struct mode_info { - mode_info() {}; + mode_info () {}; mode_info(mode_kind mk, quint8 reg, QString name, bool bw): mk(mk), reg(reg), name(name),bw(bw) {}; - mode_kind mk; - unsigned char reg; - unsigned char filter; + mode_kind mk=modeUnknown; + unsigned char reg=99; + unsigned char filter=1; // Default filter is always 1 selVFO_t VFO = activeVFO; - bool data = false; - QString name; - bool bw; // Can the bandwidth of the current filter be changed? + unsigned char data = 0; + QString name=""; + bool bw=false; // Can the bandwidth of the current filter be changed? + quint16 pass = 0; }; +struct antennaInfo { + quint8 antenna; + bool rx; +}; + +struct scopeData { + bool valid=false; + QByteArray data; + bool mainSub; + uchar mode; + bool oor; + double startFreq; + double endFreq; +}; + +struct toneInfo { + quint16 tone=0; + bool tinv=false; + bool rinv=false; +}; enum breakIn_t { brkinOff = 0x00, @@ -154,41 +175,41 @@ struct timekind { }; enum cmds { - cmdNone, cmdGetRigID, cmdGetRigCIV, cmdGetFreq, cmdGetFreqB, cmdSetFreq, cmdGetMode, cmdSetMode, - cmdGetDataMode, cmdSetModeFilter, cmdSetDataModeOn, cmdSetDataModeOff, cmdGetRitEnabled, cmdGetRitValue, - cmdSpecOn, cmdSpecOff, cmdDispEnable, cmdDispDisable, cmdGetRxGain, cmdSetRxRfGain, cmdGetAfGain, cmdSetAfGain, - cmdGetSql, cmdSetSql, cmdGetIFShift, cmdSetIFShift, cmdGetNRLevel, cmdSetNRLevel, cmdGetTPBFInner, cmdSetTPBFInner, - cmdGetTPBFOuter, cmdSetTPBFOuter, cmdGetPassband, cmdSetPassband, cmdGetNBLevel, cmdSetNBLevel, - cmdGetCompLevel, cmdSetCompLevel, cmdGetTuningStep, cmdSetTuningStep, - cmdGetMonitorGain, cmdSetMonitorGain, cmdGetVoxGain, cmdSetVoxGain, cmdGetAntiVoxGain, cmdSetAntiVoxGain, - cmdGetCwPitch, cmdGetPskTone, cmdGetRttyMark, cmdSetCwPitch, cmdSetPskTone, cmdSetRttyMark, - cmdGetVox,cmdSetVox, cmdGetMonitor,cmdSetMonitor, cmdGetComp, cmdSetComp, cmdGetNB, cmdSetNB, cmdGetNR, cmdSetNR, - cmdSetATU, cmdStartATU, cmdGetATUStatus, - cmdGetSpectrumMode, cmdGetSpectrumSpan, cmdScopeCenterMode, cmdScopeFixedMode, - cmdGetPTT, cmdSetPTT,cmdPTTToggle, - cmdGetTxPower, cmdSetTxPower, cmdGetMicGain, cmdSetMicGain, cmdGetModLevel, cmdSetModLevel, - cmdGetSpectrumRefLevel, cmdGetDuplexMode, cmdGetModInput, cmdGetModDataInput, - cmdGetCurrentModLevel, cmdStartRegularPolling, cmdStopRegularPolling, cmdQueNormalSpeed, - cmdGetVdMeter, cmdGetIdMeter, cmdGetSMeter, cmdGetCenterMeter, cmdGetPowerMeter, - cmdGetSWRMeter, cmdGetALCMeter, cmdGetCompMeter, cmdGetTxRxMeter, - cmdGetTone, cmdGetTSQL, cmdGetToneEnabled, cmdGetTSQLEnabled, cmdGetDTCS, - cmdSetToneEnabled, cmdSetTSQLEnabled, cmdGetRptAccessMode, cmdSetTone, cmdSetTSQL, - cmdSetRptAccessMode, cmdSetRptDuplexOffset, cmdGetRptDuplexOffset, - cmdSelVFO, cmdVFOSwap, cmdVFOEqualAB, cmdVFOEqualMS, cmdSetQuickSplit, - cmdGetPreamp, cmdGetAttenuator, cmdGetAntenna, - cmdGetBandStackReg, cmdGetKeySpeed, cmdSetKeySpeed, cmdGetBreakMode, cmdSetBreakMode, cmdSendCW, cmdStopCW, cmdGetDashRatio, cmdSetDashRatio, - cmdSetTime, cmdSetDate, cmdSetUTCOffset, - cmdGetTransceive, cmdSetTransceive,cmdGetPower,cmdSetPower, - cmdGetMemory, cmdGetSatMemory, cmdSetMemory, cmdClearMemory,cmdRecallMemory, cmdSetVFOMode, cmdSetMemoryMode, cmdSetSatelliteMode, - // Below Only used for USB Controller at the moment. - cmdSetBandUp, cmdSetBandDown, cmdSetModeUp, cmdSetModeDown, cmdSetStepUp, cmdSetStepDown, - cmdSetSpanUp, cmdSetSpanDown, cmdIFFilterUp, cmdIFFilterDown, cmdPageDown, cmdPageUp, - cmdLCDWaterfall, cmdLCDSpectrum, cmdLCDNothing, cmdSeparator +cmdNone, cmdGetRigID, cmdGetRigCIV, cmdGetFreq, cmdGetFreqB, cmdSetFreq, cmdGetMode, cmdSetMode, +cmdGetDataMode, cmdSetModeFilter, cmdSetDataModeOn, cmdSetDataModeOff, cmdGetRitEnabled, cmdGetRitValue, +cmdSpecOn, cmdSpecOff, cmdDispEnable, cmdDispDisable, cmdGetRxGain, cmdSetRxRfGain, cmdGetAfGain, cmdSetAfGain, +cmdGetSql, cmdSetSql, cmdGetIFShift, cmdSetIFShift, cmdGetNRLevel, cmdSetNRLevel, cmdGetPBTInner, cmdSetPBTInner, +cmdGetPBTOuter, cmdSetPBTOuter, cmdGetPassband, cmdSetPassband, cmdGetNBLevel, cmdSetNBLevel, +cmdGetCompLevel, cmdSetCompLevel, cmdGetTuningStep, cmdSetTuningStep, +cmdGetMonitorGain, cmdSetMonitorGain, cmdGetVoxGain, cmdSetVoxGain, cmdGetAntiVoxGain, cmdSetAntiVoxGain, +cmdGetCwPitch, cmdGetPskTone, cmdGetRttyMark, cmdSetCwPitch, cmdSetPskTone, cmdSetRttyMark, +cmdGetVox,cmdSetVox, cmdGetMonitor,cmdSetMonitor, cmdGetComp, cmdSetComp, cmdGetNB, cmdSetNB, cmdGetNR, cmdSetNR, +cmdSetATU, cmdStartATU, cmdGetATUStatus, +cmdGetSpectrumMode, cmdGetSpectrumSpan, cmdScopeCenterMode, cmdScopeFixedMode, +cmdGetPTT, cmdSetPTT,cmdPTTToggle, +cmdGetTxPower, cmdSetTxPower, cmdGetMicGain, cmdSetMicGain, cmdGetModLevel, cmdSetModLevel, +cmdGetSpectrumRefLevel, cmdGetDuplexMode, cmdGetModInput, cmdGetModDataInput, +cmdGetCurrentModLevel, cmdStartRegularPolling, cmdStopRegularPolling, cmdQueNormalSpeed, +cmdGetVdMeter, cmdGetIdMeter, cmdGetSMeter, cmdGetCenterMeter, cmdGetPowerMeter, +cmdGetSWRMeter, cmdGetALCMeter, cmdGetCompMeter, cmdGetTxRxMeter, +cmdGetTone, cmdGetTSQL, cmdGetToneEnabled, cmdGetTSQLEnabled, cmdGetDTCS, +cmdSetToneEnabled, cmdSetTSQLEnabled, cmdGetRptAccessMode, cmdSetTone, cmdSetTSQL, +cmdSetRptAccessMode, cmdSetRptDuplexOffset, cmdGetRptDuplexOffset, +cmdSelVFO, cmdVFOSwap, cmdVFOEqualAB, cmdVFOEqualMS, cmdSetQuickSplit, +cmdGetPreamp, cmdGetAttenuator, cmdGetAntenna, +cmdGetBandStackReg, cmdGetKeySpeed, cmdSetKeySpeed, cmdGetBreakMode, cmdSetBreakMode, cmdSendCW, cmdStopCW, cmdGetDashRatio, cmdSetDashRatio, +cmdSetTime, cmdSetDate, cmdSetUTCOffset, +cmdGetTransceive, cmdSetTransceive,cmdGetPower,cmdSetPower, +cmdGetMemory, cmdGetSatMemory, cmdSetMemory, cmdClearMemory,cmdRecallMemory, cmdSetVFOMode, cmdSetMemoryMode, cmdSetSatelliteMode, +// Below Only used for USB Controller at the moment. +cmdSetBandUp, cmdSetBandDown, cmdSetModeUp, cmdSetModeDown, cmdSetStepUp, cmdSetStepDown, +cmdSetSpanUp, cmdSetSpanDown, cmdIFFilterUp, cmdIFFilterDown, cmdPageDown, cmdPageUp, +cmdLCDWaterfall, cmdLCDSpectrum, cmdLCDNothing, cmdSeparator }; // funcs and funcString MUST match exactly (and NUMFUNCS must be updated) -#define NUMFUNCS 188 +#define NUMFUNCS 197 enum funcs { funcNone, funcfreqTR, funcModeTR, funcBandEdgeFreq, funcFreqGet, funcModeGet, funcFreqSet, // \x00 @@ -209,7 +230,7 @@ funcDSPIFFilter, funcNotchWidth, funcSSBBandwidth, funcMainSu funcToneSquelchType, funcIPPlus, funcSendCW, funcPowerControl, funcTransceiverId, funcFilterWidth, funcMemoryContents, funcBandStackReg, funcMemoryKeyer, funcIFFilterWidth, funcQuickDualWatch, funcQuickSplit, funcAutoRepeater, funcTunerStatus, funcTransverter, funcTransverterOffset, funcLockFunction, funcREFAdjust, -funcREFAdjustFine, funcACC1ModLevel, funcACC2ModLevel, funcUSBModLevel, funcLANModLevel, funcDATAOffMod, +funcREFAdjustFine, funcACCAModLevel, funcACCBModLevel, funcUSBModLevel, funcLANModLevel, funcSPDIFModLevel, funcDATAOffMod, funcDATA1Mod, funcDATA2Mod, funcDATA3Mod, funcCIVTransceive, funcTime, funcDate, funcUTCOffset, funcCLOCK2, funcCLOCK2UTCOffset, funcCLOCK2Name, funcDashRatio, funcScanSpeed, funcScanResume, funcRecorderMode, funcRecorderTX, funcRecorderRX, funcRecorderSplit, funcRecorderPTTAuto, @@ -217,14 +238,16 @@ funcRecorderPreRec, funcRXAntConnector, funcAntennaSelectMode, funcNBDept funcVOXVoiceDelay, funcAPFType, funcAPFTypeLevel, funcPSKTone, funcRTTYMarkTone, funcDataModeWithFilter, funcAFMute, funcToneFreq, funcTSQLFreq, funcDTCSCode, funcCSQLCode, funcTransceiverStatus, funcXFCStatus, funcReadTXFreq, funcCIVOutput, funcReadTXFreqs, funcReadUserTXFreqs, funcUserTXBandEdgeFreq, -funcRITFreq, funcRitStatus, funcRitTXStatus, funcMainSubFreq, funcMainSubMode, funcScopeWaveData, +funcRITFreq, funcRitStatus, funcRitTXStatus, funcSelectedFreq, funcSelectedMode, funcUnselectedFreq, +funcUnselectedMode, funcScopeWaveData, funcScopeOnOff, funcScopeDataOutput, funcScopeMainSub, funcScopeSingleDual, funcScopeCenterFixed, funcScopeCenterSpan, funcScopeEdgeNumber, funcScopeHold, funcScopeRef, funcScopeSpeed, funcScopeDuringTX, funcScopeCenterType, funcScopeVBW, funcScopeFixedFreq, funcScopeRBW, funcVoiceTX, funcMainSubPrefix, funcAFCSetting, -funcGPSTXMode, funcSatelliteMemory, funcGPSPosition, funcMemoryGroup, funcSelectVFO, funcFA, +funcGPSTXMode, funcSatelliteMemory, funcGPSPosition, funcMemoryGroup, funcSelectVFO, funcSeparator, +funcLCDWaterfall, funcLCDSpectrum, funcLCDNothing, funcPageUp, funcPageDown, funcFA, funcFB }; - + // Any changes to these strings WILL break rig definitions, add new ones to end. **Missing commas concatenate strings!** static QString funcString[] { "None", @@ -246,19 +269,21 @@ static QString funcString[] { "None", "Tone Squelch Type", "IP Plus Status", "Send CW", "Power Control", "Transceiver ID", "Filter Width", "Memory Contents", "Band Stacking Reg", "Memory Keyer", "IF Filter Width", "Quick Dual Watch", "Quick Split", "Auto Repeater Mode", "Tuner/ATU Status", "Transverter Function", "Transverter Offset", "Lock Function", "REF Adjust", -"REF Adjust Fine", "ACC1 Mod Level", "ACC2 Mod Level", "USB Mod Level", "LAN Mod Level", "Data Off Mod Input", +"REF Adjust Fine", "ACC1 Mod Level", "ACC2 Mod Level", "USB Mod Level", "LAN Mod Level", "SPDIF Mod Level", "Data Off Mod Input", "DATA1 Mod Input", "DATA2 Mod Input", "DATA3 Mod Input", "CIV Transceive", "System Time", "System Date", "UTC Offset", "CLOCK2 Setting", "CLOCK2 UTC Offset", "CLOCK 2 Name", "Dash Ratio", "Scanning Speed", "Scanning Resume", "Recorder Mode", "Recorder TX", "Recorder RX", "Recorder Split", "Recorder PTT Auto", "Recorder Pre Rec", "RX Ant Connector", "Antenna Select Mode", "NB Depth", "NB Width", "VOX Delay", "VOX Voice Delay", "APF Type", "APF Type Level", "PSK Tone", "RTTY Mark Tone", "Data Mode Filter", -"AF Mute Status", "Tone Frequency", "TSQL Frequency", "DTCS Code/Polarity", "CSQL Code", "Transceiver Status", +"AF Mute Status", "Tone Frequency", "TSQL Frequency", "DTCS Code/Polarity", "CSQL Code", "Transceiver Status", "XFC Status", "Read TX Freq", "CI-V Output", "Read TX Freqs", "Read User TX Freqs", "User TX Band Edge Freq", -"RIT Frequency", "RIT Status", "RIT TX Status", "Main/Sub Freq", "Main/Sub Mode", "Scope Wave Data", +"RIT Frequency", "RIT Status", "RIT TX Status", "Selected Freq", "Selected Mode", "Unselected Freq", +"Unselected Mode", "Scope Wave Data", "Scope On/Off", "Scope Data Output", "Scope Main/Sub", "Scope Single/Dual", "Scope Center Fixed", "Scope Center Span", "Scope Edge Number", "Scope Hold", "Scope Ref", "Scope Speed", "Scope During TX", "Scope Center Type", "Scope VBW", "Scope Fixed Freq", "Scope RBW", "Voice TX", "Main/Sub Prefix", "AFC Function", -"GPS TX Mode", "Satellite Memory", "GPS Position", "Memory Group", "(int)Select VFO", "Command Error FA", +"GPS TX Mode", "Satellite Memory", "GPS Position", "Memory Group", "-Select VFO", "-Seperator", +"-LCD Waterfall", "-LCD Spectrum", "-LCD Nothing", "-Page Up", "-Page Down", "Command Error FA", "Command OK FB" };