S-Meter working! Power meter working!

Needs more testing, but it's here! 100ms polling time.
merge-requests/2/head
Elliott Liggett 2021-02-20 20:41:19 -08:00
rodzic 938a9f1d1b
commit c3e0fa7dbd
4 zmienionych plików z 234 dodań i 16 usunięć

Wyświetl plik

@ -890,9 +890,9 @@ void rigCommander::parseLevels()
// "INDEX: 00 01 02 03 04 "
// "DATA: 14 02 00 78 fd "
if(payloadIn[0] = '\x14')
if(payloadIn[0] == '\x14')
{
qDebug() <<__func__<< ": in payload[0] is 0x14";
switch(payloadIn[1])
{
case '\x01':
@ -901,7 +901,6 @@ void rigCommander::parseLevels()
break;
case '\x02':
// RX RF Gain
qDebug() << __func__ << ": RF Gain: " << level;
emit haveRfGain(level);
break;
case '\x03':
@ -941,38 +940,37 @@ void rigCommander::parseLevels()
return;
}
if(payloadIn[0] = '\x15')
if(payloadIn[0] == '\x15')
{
qDebug() <<__func__<< ": in payload[0] is 0x15";
switch(payloadIn[1])
{
case '\x02':
// S-Meter
emit haveSMeter(level);
emit haveMeter(meterS, level);
break;
case '\x11':
// RF-Power meter
emit haveRFMeter(level);
emit haveMeter(meterPower, level);
break;
case '\x12':
// SWR
emit haveSWRMeter(level);
emit haveMeter(meterSWR, level);
break;
case '\x13':
// ALC
emit haveALCMeter(level);
emit haveMeter(meterALC, level);
break;
case '\x14':
// COMP dB reduction
emit haveCompMeter(level);
emit haveMeter(meterComp, level);
break;
case '\x15':
// VD (12V)
emit haveVdMeter(level);
emit haveMeter(meterVoltage, level);
break;
case '\x16':
// ID
emit haveIdMeter(level);
emit haveMeter(meterCurrent, level);
break;
default:

Wyświetl plik

@ -15,7 +15,7 @@
// note: using a define because switch case doesn't even work with const unsigned char. Surprised me.
#define compCivAddr 0xE1
enum duplexMode{
enum duplexMode {
dmSplitOff=0x00,
dmSplitOn=0x01,
dmSimplex=0x10,
@ -26,6 +26,16 @@ enum duplexMode{
dmDupAutoOff=0x36
};
enum meterKind {
meterS,
meterSWR,
meterPower,
meterALC,
meterComp,
meterVoltage,
meterCurrent
};
class rigCommander : public QObject
{
Q_OBJECT
@ -170,6 +180,7 @@ signals:
void haveACCGain(unsigned char gain, unsigned char ab);
void haveModSrcGain(rigInput input, unsigned char gain);
void haveMeter(meterKind meter, unsigned char level);
void haveSMeter(unsigned char level);
void haveRFMeter(unsigned char level);
void haveSWRMeter(unsigned char);

Wyświetl plik

@ -272,11 +272,17 @@ wfmain::wfmain(const QString serialPortCL, const QString hostCL, QWidget *parent
delayedCommand->setSingleShot(true);
connect(delayedCommand, SIGNAL(timeout()), this, SLOT(runDelayedCommand()));
periodicPollingTimer = new QTimer(this);
periodicPollingTimer->setInterval(100);
periodicPollingTimer->setSingleShot(false);
connect(periodicPollingTimer, SIGNAL(timeout()), this, SLOT(runPeriodicCommands()));
openRig();
qRegisterMetaType<rigCapabilities>();
qRegisterMetaType<duplexMode>();
qRegisterMetaType<rigInput>();
qRegisterMetaType<meterKind>();
connect(rig, SIGNAL(haveFrequency(double)), this, SLOT(receiveFreq(double)));
connect(this, SIGNAL(getFrequency()), rig, SLOT(getFrequency()));
@ -352,6 +358,11 @@ wfmain::wfmain(const QString serialPortCL, const QString hostCL, QWidget *parent
connect(rig, SIGNAL(haveUSBGain(unsigned char)), this, SLOT(receiveUSBGain(unsigned char)));
connect(rig, SIGNAL(haveLANGain(unsigned char)), this, SLOT(receiveLANGain(unsigned char)));
//Metering:
connect(this, SIGNAL(getMeters(bool)), rig, SLOT(getMeters(bool)));
connect(rig, SIGNAL(haveMeter(meterKind,unsigned char)), this, SLOT(receiveMeter(meterKind,unsigned char)));
// Rig and ATU info:
connect(this, SIGNAL(startATU()), rig, SLOT(startATU()));
connect(this, SIGNAL(setATU(bool)), rig, SLOT(setATU(bool)));
connect(this, SIGNAL(getATUStatus()), rig, SLOT(getATUStatus()));
@ -381,8 +392,6 @@ wfmain::wfmain(const QString serialPortCL, const QString hostCL, QWidget *parent
connect(wf, SIGNAL(mouseWheel(QWheelEvent*)), this, SLOT(handleWFScroll(QWheelEvent*)));
connect(plot, SIGNAL(mouseWheel(QWheelEvent*)), this, SLOT(handlePlotScroll(QWheelEvent*)));
// Metering
connect(this, SIGNAL(getMeters(bool)), rig, SLOT(getMeters(bool)));
if (serverConfig.enabled && udp != Q_NULLPTR) {
// Server
@ -1253,6 +1262,7 @@ void wfmain:: getInitialRigState()
cmdOutQue.append(cmdGetModDataInput);
cmdOutQue.append(cmdNone);
cmdOutQue.append(cmdStartRegularPolling);
if(rigCaps.hasATU)
{
@ -1372,6 +1382,136 @@ void wfmain::setPlotTheme(QCustomPlot *plot, bool isDark)
}
}
void wfmain::runPeriodicCommands()
{
// These commands are run at a regular interval. They are to be used sparingly.
// For general radio state queries, use the runDelayedCommand() queue,
// accessed by the insertPeriodicCommands() function.
// To insert commands to this queue, uset the insertPeriodicCommands() function.
// TODO: Queue should not remove items, just hit a different item each time.
int nCmds = periodicCmdQueue.length();
cmds pcmd;
if(!periodicCmdQueue.isEmpty())
{
pcmd = periodicCmdQueue.at( (pCmdNum++)%nCmds );
switch(pcmd)
{
case cmdNone:
break;
// Metering commands:
case cmdGetRxLevels:
case cmdGetTxLevels:
emit getMeters(amTransmitting);
break;
case cmdGetSMeter:
break;
case cmdGetPowerMeter:
break;
case cmdGetALCMeter:
break;
case cmdGetCompMeter:
break;
case cmdGetRigID:
emit getRigID();
break;
case cmdGetRigCIV:
// if(!know rig civ already)
if(!haveRigCaps)
{
emit getRigCIV();
cmdOutQue.append(cmdGetRigCIV); // This way, we stay here until we get an answer.
}
break;
case cmdGetFreq:
emit getFrequency();
break;
case cmdGetMode:
emit getMode();
break;
case cmdGetDataMode:
// qDebug() << "Sending query for data mode";
emit getDataMode();
break;
case cmdSetDataModeOff:
emit setDataMode(false);
break;
case cmdSetDataModeOn:
emit setDataMode(true);
break;
case cmdGetModInput:
emit getModInput(false);
break;
case cmdGetModDataInput:
emit getModInput(true);
break;
case cmdGetCurrentModLevel:
emit getModInputLevel(currentModSrc);
emit getModInputLevel(currentModDataSrc);
break;
case cmdGetDuplexMode:
emit getDuplexMode();
break;
case cmdDispEnable:
emit scopeDisplayEnable();
break;
case cmdDispDisable:
emit scopeDisplayDisable();
break;
case cmdSpecOn:
emit spectOutputEnable();
break;
case cmdSpecOff:
emit spectOutputDisable();
break;
case cmdGetRxGain:
emit getRfGain();
break;
case cmdGetAfGain:
emit getAfGain();
break;
case cmdGetSql:
emit getSql();
break;
case cmdGetTxPower:
emit getTxPower();
break;
case cmdGetMicGain:
emit getMicGain();
break;
case cmdGetSpectrumRefLevel:
emit getSpectrumRefLevel();
break;
case cmdGetATUStatus:
emit getATUStatus();
break;
case cmdScopeCenterMode:
emit setScopeCenterMode(true);
break;
case cmdScopeFixedMode:
emit setScopeCenterMode(false);
break;
case cmdGetPTT:
emit getPTT();
break;
case cmdStartRegularPolling:
periodicPollingTimer->start();
break;
case cmdStopRegularPolling:
periodicPollingTimer->stop();
break;
default:
break;
}
}
}
void wfmain::runDelayedCommand()
{
cmds qdCmd;
@ -1481,6 +1621,12 @@ void wfmain::runDelayedCommand()
case cmdGetPTT:
emit getPTT();
break;
case cmdStartRegularPolling:
periodicPollingTimer->start();
break;
case cmdStopRegularPolling:
periodicPollingTimer->stop();
break;
default:
break;
}
@ -1600,6 +1746,28 @@ void wfmain::receiveRigID(rigCapabilities rigCaps)
// do all the initial grabs. For now, this hack of adding them here and there:
cmdOutQue.append(cmdGetFreq);
cmdOutQue.append(cmdGetMode);
initPeriodicCommands();
}
}
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.
insertPeriodicCommand(cmdGetRxLevels, 128);
insertPeriodicCommand(cmdGetTxLevels, 128);
}
void wfmain::insertPeriodicCommand(cmds cmd, unsigned char priority)
{
// TODO: meaningful priority
if(priority < 10)
{
periodicCmdQueue.prepend(cmd);
} else {
periodicCmdQueue.append(cmd);
}
}
@ -2880,6 +3048,31 @@ void wfmain::receiveLANGain(unsigned char level)
processModLevel(inputLAN, level);
}
void wfmain::receiveMeter(meterKind inMeter, unsigned char level)
{
switch(inMeter)
{
case meterS:
ui->levelIndicator->setValue((int)level);
break;
case meterSWR:
break;
case meterPower:
ui->levelIndicator->setValue((int)level);
break;
case meterALC:
break;
case meterComp:
break;
case meterCurrent:
break;
case meterVoltage:
break;
default:
break;
}
}
void wfmain::receiveCompLevel(unsigned char compLevel)
{
(void)compLevel;

Wyświetl plik

@ -181,6 +181,12 @@ private slots:
void receiveLANGain(unsigned char level);
// Meters:
void receiveMeter(meterKind meter, unsigned char level);
// void receiveSMeter(unsigned char level);
// void receivePowerMeter(unsigned char level);
// void receiveALCMeter(unsigned char level);
// void receiveCompMeter(unsigned char level);
void receiveATUStatus(unsigned char atustatus);
void receiveRigID(rigCapabilities rigCaps);
@ -194,6 +200,7 @@ private slots:
void handleWFScroll(QWheelEvent *);
void handlePlotScroll(QWheelEvent *);
void runDelayedCommand();
void runPeriodicCommands();
void showStatusBarText(QString text);
void serverConfigRequested(SERVERCONFIG conf, bool store);
@ -432,6 +439,7 @@ private:
QCPColorMapData * colorMapData;
QCPColorScale * colorScale;
QTimer * delayedCommand;
QTimer * periodicPollingTimer;
QTimer * pttTimer;
@ -464,9 +472,13 @@ private:
cmdSpecOn, cmdSpecOff, cmdDispEnable, cmdDispDisable, cmdGetRxGain, cmdGetAfGain,
cmdGetSql, cmdGetATUStatus, cmdScopeCenterMode, cmdScopeFixedMode, cmdGetPTT,
cmdGetTxPower, cmdGetMicGain, cmdGetSpectrumRefLevel, cmdGetDuplexMode, cmdGetModInput, cmdGetModDataInput,
cmdGetCurrentModLevel};
cmdGetCurrentModLevel, cmdStartRegularPolling, cmdStopRegularPolling, cmdGetRxLevels, cmdGetTxLevels,
cmdGetSMeter, cmdGetPowerMeter, cmdGetALCMeter, cmdGetCompMeter};
cmds cmdOut;
QVector <cmds> cmdOutQue;
QVector <cmds> periodicCmdQueue;
int pCmdNum = 0;
freqMemory mem;
struct colors {
QColor Dark_PlotBackground;
@ -540,6 +552,9 @@ private:
void changeModLabelAndSlider(rigInput source);
void initPeriodicCommands();
void insertPeriodicCommand(cmds cmd, unsigned char priority);
void changeMode(mode_kind mode);
void changeMode(mode_kind mode, bool dataOn);
@ -580,6 +595,7 @@ private:
Q_DECLARE_METATYPE(struct rigCapabilities)
Q_DECLARE_METATYPE(enum rigInput)
Q_DECLARE_METATYPE(enum duplexMode)
Q_DECLARE_METATYPE(enum meterKind)
#endif // WFMAIN_H