wfview/rigcommander.h

254 wiersze
7.9 KiB
C
Czysty Zwykły widok Historia

2018-06-19 19:58:52 +00:00
#ifndef RIGCOMMANDER_H
#define RIGCOMMANDER_H
#include <QObject>
#include <QMutexLocker>
2023-04-23 20:29:44 +00:00
#include <QSettings>
#include <QRegularExpression>
#include <QDebug>
2018-06-19 19:58:52 +00:00
#include "wfviewtypes.h"
2018-06-19 19:58:52 +00:00
#include "commhandler.h"
2021-03-04 20:19:05 +00:00
#include "pttyhandler.h"
#include "udphandler.h"
#include "rigidentities.h"
#include "repeaterattributes.h"
2021-05-27 13:20:53 +00:00
#include "freqmemory.h"
2022-03-23 10:12:42 +00:00
#include "tcpserver.h"
2023-05-11 23:24:01 +00:00
#include "cachingqueue.h"
2018-06-19 19:58:52 +00:00
// 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.
2023-04-27 18:56:25 +00:00
typedef QHash<unsigned char, QString> rigTypedef;
2018-06-19 19:58:52 +00:00
class rigCommander : public QObject
{
Q_OBJECT
public:
explicit rigCommander(QObject* parent=nullptr);
explicit rigCommander(quint8 guid[GUIDLEN], QObject* parent = nullptr);
2018-06-19 19:58:52 +00:00
~rigCommander();
bool usingLAN();
2022-01-26 09:49:52 +00:00
quint8* getGUID();
2018-06-19 19:58:52 +00:00
public slots:
void process();
2023-04-27 18:56:25 +00:00
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();
2022-01-04 18:34:34 +00:00
void setRTSforPTT(bool enabled);
2018-06-19 19:58:52 +00:00
// Power:
void powerOn();
void powerOff();
// Rig ID and CIV:
void getRigID();
void findRigs();
void setRigID(unsigned char rigID);
2018-06-19 19:58:52 +00:00
void setCIVAddr(unsigned char civAddr);
// UDP:
2021-02-28 20:10:07 +00:00
void handleNewData(const QByteArray& data);
void receiveAudioData(const audioPacket& data);
2023-01-05 19:37:53 +00:00
void handlePortError(errorType err);
void changeLatency(const quint16 value);
void dataFromServer(QByteArray data);
void receiveBaudRate(quint32 baudrate);
// Housekeeping:
void handleStatusUpdate(const networkStatus status);
void handleNetworkAudioLevels(networkAudioLevels);
void radioSelection(QList<radio_cap_packet> radios);
void radioUsage(quint8 radio, bool admin, quint8 busy, QString name, QString ip);
void setCurrentRadio(quint8 radio);
2018-06-19 19:58:52 +00:00
void getDebug();
void receiveCommand(funcs func, QVariant value, uchar receiver);
2023-11-26 16:29:22 +00:00
void setAfGain(unsigned char level);
2018-06-19 19:58:52 +00:00
signals:
// Communication:
void commReady();
2023-01-05 19:37:53 +00:00
void havePortError(errorType err);
void haveStatusUpdate(const networkStatus status);
void haveNetworkAudioLevels(const networkAudioLevels l);
void dataForComm(const QByteArray &outData);
void toggleRTS(bool rtsOn);
2023-05-08 12:26:45 +00:00
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
2018-06-19 19:58:52 +00:00
void haveSpectrumBounds();
void haveScopeSpan(freqt span, bool isSub);
2023-05-15 12:47:45 +00:00
void havespectrumMode_t(spectrumMode_t spectmode);
void haveScopeEdge(char edge);
// Rig ID:
void haveRigID(rigCapabilities rigCaps);
void discoveredRigID(rigCapabilities rigCaps);
// Repeater:
2023-05-15 12:47:45 +00:00
void haveDuplexMode(duplexMode_t);
void haveRptAccessMode(rptAccessTxRx_t ratr);
void haveTone(quint16 tone);
void haveTSQL(quint16 tsql);
void haveDTCS(quint16 dcscode, bool tinv, bool rinv);
void haveRptOffsetFrequency(freqt f);
2023-05-01 20:56:52 +00:00
void haveMemory(memoryType mem);
// Levels:
void haveAfGain(unsigned char level);
// Housekeeping:
void requestRadioSelection(QList<radio_cap_packet> radios);
void setRadioUsage(quint8 radio, bool admin, quint8 busy, QString user, QString ip);
void selectedRadio(quint8 radio);
void getMoreDebug();
void finished();
2023-05-15 09:53:52 +00:00
void haveReceivedValue(funcs func, QVariant value);
2018-06-19 19:58:52 +00:00
private:
2023-05-11 23:24:01 +00:00
void commonSetup();
2024-01-27 22:13:47 +00:00
2018-06-19 19:58:52 +00:00
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);
2023-05-11 23:24:01 +00:00
QByteArray bcdEncodeChar(unsigned char num);
QByteArray bcdEncodeInt(unsigned int);
2023-05-15 09:53:52 +00:00
QByteArray setMemory(memoryType mem);
freqt parseFrequency();
freqt parseFrequency(QByteArray data, unsigned char lastPosition); // supply index where Mhz is found
2023-09-22 18:06:09 +00:00
freqt parseFreqData(QByteArray data, uchar receiver);
quint64 parseFreqDataToInt(QByteArray data);
freqt parseFrequencyRptOffset(QByteArray data);
2023-05-15 09:53:52 +00:00
bool parseMemory(QVector<memParserFormat>* memParser, memoryType* mem);
QByteArray makeFreqPayloadRptOffset(freqt freq);
2018-06-19 19:58:52 +00:00
QByteArray makeFreqPayload(double frequency);
QByteArray makeFreqPayload(freqt freq);
QByteArray encodeTone(quint16 tone, bool tinv, bool rinv);
QByteArray encodeTone(quint16 tone);
2024-01-27 22:13:47 +00:00
2023-05-15 09:53:52 +00:00
toneInfo decodeTone(QByteArray eTone);
//quint16 decodeTone(QByteArray eTone, bool &tinv, bool &rinv);
uchar makeFilterWidth(ushort width, uchar receiver);
2023-05-11 23:24:01 +00:00
unsigned char audioLevelRxMean[50];
unsigned char audioLevelRxPeak[50];
unsigned char audioLevelTxMean[50];
unsigned char audioLevelTxPeak[50];
modeInfo parseMode(quint8 mode, quint8 filter, uchar receiver);
bool parseSpectrum(scopeData& d, uchar receiver);
2024-04-27 23:06:46 +00:00
funcType getCommand(funcs func, QByteArray& payload, int value=INT_MIN, uchar receiver=0);
2023-12-24 16:35:49 +00:00
QByteArray getLANAddr();
QByteArray getUSBAddr();
QByteArray getACCAddr(unsigned char ab);
2018-06-19 19:58:52 +00:00
void sendDataOut();
void prepDataAndSend(QByteArray data);
void debugMe();
void printHex(const QByteArray &pdata);
2018-06-19 19:58:52 +00:00
void printHex(const QByteArray &pdata, bool printVert, bool printHoriz);
2023-09-26 11:58:37 +00:00
centerSpanData createScopeCenter(centerSpansType s, QString name);
2021-03-04 20:19:05 +00:00
commHandler* comm = Q_NULLPTR;
pttyHandler* ptty = Q_NULLPTR;
2022-03-23 10:12:42 +00:00
tcpServer* tcp = Q_NULLPTR;
udpHandler* udp=Q_NULLPTR;
QThread* udpHandlerThread = Q_NULLPTR;
void determineRigCaps();
2018-06-19 19:58:52 +00:00
QByteArray payloadIn;
QByteArray echoPerfix;
QByteArray replyPrefix;
QByteArray genericReplyPrefix;
QByteArray payloadPrefix;
QByteArray payloadSuffix;
QByteArray rigData;
QByteArray spectrumLine;
//double spectrumStartFreq;
//double spectrumEndFreq;
2018-06-19 19:58:52 +00:00
struct rigCapabilities rigCaps;
2021-04-19 16:49:51 +00:00
2023-04-23 20:29:44 +00:00
bool haveRigCaps=false;
quint8 model = 0; // Was model_kind but that makes no sense when users can create their own rigs!
quint8 spectSeqMax;
quint16 spectAmpMax;
quint16 spectLenMax;
2023-05-15 12:47:45 +00:00
spectrumMode_t oldScopeMode;
bool usingNativeLAN; // indicates using OEM LAN connection (705,7610,9700,7850)
bool lookingForRig;
bool foundRig;
2018-06-19 19:58:52 +00:00
double frequencyMhz;
unsigned char civAddr;
unsigned char incomingCIVAddr; // place to store the incoming CIV.
2018-11-07 23:54:03 +00:00
bool pttAllowed;
2022-01-04 18:34:34 +00:00
bool useRTSforPTT_isSet = false;
bool useRTSforPTT_manual = false;
2023-09-23 10:37:55 +00:00
scopeData mainScopeData;
scopeData subScopeData;
2018-06-19 19:58:52 +00:00
QString rigSerialPort;
quint32 rigBaudRate;
QByteArray lastCommandToRig;
QString ip;
int cport;
int sport;
int aport;
QString username;
QString password;
QString serialPortError;
2022-01-04 18:34:34 +00:00
unsigned char localVolume=0;
2022-01-29 22:50:58 +00:00
quint8 guid[GUIDLEN] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
2023-04-23 20:29:44 +00:00
QHash<unsigned char,QString> rigList;
2018-06-19 19:58:52 +00:00
quint64 pow10[12] = {
1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000, 100000000000
};
2023-05-11 23:24:01 +00:00
cachingQueue* queue;
#ifdef DEBUG_PARSE
2023-04-23 20:29:44 +00:00
quint64 averageParseTime=0;
int numParseSamples = 0;
int lowParse=9999;
int highParse=0;
QTime lastParseReport = QTime::currentTime();
#endif
2018-06-19 19:58:52 +00:00
};
#endif // RIGCOMMANDER_H