kopia lustrzana https://gitlab.com/eliggett/wfview
537 wiersze
17 KiB
C++
537 wiersze
17 KiB
C++
#ifndef RIGCOMMANDER_H
|
|
#define RIGCOMMANDER_H
|
|
|
|
#include <QObject>
|
|
#include <QMutexLocker>
|
|
#include <QSettings>
|
|
#include <QRegularExpression>
|
|
#include <QDebug>
|
|
|
|
#include "wfviewtypes.h"
|
|
#include "commhandler.h"
|
|
#include "pttyhandler.h"
|
|
#include "udphandler.h"
|
|
#include "rigidentities.h"
|
|
#include "repeaterattributes.h"
|
|
#include "freqmemory.h"
|
|
#include "tcpserver.h"
|
|
|
|
#include "rigstate.h"
|
|
|
|
// This file figures out what to send to the comm and also
|
|
// parses returns into useful things.
|
|
|
|
// 0xE1 is new default, 0xE0 was before.
|
|
// note: using a define because switch case doesn't even work with const unsigned char. Surprised me.
|
|
#define compCivAddr 0xE1
|
|
|
|
//#define DEBUG_PARSE // Enable to output Info messages every 10s with command parse timing.
|
|
|
|
typedef QHash<unsigned char, QString> rigTypedef;
|
|
|
|
class rigCommander : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit rigCommander(QObject* parent=nullptr);
|
|
explicit rigCommander(quint8 guid[GUIDLEN], QObject* parent = nullptr);
|
|
~rigCommander();
|
|
|
|
bool usingLAN();
|
|
|
|
quint8* getGUID();
|
|
|
|
public slots:
|
|
void process();
|
|
void commSetup(rigTypedef rigList, unsigned char rigCivAddr, QString rigSerialPort, quint32 rigBaudRate, QString vsp, quint16 tcp, quint8 wf);
|
|
void commSetup(rigTypedef rigList, unsigned char rigCivAddr, udpPreferences prefs, audioSetup rxSetup, audioSetup txSetup, QString vsp, quint16 tcp);
|
|
void closeComm();
|
|
void stateUpdated();
|
|
void setRTSforPTT(bool enabled);
|
|
|
|
// Power:
|
|
void powerOn();
|
|
void powerOff();
|
|
|
|
// Spectrum:
|
|
void enableSpectOutput();
|
|
void disableSpectOutput();
|
|
void enableSpectrumDisplay();
|
|
void disableSpectrumDisplay();
|
|
void setSpectrumBounds(double startFreq, double endFreq, unsigned char edgeNumber);
|
|
void setSpectrumMode(spectrumMode spectMode);
|
|
void getSpectrumCenterMode();
|
|
void getSpectrumMode();
|
|
void setSpectrumRefLevel(int level);
|
|
void getSpectrumRefLevel();
|
|
void getSpectrumRefLevel(unsigned char mainSub);
|
|
void setScopeSpan(char span);
|
|
void getScopeSpan(bool isSub);
|
|
void getScopeSpan();
|
|
|
|
void setScopeEdge(char edge);
|
|
void getScopeEdge();
|
|
void getScopeMode();
|
|
|
|
// Frequency, Mode, BSR:
|
|
void setFrequency(unsigned char vfo, freqt freq);
|
|
void getFrequency(unsigned char vfo);
|
|
void getFrequency();
|
|
void selectVFO(vfo_t vfo);
|
|
void equalizeVFOsAB();
|
|
void equalizeVFOsMS();
|
|
void exchangeVFOs();
|
|
void setMode(unsigned char mode, unsigned char modeFilter);
|
|
void setMode(mode_info);
|
|
void getMode();
|
|
void getMode(unsigned char vfo);
|
|
void setDataMode(bool dataOn, unsigned char filter);
|
|
void getDataMode();
|
|
void getTuningStep();
|
|
void setTuningStep(unsigned char step);
|
|
void getSplit();
|
|
void setSplit(bool splitEnabled);
|
|
void getBandStackReg(char band, char regCode);
|
|
void getRitEnabled();
|
|
void getRitValue();
|
|
void setRitValue(int ritValue);
|
|
void setRitEnable(bool ritEnabled);
|
|
void setPassband(quint16 pass);
|
|
|
|
// PTT, ATU, ATT, Antenna, and Preamp:
|
|
void getPTT();
|
|
void setPTT(bool pttOn);
|
|
void sendCW(QString textToSend);
|
|
void sendStopCW();
|
|
void startATU();
|
|
void setATU(bool enabled);
|
|
void getATUStatus();
|
|
void getAttenuator();
|
|
void getPreamp();
|
|
void getAntenna();
|
|
void setAttenuator(unsigned char att);
|
|
void setPreamp(unsigned char pre);
|
|
void setAntenna(unsigned char ant, bool rx);
|
|
void setNB(bool enabled);
|
|
void getNB();
|
|
void setNR(bool enabled);
|
|
void getNR();
|
|
void setAutoNotch(bool enabled);
|
|
void getAutoNotch();
|
|
void setToneEnabled(bool enabled);
|
|
void getToneEnabled();
|
|
void setToneSql(bool enabled);
|
|
void getToneSqlEnabled();
|
|
void setCompressor(bool enabled);
|
|
void getCompressor();
|
|
void setMonitor(bool enabled);
|
|
void getMonitor();
|
|
void setVox(bool enabled);
|
|
void getVox();
|
|
void setBreakIn(unsigned char type);
|
|
void getBreakIn();
|
|
void setKeySpeed(unsigned char wpm);
|
|
void getKeySpeed();
|
|
void setManualNotch(bool enabled);
|
|
void getManualNotch();
|
|
|
|
void getPassband();
|
|
void getNBLevel();
|
|
void getNRLevel(); void getCwPitch();
|
|
void setCwPitch(unsigned char pitch);
|
|
void getDashRatio();
|
|
void setDashRatio(unsigned char ratio);
|
|
void getPskTone();
|
|
void setPskTone(unsigned char tone);
|
|
void getRttyMark();
|
|
void setRttyMark(unsigned char mark);
|
|
|
|
// Repeater:
|
|
void setDuplexMode(duplexMode dm);
|
|
void getDuplexMode();
|
|
void setQuickSplit(bool qsOn);
|
|
void getTransmitFrequency();
|
|
void setTone(rptrTone_t t);
|
|
void setTSQL(rptrTone_t t);
|
|
void setTone(quint16 t);
|
|
void setTSQL(quint16 t);
|
|
void getTSQL();
|
|
void getTone();
|
|
void setDTCS(quint16 dcscode, bool tinv, bool rinv);
|
|
void getDTCS();
|
|
void setRptAccessMode(rptAccessTxRx ratr);
|
|
void setRptAccessMode(rptrAccessData_t ratr);
|
|
void getRptAccessMode();
|
|
void setRptDuplexOffset(freqt f);
|
|
void getRptDuplexOffset();
|
|
void setMemoryMode();
|
|
void getMemory(quint32 mem);
|
|
void getSatMemory(quint32 mem);
|
|
void setMemory(memoryType mem);
|
|
void clearMemory(quint32 mem);
|
|
void recallMemory(quint32 mem);
|
|
|
|
// Get Levels:
|
|
void getLevels(); // all supported levels
|
|
void getRfGain();
|
|
void getAfGain();
|
|
void getSql();
|
|
void getIFShift();
|
|
void getTPBFInner();
|
|
void getTPBFOuter();
|
|
void getTxLevel();
|
|
void getMicGain();
|
|
void getCompLevel();
|
|
void getMonitorGain();
|
|
void getVoxGain();
|
|
void getAntiVoxGain();
|
|
void getUSBGain();
|
|
void getLANGain();
|
|
void getACCGain();
|
|
void getACCGain(unsigned char ab);
|
|
void getModInput(bool dataOn);
|
|
void getModInputLevel(inputTypes input);
|
|
void getAfMute();
|
|
void getDialLock();
|
|
|
|
// Set Levels:
|
|
void setSquelch(unsigned char level);
|
|
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 setTxPower(unsigned char power);
|
|
void setMicGain(unsigned char gain);
|
|
void setUSBGain(unsigned char gain);
|
|
void setLANGain(unsigned char gain);
|
|
void setACCGain(unsigned char gain);
|
|
void setACCGain(unsigned char gain, unsigned char ab);
|
|
void setCompLevel(unsigned char compLevel);
|
|
void setMonitorGain(unsigned char monitorLevel);
|
|
void setVoxGain(unsigned char gain);
|
|
void setAntiVoxGain(unsigned char gain);
|
|
void setModInput(inputTypes input, bool dataOn);
|
|
void setModInputLevel(inputTypes input, unsigned char level);
|
|
void setAfMute(bool muteOn);
|
|
void setDialLock(bool lockOn);
|
|
void setNBLevel(unsigned char level);
|
|
void setNRLevel(unsigned char level);
|
|
|
|
// NB, NR, IP+:
|
|
void setIPP(bool enabled);
|
|
void getIPP();
|
|
// Maybe put some of these into a struct?
|
|
// setReceiverDSPParam(dspParam param);
|
|
//void getNRLevel();
|
|
//void getNREnabled();
|
|
//void getNBLevel();
|
|
//void getNBEnabled();
|
|
//void getNotchEnabled();
|
|
//void getNotchLevel();
|
|
//void setNotchEnabled(bool enabled);
|
|
//void setNotchLevel(unsigned char level);
|
|
|
|
|
|
// Meters:
|
|
void getSMeter();
|
|
void getCenterMeter();
|
|
void getRFPowerMeter();
|
|
void getSWRMeter();
|
|
void getALCMeter();
|
|
void getCompReductionMeter();
|
|
void getVdMeter();
|
|
void getIDMeter();
|
|
void getMeters(meterKind meter); // all supported meters per transmit or receive
|
|
|
|
// Rig ID and CIV:
|
|
void getRigID();
|
|
void findRigs();
|
|
void setRigID(unsigned char rigID);
|
|
void setCIVAddr(unsigned char civAddr);
|
|
|
|
// Calibration:
|
|
void getRefAdjustCourse();
|
|
void getRefAdjustFine();
|
|
void setRefAdjustCourse(unsigned char level);
|
|
void setRefAdjustFine(unsigned char level);
|
|
|
|
// Time and Date:
|
|
void setTime(timekind t);
|
|
void setDate(datekind d);
|
|
void setUTCOffset(timekind t);
|
|
|
|
|
|
// Satellite:
|
|
void setSatelliteMode(bool enabled);
|
|
void getSatelliteMode();
|
|
|
|
// UDP:
|
|
void handleNewData(const QByteArray& data);
|
|
void receiveAudioData(const audioPacket& data);
|
|
void handlePortError(errorType err);
|
|
void changeLatency(const quint16 value);
|
|
void dataFromServer(QByteArray data);
|
|
void receiveBaudRate(quint32 baudrate);
|
|
|
|
// Speech:
|
|
void sayFrequency();
|
|
void sayMode();
|
|
void sayAll();
|
|
|
|
// Housekeeping:
|
|
void handleStatusUpdate(const networkStatus status);
|
|
void handleNetworkAudioLevels(networkAudioLevels);
|
|
void radioSelection(QList<radio_cap_packet> radios);
|
|
void radioUsage(quint8 radio, quint8 busy, QString name, QString ip);
|
|
void setCurrentRadio(quint8 radio);
|
|
void sendState();
|
|
void getDebug();
|
|
|
|
signals:
|
|
// Communication:
|
|
void commReady();
|
|
void havePortError(errorType err);
|
|
void haveStatusUpdate(const networkStatus status);
|
|
void haveNetworkAudioLevels(const networkAudioLevels l);
|
|
void dataForComm(const QByteArray &outData);
|
|
void toggleRTS(bool rtsOn);
|
|
void setHalfDuplex(bool en);
|
|
|
|
// UDP:
|
|
void haveChangeLatency(quint16 value);
|
|
void haveDataForServer(QByteArray outData);
|
|
void haveAudioData(audioPacket data);
|
|
void initUdpHandler();
|
|
void haveSetVolume(unsigned char level);
|
|
void haveBaudRate(quint32 baudrate);
|
|
|
|
// Spectrum:
|
|
void haveSpectrumData(QByteArray spectrum, double startFreq, double endFreq); // pass along data to UI
|
|
void haveSpectrumBounds();
|
|
void haveScopeSpan(freqt span, bool isSub);
|
|
void haveSpectrumMode(spectrumMode spectmode);
|
|
void haveScopeEdge(char edge);
|
|
void haveSpectrumRefLevel(int level);
|
|
void haveScopeOutOfRange(bool outOfRange);
|
|
|
|
// Rig ID:
|
|
void haveRigID(rigCapabilities rigCaps);
|
|
void discoveredRigID(rigCapabilities rigCaps);
|
|
|
|
// Frequency, Mode, data, and bandstack:
|
|
void haveFrequency(freqt freqStruct);
|
|
void haveMode(unsigned char mode, unsigned char filter);
|
|
void haveDataMode(bool dataModeEnabled);
|
|
void haveBandStackReg(freqt f, char mode, char filter, bool dataOn);
|
|
void haveRitEnabled(bool ritEnabled);
|
|
void haveRitFrequency(int ritHz);
|
|
void havePassband(quint16 pass);
|
|
void haveCwPitch(unsigned char pitch);
|
|
void havePskTone(unsigned char tone);
|
|
void haveRttyMark(unsigned char mark);
|
|
void haveTuningStep(unsigned char step);
|
|
|
|
// Repeater:
|
|
void haveDuplexMode(duplexMode);
|
|
void haveRptAccessMode(rptAccessTxRx ratr);
|
|
void haveTone(quint16 tone);
|
|
void haveTSQL(quint16 tsql);
|
|
void haveDTCS(quint16 dcscode, bool tinv, bool rinv);
|
|
void haveRptOffsetFrequency(freqt f);
|
|
void haveMemory(memoryType mem);
|
|
|
|
// Levels:
|
|
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 haveIFShift(unsigned char level);
|
|
void haveTxPower(unsigned char level);
|
|
void haveMicGain(unsigned char level);
|
|
void haveCompLevel(unsigned char level);
|
|
void haveMonitorGain(unsigned char level);
|
|
void haveVoxGain(unsigned char gain);
|
|
void haveAntiVoxGain(unsigned char gain);
|
|
void haveNBLevel(unsigned char level);
|
|
void haveNRLevel(unsigned char level);
|
|
void haveVox(bool en);
|
|
void haveMonitor(bool en);
|
|
void haveComp(bool en);
|
|
void haveNB(bool en);
|
|
void haveNR(bool en);
|
|
|
|
// Modulation source and gain:
|
|
void haveModInput(inputTypes input, bool isData);
|
|
void haveLANGain(unsigned char gain);
|
|
void haveUSBGain(unsigned char gain);
|
|
void haveACCGain(unsigned char gain, unsigned char ab);
|
|
void haveModSrcGain(inputTypes input, unsigned char gain);
|
|
|
|
// Meters:
|
|
void haveMeter(meterKind meter, unsigned char level);
|
|
void haveSMeter(unsigned char level);
|
|
void haveRFMeter(unsigned char level);
|
|
void haveSWRMeter(unsigned char);
|
|
void haveALCMeter(unsigned char);
|
|
void haveCompMeter(unsigned char dbreduction);
|
|
void haveVdMeter(unsigned char voltage);
|
|
void haveIdMeter(unsigned char current);
|
|
|
|
// Calibration:
|
|
void haveRefAdjustCourse(unsigned char level);
|
|
void haveRefAdjustFine(unsigned char level);
|
|
|
|
// PTT and ATU:
|
|
void havePTTStatus(bool pttOn);
|
|
void haveATUStatus(unsigned char status);
|
|
void haveAttenuator(unsigned char att);
|
|
void havePreamp(unsigned char pre);
|
|
void haveAntenna(unsigned char ant,bool rx);
|
|
|
|
// CW:
|
|
void haveKeySpeed(unsigned char wpm);
|
|
void haveCWBreakMode(unsigned char bmode);
|
|
void haveDashRatio(unsigned char ratio);
|
|
|
|
|
|
// Rig State
|
|
void stateInfo(rigstate* state);
|
|
|
|
// Housekeeping:
|
|
void requestRadioSelection(QList<radio_cap_packet> radios);
|
|
void setRadioUsage(quint8 radio, quint8 busy, QString user, QString ip);
|
|
void selectedRadio(quint8 radio);
|
|
void getMoreDebug();
|
|
void finished();
|
|
|
|
private:
|
|
void setup();
|
|
QByteArray stripData(const QByteArray &data, unsigned char cutPosition);
|
|
void parseData(QByteArray data); // new data come here
|
|
void parseCommand(); // Entry point for complete commands
|
|
unsigned char bcdHexToUChar(unsigned char in);
|
|
unsigned char bcdHexToUChar(unsigned char hundreds, unsigned char tensunits);
|
|
unsigned int bcdHexToUInt(unsigned char hundreds, unsigned char tensunits);
|
|
QByteArray bcdEncodeInt(unsigned int);
|
|
void parseFrequency();
|
|
freqt parseFrequency(QByteArray data, unsigned char lastPosition); // supply index where Mhz is found
|
|
quint64 parseFreqDataToInt(QByteArray data);
|
|
freqt parseFrequencyRptOffset(QByteArray data);
|
|
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);
|
|
|
|
unsigned char audioLevelRxMean[50];
|
|
unsigned char audioLevelRxPeak[50];
|
|
unsigned char audioLevelTxMean[50];
|
|
unsigned char audioLevelTxPeak[50];
|
|
|
|
void parseMode(quint8 mode, quint8 filter);
|
|
void parseSpectrum();
|
|
void parseWFData();
|
|
void parseSpectrumRefLevel();
|
|
void parseDetailedRegisters1A05();
|
|
void parseRegisters1A();
|
|
void parseRegister1B();
|
|
void parseRegisters1C();
|
|
void parseRegister16();
|
|
void parseRegister21();
|
|
void parseBandStackReg();
|
|
void parsePTT();
|
|
void parseATU();
|
|
void parseLevels(); // register 0x14
|
|
bool getCommand(funcs func, QByteArray& payload, int value=INT_MIN);
|
|
QByteArray getLANAddr();
|
|
QByteArray getUSBAddr();
|
|
QByteArray getACCAddr(unsigned char ab);
|
|
void sendDataOut();
|
|
void prepDataAndSend(QByteArray data);
|
|
void debugMe();
|
|
void printHex(const QByteArray &pdata);
|
|
void printHex(const QByteArray &pdata, bool printVert, bool printHoriz);
|
|
mode_info createMode(mode_kind m, unsigned char reg, QString name, bool bw);
|
|
centerSpanData createScopeCenter(centerSpansType s, QString name);
|
|
|
|
commHandler* comm = Q_NULLPTR;
|
|
pttyHandler* ptty = Q_NULLPTR;
|
|
tcpServer* tcp = Q_NULLPTR;
|
|
udpHandler* udp=Q_NULLPTR;
|
|
QThread* udpHandlerThread = Q_NULLPTR;
|
|
|
|
void determineRigCaps();
|
|
QByteArray payloadIn;
|
|
QByteArray echoPerfix;
|
|
QByteArray replyPrefix;
|
|
QByteArray genericReplyPrefix;
|
|
|
|
QByteArray payloadPrefix;
|
|
QByteArray payloadSuffix;
|
|
|
|
QByteArray rigData;
|
|
|
|
QByteArray spectrumLine;
|
|
double spectrumStartFreq;
|
|
double spectrumEndFreq;
|
|
|
|
struct rigCapabilities rigCaps;
|
|
|
|
rigstate state;
|
|
|
|
bool haveRigCaps=false;
|
|
model_kind model;
|
|
quint8 spectSeqMax;
|
|
quint16 spectAmpMax;
|
|
quint16 spectLenMax;
|
|
spectrumMode oldScopeMode;
|
|
bool wasOutOfRange = false;
|
|
|
|
bool usingNativeLAN; // indicates using OEM LAN connection (705,7610,9700,7850)
|
|
bool lookingForRig;
|
|
bool foundRig;
|
|
|
|
double frequencyMhz;
|
|
unsigned char civAddr;
|
|
unsigned char incomingCIVAddr; // place to store the incoming CIV.
|
|
bool pttAllowed;
|
|
bool useRTSforPTT_isSet = false;
|
|
bool useRTSforPTT_manual = false;
|
|
|
|
|
|
QString rigSerialPort;
|
|
quint32 rigBaudRate;
|
|
|
|
QString ip;
|
|
int cport;
|
|
int sport;
|
|
int aport;
|
|
QString username;
|
|
QString password;
|
|
|
|
QString serialPortError;
|
|
unsigned char localVolume=0;
|
|
quint8 guid[GUIDLEN] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
|
|
QHash<unsigned char,QString> rigList;
|
|
|
|
quint64 pow10[12] = {
|
|
1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000, 100000000000
|
|
};
|
|
|
|
#ifdef DEBUG_PARSE
|
|
quint64 averageParseTime=0;
|
|
int numParseSamples = 0;
|
|
int lowParse=9999;
|
|
int highParse=0;
|
|
QTime lastParseReport = QTime::currentTime();
|
|
#endif
|
|
};
|
|
|
|
#endif // RIGCOMMANDER_H
|